زیادہ تر مالیاتی ماڈل تجزیہ کاروں کے اتفاق رائے کو ایک واحد مستقبل کے ان پٹ کے طور پر استعمال کرتے ہیں، جیسے کہ آمدنی کے تخمینے، EPS تخمینے، EBITDA تخمینے، یا مستقبل کے مارجن کے مفروضوں کے کچھ ورژن۔
یہ کام کرتا ہے، لیکن ڈیٹا کو چپٹا کرتا ہے۔
اوسط تخمینہ صرف رینج کا مرکز ہے۔ اس کے بعد عام طور پر کم تخمینہ، زیادہ تخمینہ، اور اس نظریے میں حصہ ڈالنے والے تجزیہ کاروں کی تعداد ہوتی ہے۔ دو کمپنیوں کا اوسط تخمینہ ایک جیسا ہو سکتا ہے، لیکن ان کے معاہدے کی ڈگری بہت مختلف ہو سکتی ہے۔
تو میں ایک سادہ خیال کی جانچ کرنا چاہتا تھا۔ کیا ہوگا اگر ہم اتفاق کو ایک عدد سمجھنا چھوڑ دیں اور اس کی شکل کو دیکھنا شروع کر دیں؟
یہ اسٹاک ریٹرن کی پیشن گوئی یا تجارتی سگنل بنانے کے بارے میں نہیں ہے۔ صرف یہ دیکھنے کے لیے چیک کریں کہ آیا تخمینوں کے ارد گرد کی حدود آپ کو بتاتی ہیں کہ تجزیہ کار اصل میں کہاں متفق نہیں ہیں۔
انڈیکس
شرطیں
اس کی پیروی کرنے کے لیے، آپ کو matplotlib کا استعمال کرتے ہوئے بنیادی Python، pandas DataFrames، لغات، loops، اور سادہ پلاٹنگ سے واقف ہونا چاہیے۔
آپ کو بھی ضرورت ہو گی:
-
Python 3.9 یا اس سے زیادہ
-
FMP API کلید
-
مندرجہ ذیل Python لائبریریاں:
requests,pandas,numpyاورmatplotlib -
تجزیہ کار کے تخمینوں، آمدنی، EPS، P/E طرز کی پیشن گوئی کے آدانوں اور تجزیہ کار کی کوریج کا بنیادی علم۔
مالی ماڈلنگ کے جدید علم کی ضرورت نہیں ہے۔ مقصد یہ بتانا ہے کہ تجزیہ کاروں کے تخمینوں کو ایک سادہ نمبر کے طور پر سمجھنے کے بجائے، کم، اوسط، زیادہ تخمینوں اور تجزیہ کاروں کی تعداد کس طرح اتفاق رائے کی کسی شکل کو ظاہر کر سکتی ہے۔
اس کی جانچ کرنے کے لیے ڈیٹا درکار ہے۔
اس کو صحیح طریقے سے جانچنے کے لیے، اوسط اندازے کافی نہیں تھے۔ تخمینوں کی مکمل رینج کی ضرورت تھی۔
ہر کمپنی کے لیے ہم چاہتے تھے:
-
منافع کم، اوسط، زیادہ
-
EPS کم، اوسط، زیادہ
-
کمائی کے تخمینے کے پیچھے کتنے تجزیہ کار ہیں؟
-
ہمارے EPS تخمینوں کی حمایت کرنے والے تجزیہ کاروں کی تعداد
یہ دو مفید آراء فراہم کرتا ہے۔ وسط توقع کے مرکز کی نمائندگی کرتا ہے۔ کم اور زیادہ تخمینوں سے ظاہر ہوتا ہے کہ توقعات کی حد کتنی وسیع ہے۔ تجزیہ کاروں کی تعداد سے اندازہ ہوتا ہے کہ اتفاق رائے کتنا گہرا ہے۔
میں بھی ایک مخلوط دنیا چاہتا تھا۔ اگر آپ کے نمونے میں صرف بڑے کیپ ٹیکنالوجی کے نام شامل ہیں، تو آپ کے نتائج بہت واضح ہو سکتے ہیں، کیونکہ آپ ان میں سے بہت سی کمپنیاں شامل کر سکتے ہیں۔ لہذا میں نے بڑے کیپ ٹیکنالوجی، سیمی کنڈکٹرز، توانائی، مالیات، صحت کی دیکھ بھال، صارفین کے نام، اور اعلی غیر یقینی ترقی کی کمپنیوں کا مرکب استعمال کیا۔
اپنے ڈیٹا ماخذ کے لیے، ہم نے FMP کے تجزیہ کار کے تخمینے کا ڈیٹا استعمال کیا کیونکہ یہ اس تجربے کے لیے درکار سب سے کم، سب سے زیادہ، اوسط، اور تجزیہ کار کی گنتی والے فیلڈز فراہم کرتا ہے۔
مخلوط دنیا میں تجزیہ کار کے تخمینے اخذ کرنا
میں نے بیس پیکج درآمد کرکے اور اسٹاک کائنات کی وضاحت کرکے شروعات کی۔
import requests
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
from time import sleep
api_key = 'YOUR FMP API KEY'
base_url="https://financialmodelingprep.com/stable"
tickers = [
'AAPL', 'MSFT', 'NVDA', 'AMZN', 'META', 'GOOGL',
'TSLA', 'PLTR', 'COIN', 'RBLX', 'SNOW', 'UBER',
'AMD', 'INTC', 'MU', 'AVGO', 'QCOM',
'CAT', 'DE', 'BA', 'GE', 'XOM', 'CVX',
'WMT', 'COST', 'NKE', 'SBUX', 'MCD', 'TGT',
'JPM', 'BAC', 'GS', 'MS', 'V', 'MA',
'UNH', 'PFE', 'LLY', 'MRK', 'ABBV',
'ROKU', 'SHOP', 'SQ', 'PYPL', 'ZM'
]
اگلا مرحلہ ہر ٹکر کے لیے سالانہ تجزیہ کار تخمینہ حاصل کرنا تھا۔ چونکہ تخمینے کے اختتامی پوائنٹس ایک سے زیادہ وقت کے وقفوں کو واپس کر سکتے ہیں اور کچھ دور کی مدت پوری طرح سے نہیں بھری جا سکتی ہے، ہم نے ہر کمپنی کے لیے دستیاب قریب ترین مستقبل کے تخمینے کی مدت کا استعمال کیا۔
all_rows = []
today = pd.Timestamp.today().normalize()
for ticker in tickers:
url = f'{base_url}/analyst-estimates'
params = {
'symbol': ticker,
'period': 'annual',
'limit': 10,
'apikey': api_key
}
response = requests.get(url, params=params)
data = response.json()
df = pd.DataFrame(data)
if len(df) == 0:
print(f'{ticker}: no data')
continue
df['date'] = pd.to_datetime(df['date'])
df = df.sort_values('date')
df = df[
(df['date'] > today) &
(df['revenueAvg'].notna()) &
(df['revenueLow'].notna()) &
(df['revenueHigh'].notna()) &
(df['epsAvg'].notna()) &
(df['epsLow'].notna()) &
(df['epsHigh'].notna())
].copy()
if len(df) == 0:
print(f'{ticker}: no usable future estimates')
continue
row = df.iloc[0].copy()
all_rows.append(row)
print(f'{ticker} done')
sleep(0.2)
estimates = pd.DataFrame(all_rows)
estimates.head()
آؤٹ پٹ نے فی کمپنی مستقبل کی پیشین گوئیوں کی ایک قابل استعمال قطار فراہم کی۔
یہ جدول پہلے سے ہی عام اوسط اندازوں سے زیادہ مفید ہے۔ یہ تخمینہ کا مرکز، اس کے ارد گرد کی حد، اور اس کے پیچھے تجزیہ کاروں کی تعداد دیتا ہے۔ اوسط کو ذخیرہ کرنے کے بجائے رقم کی شکل کی پیمائش شروع کرنا کافی ہے۔
تخمینہ کی حد کو اسپریڈ میٹرک میں تبدیل کرنا
ہمارے پاس اقتباس کا ڈیٹا آنے کے بعد، ہمیں پوری کمپنی میں اقتباس کی حدود کا موازنہ کرنے کا طریقہ درکار تھا۔
خام رینج کافی نہیں ہے۔ $10 بلین ریونیو رینج کا مطلب ایک کمپنی کے لیے بہت مختلف چیز ہے جو $50 بلین ریونیو کی توقع رکھتی ہے اس کمپنی کے مقابلے میں جو $500 بلین ریونیو کی توقع رکھتی ہے۔ لہذا ہم نے اوسط تخمینہ کی حد کو معمول بنایا۔
estimates['revenue_spread'] = ((estimates['revenueHigh'] - estimates['revenueLow']) / estimates['revenueAvg'])
estimates['eps_spread'] = ((estimates['epsHigh'] - estimates['epsLow']) / estimates['epsAvg'].abs())
shape_df = estimates[['symbol','date','revenueLow','revenueAvg','revenueHigh','revenue_spread','numAnalystsRevenue',
'epsLow','epsAvg','epsHigh','eps_spread','numAnalystsEps']].copy()
shape_df.head()

منطق سادہ ہے۔ revenue_spread یہ آپ کو بتاتا ہے کہ آمدنی کے تخمینے کی رینج اوسط آمدنی کے تخمینے کے مقابلے میں کتنی وسیع ہے۔ eps_spread EPS کے لئے بھی یہی ہے۔
تاہم، EPS کو مزید تصدیق کی ضرورت ہے۔ اگر اوسط EPS 0 کے قریب ہے، یہاں تک کہ عام تخمینہ کی حدیں بھی بڑے اسپریڈز کا نتیجہ ہو سکتی ہیں۔ اس کا مطلب یہ نہیں ہے کہ تجزیہ کار ہمیشہ بہت غیر یقینی ہوتے ہیں۔ کبھی کبھی اس کا مطلب ہوتا ہے کہ ڈینومینیٹر بہت چھوٹا ہے۔
لہذا میں نے اصل EPS کو پھیلاتے ہوئے پلاٹ بنانے کے لیے ایک صاف ستھرا ورژن بنایا۔
shape_df['eps_spread_clean'] = shape_df['eps_spread']
shape_df.loc[shape_df['epsAvg'].abs() < 1, 'eps_spread_clean'] = np.nan
shape_df.loc[shape_df['eps_spread_clean'] > 3, 'eps_spread_clean'] = np.nan
اس کے بعد ہم نے سب سے وسیع اور تنگ ترین حدود کی جانچ کی۔
shape_df.sort_values('revenue_spread', ascending=False)[
[
'symbol',
'revenueLow',
'revenueAvg',
'revenueHigh',
'revenue_spread',
'numAnalystsRevenue'
]
].head(10)

یہ پہلی علامت تھی کہ خیال مفید ہو سکتا ہے۔ اہم تجزیہ کار کوریج کے باوجود کچھ ناموں کی آمدنی کے وسیع تخمینے تھے۔ TSLA کے پاس اپنی آمدنی کے تخمینے کے پیچھے 35 تجزیہ کار تھے، NVDA کے پاس 39 اور INTC کے پاس 31 تھے، لیکن آمدنی کی حد اب بھی نسبتاً وسیع تھی۔
پھر ہم نے صاف شدہ EPS پھیلاؤ کو دیکھا۔
shape_df.sort_values('eps_spread_clean', ascending=False)[
[
'symbol',
'epsLow',
'epsAvg',
'epsHigh',
'eps_spread_clean',
'numAnalystsEps'
]
].head(10)

یہ تجزیہ مزید دلچسپ بناتا ہے۔ ریونیو اور ای پی ایس اسی طرح کام نہیں کرتے تھے۔ TSLA کی دونوں میں وسیع رینج تھی۔ SQ کے پاس بہت زیادہ EPS اسپریڈز تھے باوجود اس کے کہ اس کی کمائی کا پھیلاؤ بہت کم تھا۔ یہ کچھ مفید تجویز کرنا شروع کر رہا ہے۔ معاہدے میں اختلاف ماڈل کے کسی اور حصے میں ہو سکتا ہے۔
پہلا نقطہ نظر: تجزیہ کار کوریج معاہدے کی ضمانت نہیں دیتا۔
پہلی چیز جو میں جاننا چاہتا تھا وہ یہ تھا کہ کیا گہری تجزیہ کار کوریج خود بخود قریبی معاہدے کی طرف لے جاتی ہے۔
تو میں نے دو سادہ جہتوں کا استعمال کیا:
اس کے بعد ہم نے درمیانی حد کا استعمال کرتے ہوئے ڈیٹا کو تقسیم کیا۔ یہ سرکاری ماڈل نہیں ہے۔ یہ مختلف قسم کے اتفاق رائے کو الگ کرنے کا صرف ایک تیز طریقہ ہے۔
analyst_threshold = shape_df['numAnalystsRevenue'].median()
spread_threshold = shape_df['revenue_spread'].median()
analyst_threshold, spread_threshold

پھر میں نے کوریج بنائی اور بالٹیاں پھیلائیں۔
shape_df['coverage_bucket'] = np.where(
shape_df['numAnalystsRevenue'] >= analyst_threshold,
'high coverage',
'low coverage'
)
shape_df['spread_bucket'] = np.where(
shape_df['revenue_spread'] <= spread_threshold,
'low spread',
'high spread'
)
وہاں سے، ہر کمپنی چار آسان زمروں میں سے ایک میں آتی ہے:
conditions = [
(shape_df['coverage_bucket'] == 'high coverage') & (shape_df['spread_bucket'] == 'low spread'),
(shape_df['coverage_bucket'] == 'high coverage') & (shape_df['spread_bucket'] == 'high spread'),
(shape_df['coverage_bucket'] == 'low coverage') & (shape_df['spread_bucket'] == 'low spread'),
(shape_df['coverage_bucket'] == 'low coverage') & (shape_df['spread_bucket'] == 'high spread')
]
labels = [
'tight consensus',
'watched but uncertain',
'thin but stable',
'weak consensus'
]
shape_df['revenue_consensus_shape'] = np.select(conditions, labels)
تقسیم توقع سے زیادہ متوازن نکلی۔

یہ کارآمد تھا کیونکہ لیبل ایک واضح بالٹی میں نہیں ٹوٹے تھے۔ کائنات میں اصل میں اتفاق کی مختلف شکلیں تھیں۔
اس کے بعد ہم نے محصولات کی تقسیم کے لیے کوریج کا منصوبہ بنایا۔
plt.figure(figsize=(12, 7))
for label in shape_df['revenue_consensus_shape'].unique():
temp = shape_df[shape_df['revenue_consensus_shape'] == label]
plt.scatter(
temp['numAnalystsRevenue'],
temp['revenue_spread'],
s=80,
label=label,
alpha=0.8
)
plt.axvline(analyst_threshold, linestyle="--", linewidth=1)
plt.axhline(spread_threshold, linestyle="--", linewidth=1)
for i, row in shape_df.iterrows():
if row['revenue_spread'] > spread_threshold or row['numAnalystsRevenue'] > analyst_threshold:
plt.text(
row['numAnalystsRevenue'] + 0.3,
row['revenue_spread'],
row['symbol'],
fontsize=9
)
plt.title('Analyst Coverage vs Revenue Estimate Spread')
plt.xlabel('Number of Analysts Covering Revenue')
plt.ylabel('Revenue Estimate Spread')
plt.legend()
plt.show()

چارٹ کو دیکھیں تو ایک بات واضح ہو جاتی ہے۔ تجزیہ کاروں کی ایک وسیع رینج کا مطلب ہمیشہ قریبی معاہدہ نہیں ہوتا۔
MSFT، AAPL، MA، WMT، اور META سخت معاہدے کے علاقوں کے قریب ہیں۔ ان کے پاس زیادہ کوریج اور نسبتاً کم آمدنی کی حدیں تھیں۔
تاہم، TSLA، AVGO، NVDA، INTC، AMD، MU، اور GOOGL بھی بڑی تعداد میں شامل تھے، لیکن آمدنی کے تخمینے کی وسیع رینج کے ساتھ۔ یہ "مشاہدہ لیکن غیر یقینی" نام ہیں۔ مارکیٹ ان کو نظر انداز نہیں کرتا. تجزیہ کار اسے قریب سے دیکھ رہے ہیں، لیکن پیشین گوئیوں کا دائرہ اب بھی وسیع ہے۔
کمزور معاہدے کے علاقے بھی مفید تھے۔ CVX، XOM، اور COIN کی کوریج کم تھی اور بڑے کیپ اسٹاکس کے مقابلے میں واپسی کی وسیع رینج تھی۔ یہ ایک مختلف قسم کی غیر یقینی صورتحال ہے۔ یہ صرف اختلاف رائے نہیں ہے۔ اس بارے میں اختلاف ہے کہ تجزیہ نگاروں میں کم گہرائی ہے۔
یہ پہلا نقطہ نظر مددگار تھا، لیکن ہم نے پھر بھی صرف آمدنی کو دیکھا۔ اگلا سوال زیادہ دلچسپ تھا۔ کیا آمدنی، EPS، یا دونوں میں غیر یقینی صورتحال ہے؟
plot_df = shape_df.dropna(subset=['revenue_spread', 'eps_spread_clean']).copy()
plt.figure(figsize=(12, 7))
plt.scatter(
plot_df['revenue_spread'],
plot_df['eps_spread_clean'],
s=plot_df['numAnalystsRevenue'] * 3,
alpha=0.75
)
for i, row in plot_df.iterrows():
plt.text(
row['revenue_spread'] + 0.002,
row['eps_spread_clean'],
row['symbol'],
fontsize=9
)
plt.title('Revenue Estimate Spread vs EPS Estimate Spread')
plt.xlabel('Revenue Estimate Spread')
plt.ylabel('EPS Estimate Spread')
plt.show()

یہ ایک زیادہ مفید نقطہ نظر تھا.
چارٹ نے ظاہر کیا کہ اتفاق رائے کی غیر یقینی صورتحال تمام کمپنیوں کے لیے ایک ہی جگہ نہیں ہے۔ کچھ ناموں میں ریونیو اور EPS دونوں ایک ساتھ مل کر کلسٹر ہوتے ہیں۔ کچھ دونوں کے درمیان وسیع رینج تھے۔ اور کچھ کو بہت زیادہ مخصوص قسم کا اختلاف تھا۔
SQ سب سے واضح مثال تھی۔ آمدنی کا اسپریڈ کم تھا، لیکن EPS اسپریڈ زیادہ تھا۔ اس کا مطلب ہے کہ تجزیہ کار ریونیو سائیڈ کے مقابلے میں ریونیو سائیڈ کے بہت قریب ہیں۔
TSLA نے مخالف انتہا کا مظاہرہ کیا۔ چونکہ آمدنی اور EPS دونوں اسپریڈز وسیع تھے، اوسط اندازے ماڈل کے مختلف حصوں میں تضادات کو چھپا رہے تھے۔
اس وقت میں اسے ایک سادہ خرابی میں تبدیل کرنا چاہتا تھا۔ ایک بار پھر، یہ ایک رسمی رسک ماڈل نہیں ہے۔ میں نے صرف شکلوں کے درمیان واضح طور پر فرق کرنے کے لیے درمیانی حد کا استعمال کیا۔
revenue_spread_threshold = plot_df['revenue_spread'].median()
eps_spread_threshold = plot_df['eps_spread_clean'].median()
plot_df['revenue_uncertainty'] = np.where(
plot_df['revenue_spread'] <= revenue_spread_threshold,
'low revenue uncertainty',
'high revenue uncertainty'
)
plot_df['eps_uncertainty'] = np.where(
plot_df['eps_spread_clean'] <= eps_spread_threshold,
'low EPS uncertainty',
'high EPS uncertainty'
)
پھر ہم نے دو بالٹیوں کو چار مختلف پیشین گوئی کی شکلوں میں جوڑ دیا۔
conditions = [
(plot_df['revenue_uncertainty'] == 'low revenue uncertainty') & (plot_df['eps_uncertainty'] == 'low EPS uncertainty'),
(plot_df['revenue_uncertainty'] == 'low revenue uncertainty') & (plot_df['eps_uncertainty'] == 'high EPS uncertainty'),
(plot_df['revenue_uncertainty'] == 'high revenue uncertainty') & (plot_df['eps_uncertainty'] == 'low EPS uncertainty'),
(plot_df['revenue_uncertainty'] == 'high revenue uncertainty') & (plot_df['eps_uncertainty'] == 'high EPS uncertainty')
]
labels = [
'stable forecast shape',
'profitability uncertainty',
'top-line uncertainty',
'broad forecast uncertainty'
]
plot_df['forecast_shape'] = np.select(conditions, labels)
تقسیم حسب ذیل تھی:

یہ تقسیم پہلے سے زیادہ مفید تھی کیونکہ اس نے ظاہر کیا کہ تضادات کہاں ہیں۔
ایک مستحکم پیشن گوئی کی شکل کا مطلب ہے کہ آمدنی اور EPS دونوں کی حدود نسبتاً تنگ ہیں۔ منافع کی غیر یقینی صورتحال کا مطلب ہے کہ آمدنی کے تخمینے سخت ہیں، لیکن EPS کے تخمینے وسیع ہیں۔ اہم غیر یقینی صورتحال کا مطلب ہے کہ آمدنی کی حد وسیع ہے، جبکہ EPS نسبتاً کم ہے۔ وسیع پیشن گوئی کی غیر یقینی صورتحال کا مطلب ہے کہ دونوں اطراف وسیع ہیں۔
پھر میں نے مندرجہ ذیل لیبلز کا استعمال کرتے ہوئے وہی چارٹ دوبارہ تیار کیا:
plt.figure(figsize=(12, 7))
for label in plot_df['forecast_shape'].unique():
temp = plot_df[plot_df['forecast_shape'] == label]
plt.scatter(
temp['revenue_spread'],
temp['eps_spread_clean'],
s=temp['numAnalystsRevenue'] * 3,
label=label,
alpha=0.75
)
plt.axvline(revenue_spread_threshold, linestyle="--", linewidth=1)
plt.axhline(eps_spread_threshold, linestyle="--", linewidth=1)
for i, row in plot_df.iterrows():
if (
row['revenue_spread'] > revenue_spread_threshold or
row['eps_spread_clean'] > eps_spread_threshold
):
plt.text(
row['revenue_spread'] + 0.002,
row['eps_spread_clean'],
row['symbol'],
fontsize=9
)
plt.title('Revenue Uncertainty vs EPS Uncertainty')
plt.xlabel('Revenue Estimate Spread')
plt.ylabel('EPS Estimate Spread')
plt.legend()
plt.show()

یہ تجزیہ کا مرکزی چارٹ بن گیا۔
اوسط اندازے توقعات کے مرکز کو چھپاتے ہیں، لیکن یہ چارٹ ان کے ارد گرد کی ساخت کو ظاہر کرتا ہے۔ یہ پیشین گوئی کے کام کے بہاؤ میں اہم ہے۔ ماڈل کو سخت اور وسیع اتفاق رائے کے تخمینوں کے ساتھ ایسا سلوک نہیں کرنا چاہئے جیسے ان کے پاس ایک ہی سطح کا معاہدہ ہو۔
چند نام جو نمونہ کو واضح کرتے ہیں۔
پیشن گوئی کی قسم کے مطابق کمپنیوں کو گروپ کرنا پیٹرن کو پڑھنا آسان بناتا ہے۔
plot_df[
[
'symbol',
'revenue_spread',
'eps_spread_clean',
'numAnalystsRevenue',
'numAnalystsEps',
'forecast_shape'
]
].sort_values(['forecast_shape', 'eps_spread_clean'], ascending=[True, False])
جبکہ مکمل جدول مفید تھا، مضمون کے زیادہ اہم حصے ہر بالٹی کے لیے مثالیں ہیں۔
broad_uncertainty = final_view[
final_view['forecast_shape'] == 'broad forecast uncertainty'
].sort_values('eps_spread_pct', ascending=False)
broad_uncertainty.head(10)

TSLA ایک واضح آؤٹ لیر تھا۔ آمدنی کا تخمینہ پھیلاؤ تقریباً 21.8% تھا اور EPS اسپریڈ 104% سے زیادہ تھا۔ یہ ایک وسیع دائرہ کار نہیں ہے جو ایک لائن آئٹم کے ارد گرد مرکوز ہے۔ سب سے اوپر اور نیچے دونوں لائنوں پر رائے کے اختلافات ہیں.
CVX اور XOM بھی دلچسپ تھے، لیکن مختلف وجوہات کی بنا پر۔ ان کی آمدنی کی تقسیم بہت وسیع تھی، اور تجزیہ کار کی کوریج ہمارے نمونے میں بہت سے ٹیکنالوجی کے ناموں سے کم تھی۔ اس کا مطلب ہے کہ اس کا ایک مختلف نام اور معاہدے کی شکل ہے، جیسے کہ TSLA، جس کی کوریج گہری ہے لیکن پھر بھی اس میں تضادات باقی ہیں۔
ہم نے پھر منافع کی غیر یقینی بالٹی کو دیکھا۔
profitability_uncertainty = final_view[
final_view['forecast_shape'] == 'profitability uncertainty'
].sort_values('eps_spread_pct', ascending=False)
profitability_uncertainty

یہ تصوراتی طور پر سب سے زیادہ مفید بالٹی تھی۔
SQ کی آمدنی صرف 1.1% تھی، لیکن EPS کا پھیلاؤ تقریباً 73.8% تھا۔ یہ TSLA سے بہت مختلف نظر آتا ہے۔ یہاں، تجزیہ کار آمدنی کے معاملے میں ایک دوسرے کے بہت قریب ہیں لیکن آمدنی کے معاملے میں مزید۔
یہ ماڈلز کے لیے اہم ہے۔ اگر آپ صرف اوسط آمدنی کے تخمینوں اور اوسط EPS تخمینوں کو ذخیرہ کرتے ہیں، تو فرق غائب ہوجاتا ہے۔ جو ماڈل نہیں جانتا ہے وہ یہ ہے کہ جب کہ آمدنی کے تخمینے نسبتاً سخت ہیں، EPS تخمینوں میں بہت زیادہ تضاد ہے۔
SNOW اور PLTR نے ایک جیسے دکھائے، اگر انتہائی نہیں تو، پیٹرن۔ آمدنی کی توقعات نسبتاً ملتی جلتی تھیں، لیکن EPS کی توقعات کی حد وسیع تھی۔ اس کا مطلب خالص آمدنی میں اضافے کے بجائے منافع، مارجن یا آمدنی کی تبدیلی کے بارے میں غیر یقینی صورتحال ہے۔
ایک مستحکم بالٹی کنٹراسٹ فراہم کرتا ہے۔
stable_shape = final_view[
final_view['forecast_shape'] == 'stable forecast shape'
].sort_values(['revenue_spread_pct', 'eps_spread_pct'])
stable_shape.head(10)

MSFT یہاں کی سب سے صاف مثال ہے۔ آمدنی کا پھیلاؤ تقریباً 0.4% تھا اور EPS کا پھیلاؤ تقریباً 3.0% تھا۔ ایم اے، بی اے سی، اے بی بی وی اور ٹی جی ٹی بھی مستحکم علاقے میں رہے، آمدنی اور ای پی ایس دونوں کے لیے نسبتاً تنگ رینجز کے ساتھ۔
اس کا مطلب یہ نہیں کہ یہ مفروضے درست ہوں گے۔ اس کا مطلب صرف یہ ہے کہ تجزیہ کار آگے جانے والے نمبروں کے ارد گرد زیادہ قریب سے کلسٹر ہیں۔
آخر میں، سب سے اوپر غیر یقینی بالٹی چھوٹا تھا.
topline_uncertainty = final_view[
final_view['forecast_shape'] == 'top-line uncertainty'
].sort_values('revenue_spread_pct', ascending=False)
topline_uncertainty

یہ گروپ چھوٹا تھا، لیکن انہوں نے پینٹنگ مکمل کی۔ یہ ایک ایسا معاملہ تھا جہاں آمدنی کی غیر یقینی صورتحال EPS کی غیر یقینی صورتحال سے زیادہ نمایاں تھی۔
وسیع تر معنی سادہ ہے۔ اجماع کی ایک شکل نہیں ہوتی۔ اوسط اسے چھپاتے ہیں۔ اوسط کے ارد گرد کی حد سے پتہ چلتا ہے کہ آیا آمدنی، EPS، یا دونوں کے ارد گرد اختلاف ہے.
پیشن گوئی کے ورک فلو میں کیا بدل رہا ہے۔
عملی سبق یہ نہیں ہے کہ ہر ماڈل کو ایک نئے، پیچیدہ غیر یقینی نظام کی ضرورت ہوتی ہے۔ یہ اس سے آسان ہے۔
اگر آپ کا ماڈل تجزیہ کاروں کے تخمینوں کو پہلے سے ہی ذخیرہ کرتا ہے، تو اسے شاید ان تخمینوں کے ارد گرد کی حد کو ذخیرہ کرنے کی بھی ضرورت ہوگی۔
اسے رکھنے کے بجائے:
symbol | estimated_revenue | estimated_eps
میں اسے رکھنا چاہوں گا:
symbol | estimated_revenue | estimated_eps | revenue_spread | eps_spread | analyst_count | forecast_shape
یہ پیشین گوئی ان پٹ کے بارے میں مزید سیاق و سباق فراہم کرتا ہے جو آپ کا ماڈل پہلے سے استعمال کر رہا ہے۔
اس کو قابل استعمال بنانے کے لیے، ہم نے ایک حتمی جدول بنایا ہے جس میں تخمینہ کی مدت، آمدنی کا پھیلاؤ، EPS پھیلاؤ، تجزیہ کار کوریج، آمدنی کے اتفاق کی شکل، اور مجموعی طور پر پیشن گوئی کی شکل شامل ہے۔
final_df = plot_df[
[
'symbol',
'date',
'revenueAvg',
'revenueLow',
'revenueHigh',
'revenue_spread',
'epsAvg',
'epsLow',
'epsHigh',
'eps_spread_clean',
'numAnalystsRevenue',
'numAnalystsEps',
'revenue_consensus_shape',
'forecast_shape'
]
].copy()
final_df = final_df.rename(
columns={
'date': 'estimate_period',
'revenueAvg': 'revenue_avg',
'revenueLow': 'revenue_low',
'revenueHigh': 'revenue_high',
'epsAvg': 'eps_avg',
'epsLow': 'eps_low',
'epsHigh': 'eps_high',
'eps_spread_clean': 'eps_spread',
'numAnalystsRevenue': 'revenue_analysts',
'numAnalystsEps': 'eps_analysts'
}
)
final_df['revenue_spread_pct'] = final_df['revenue_spread'] * 100
final_df['eps_spread_pct'] = final_df['eps_spread'] * 100
final_view = final_df[
[
'symbol',
'estimate_period',
'revenue_spread_pct',
'eps_spread_pct',
'revenue_analysts',
'eps_analysts',
'revenue_consensus_shape',
'forecast_shape'
]
].copy()
final_view = final_view.sort_values('eps_spread_pct', ascending=False)
final_view.head(15)
آؤٹ پٹ ہے:

یہ جدول بنیادی طور پر یہ معلوم کرنے کے لیے مفید ہے کہ اوسط تخمینہ سب سے بڑی تضادات کو کہاں چھپاتا ہے۔
TSLA غیر یقینی صورتحال کی سب سے واضح اور وسیع ترین مثال ہے۔ چونکہ آمدنی اور EPS دونوں اسپریڈز وسیع ہیں، صرف اوسط تخمینہ کو ذخیرہ کرنے کے نتیجے میں پیشن گوئی کا ڈھانچہ بہت فلیٹ ہوگا۔
SQ مختلف ہے۔ آمدنی کا پھیلاؤ صرف 1.1% ہے، لیکن EPS پھیلاؤ تقریباً 73.8% ہے۔ اس کا مطلب ہے کہ آمدنی کے بارے میں بہت کم اختلاف ہے اور منافع یا محصول کی تبدیلی کے بارے میں بہت زیادہ اختلاف ہے۔
SNOW اور PLTR ایک جیسے دکھاتے ہیں، اگرچہ کم انتہائی، پیٹرن۔ آمدنی کے اسپریڈز نسبتاً تنگ ہیں، جبکہ EPS اسپریڈز بہت زیادہ وسیع ہیں۔ یہ کسی بھی ماڈل کے لیے ایک مفید امتیاز ہے جو تخمینے کو بطور ان پٹ استعمال کرتا ہے۔
بات یہ طے کرنے کی نہیں کہ کون سا تخمینہ درست ہے۔ نقطہ یہ نہیں ہے کہ تمام متفقہ اوسط کے ساتھ ایسا سلوک کیا جائے جیسے وہ ایک ہی سطح کے معاہدے کو بیان کرتے ہیں۔ وسط سینٹرائڈ فراہم کرتا ہے۔ پھیلاؤ سے پتہ چلتا ہے کہ اس مرکز کے ارد گرد کتنا تضاد ہے۔
میں غالب نہیں آؤں گا۔
میں اس لیبل کو حتمی ماڈل نہیں سمجھوں گا۔
یہاں اسٹاک کی دنیا ہاتھ سے چنی گئی ہے، پوری مارکیٹ نہیں۔ کٹ آف بھی شماریاتی اعتماد کے ماڈل کے بجائے ایک سادہ میڈین تھریشولڈ ہے۔ یہ ڈیٹا کو پڑھنے کے قابل گروپس میں الگ کرنے کے لیے مفید ہے، لیکن اسے قطعی حدود کے طور پر نہیں سمجھا جانا چاہیے۔
EPS اسپریڈز کو بھی توجہ کی ضرورت ہوتی ہے۔ اگر اوسط EPS 0 کے قریب ہو تو اسپریڈز کو متوجہ کیا جا سکتا ہے، اس لیے ہم نے سازش کرنے سے پہلے انتہائی EPS کیسز کو تراش لیا۔
سب سے اہم بات، یہ ہمیں نہیں بتاتا کہ کون سا تخمینہ درست ہے۔ ایک وسیع دائرہ کار کا مطلب یہ نہیں ہے کہ کمپنی خراب ہے، اور ایک تنگ دائرہ کار کا مطلب یہ نہیں ہے کہ پیشن گوئی درست ہے۔
مفید حصے زیادہ بنیادی ہیں۔ ماڈل یہ دکھاوا نہیں کرتا ہے کہ تمام اوسط تخمینے ایک ہی سطح کے معاہدے کو ظاہر کرتے ہیں۔
حتمی ٹیک وے: اتفاق رائے کی ساخت ہوتی ہے۔
اوسط اندازے اب بھی کارآمد ہیں۔ میں اسے پیشین گوئی کے ماڈل سے نہیں ہٹاؤں گا۔
لیکن سب سے کم، سب سے زیادہ، اوسط، اور تجزیہ کار کو ایک ساتھ دیکھنا، صرف اوسط کا استعمال نامکمل محسوس ہوتا ہے۔
معاہدے کا ڈھانچہ ہے۔ کچھ اندازے تنگ ہیں۔ کچھ کشادہ ہیں۔ بعض اوقات منافع کے بارے میں اختلاف رائے ہو سکتا ہے۔ بعض اوقات وہ EPS کے ارد گرد واقع ہوتے ہیں۔ کبھی کبھی یہ دونوں کا مجموعہ ہوتا ہے۔
ایک بہتر پیشین گوئی کے ورک فلو کو اس ڈھانچے کو چپٹا کرنے کے بجائے اسے محفوظ رکھنا چاہیے۔ پیچیدہ ہونے کی ضرورت نہیں ہے۔ صرف چند اضافی فیلڈز، جیسے کمائی کا پھیلاؤ، EPS پھیلاؤ، تجزیہ کاروں کی تعداد، پیشین گوئی کی شکل وغیرہ، آپ کے تخمینے کی پرت کو زیادہ ایماندار بنا سکتے ہیں۔