Portfolio Dividend Yield: Weighted Average کا حساب
Portfolio dividend yield معلوم کرنے کے لیے کل سالانہ income کو کل market value سے تقسیم کریں۔ yield column کا سادہ average کیوں گمراہ کن ہے اور درست طریقہ کیا ہے۔
آپ کے portfolio کا dividend yield ایک ہی عدد ہوتا ہے: آپ کی holdings سے متوقع کل سالانہ dividend income کو ان holdings کی کل market value سے تقسیم کیا جاتا ہے۔ دوسرے انداز میں کہیں تو یہ انفرادی yields کا market-value-weighted average ہے، جس میں ہر holding کا weight اس کی dollar value کو کل portfolio value کے حصے کے طور پر ظاہر کرتا ہے۔ Brokerage screen پر yield column کا average ایک مختلف عدد ہوتا ہے، اور زیادہ تر حقیقی portfolios میں یہی خوش نما عدد ہوتا ہے۔
Portfolio dividend yield کا حساب کیسے لگائیں
ہر position کے لیے shares کو فی share سالانہ dividend سے ضرب دیں۔ اس سے اس position کی سالانہ dollar income حاصل ہوگی۔ تمام positions کی یہ incomes جمع کریں، پھر اسے ہر position میں shares کو price سے ضرب دے کر حاصل ہونے والی values کے مجموعے سے تقسیم کریں، اور 100 سے ضرب دیں۔ چار holdings ہوں یا چالیس، مکمل calculation یہی ہے۔
اسے دو مساوی طریقوں سے لکھا جا سکتا ہے:
- کل سالانہ income کو portfolio کی کل market value سے تقسیم کرنا۔
- تمام holdings کے لیے weight کو yield سے ضرب دے کر حاصل ہونے والے مجموعے کو نکالنا، جہاں weight سے مراد position value کو portfolio value سے تقسیم کرنا ہے۔
دوسری صورت واضح کرتی ہے کہ simple average کہاں غلطی کرتا ہے۔ دونوں طریقوں میں ہر holding شامل ہوتی ہے، لیکن درست طریقے میں ہر holding کو ایک برابر vote نہیں ملتا؛ اس کا weight اس کے dollars کے مطابق ہوتا ہے۔ اگر آپ cash کو portfolio کا حصہ شمار کرتے ہیں تو وہ بھی denominator میں شامل ہوگا۔ اسے خارج کرنے سے income میں ایک cent بھی اضافہ کیے بغیر printed yield بڑھ جاتا ہے۔ Single-stock arithmetic کے لیے dividend yield کا حساب کیسے لگائیں سے آغاز کریں۔
Yield column کا average آپ کی income کو زیادہ کیوں دکھاتا ہے
دونوں طریقوں کا فرق ایک worked example سے سب سے آسانی سے سمجھا جا سکتا ہے۔ ذیل کا script سادہ Python 3 ہے اور اس میں کچھ import نہیں کیا گیا۔ python3 والی کوئی بھی machine اسے چلا سکتی ہے۔ پانچوں positions فرضی round numbers ہیں، جنہیں اثر واضح کرنے کے لیے منتخب کیا گیا ہے: name، share count، price اور فی share سالانہ dividend۔
#!/usr/bin/env python3
# each row: (name, shares, price, annual dividend per share)
holdings = [
('A', 200, 50.00, 1.50),
('B', 150, 100.00, 2.00),
('C', 100, 80.00, 0.80),
('D', 300, 20.00, 1.00),
('E', 100, 10.00, 0.90),
]
total_value = sum(sh * px for _, sh, px, _ in holdings)
total_income = sum(sh * dps for _, sh, _, dps in holdings)
naive = sum(100 * dps / px for _, _, px, dps in holdings) / len(holdings)
print(f'market value : ${total_value:,.2f}')
print(f'annual income : ${total_income:,.2f}')
print(f'portfolio yield : {100 * total_income / total_value:.2f}%')
print(f'average of yields : {naive:.2f}%')
for name, sh, px, dps in holdings:
value = sh * px
income = sh * dps
print(
f'{name} weight {100 * value / total_value:5.1f}%'
f' yield {100 * dps / px:5.2f}%'
f' income ${income:8,.2f}'
f' share of income {100 * income / total_income:5.1f}%'
)
اسے چلانے پر دونوں headline lines میں واضح فرق آتا ہے۔ Portfolio میں $40,000 کے stocks ہیں اور یہ سالانہ $1,070 ادا کرتا ہے، جس سے weighted yield 2.68% بنتا ہے۔ پانچ yields کا simple average 4.00% آتا ہے، جو حقیقی yield سے تقریباً ڈیڑھ گنا ہے۔
Position E پوری کہانی بیان کرتی ہے۔ $1,000 کے stocks پر اس کی yield 9.00% ہے، جو portfolio میں سب سے زیادہ ہے۔ یہ portfolio value کا 2.5% اور income کا 8.4% ہے۔ Simple average میں اسے one fifth vote ملتا ہے، بالکل اسی طرح جیسے اس کے ساتھ موجود $15,000 کی position کو۔ Yield figure اسی وقت معنی رکھتا ہے جب اس کے پیچھے موجود dollars بھی معلوم ہوں۔
حقیقی holdings میں weighting کی صورت
Household dividend payers کی yields میں کافی وسیع فرق ہوتا ہے، اور اسی وجہ سے weighting کا انتخاب اہم بن جاتا ہے۔ ذیل کا panel ہر name کی trailing yield نکالتا ہے۔ اس کے لیے فی share declared dividends کے گزشتہ بارہ ماہ کے مجموعے کو حالیہ daily close سے تقسیم کیا گیا ہے۔
ہر عدد کے پیچھے موجود درست SQL
WITH
last_px AS
(
SELECT
ticker,
toFloat64(argMax(close, date)) AS px,
formatDateTime(max(date), '%b %e, %Y') AS priced_through
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('AAPL', 'MSFT', 'HD', 'KO', 'PG', 'PEP', 'JNJ', 'XOM', 'CVX', 'VZ')
AND date >= today() - 30
GROUP BY ticker
),
ttm_dps AS
(
SELECT
ticker,
sum(amount) AS dps
FROM
(
SELECT
ticker,
id,
toFloat64(any(cash_amount)) AS amount
FROM global_markets.stocks_dividends
WHERE ticker IN ('AAPL', 'MSFT', 'HD', 'KO', 'PG', 'PEP', 'JNJ', 'XOM', 'CVX', 'VZ')
AND ex_dividend_date > today() - 365
AND ex_dividend_date <= today()
GROUP BY ticker, id
)
GROUP BY ticker
)
SELECT
p.ticker AS symbol,
round(d.dps, 2) AS ttm_dividend_usd,
round(100 * d.dps / p.px, 2) AS yield_pct,
p.priced_through AS priced_through
FROM last_px AS p
INNER JOIN ttm_dps AS d ON d.ticker = p.ticker
ORDER BY yield_pct DESCان 10 names میں، جن کی قیمتیں Aug 7, 2026 تک کی ہیں، yields 5.96% سے VZ پر شروع ہو کر 0.34% پر AAPL تک آتی ہیں۔ اگر portfolio اس طرح کے spread سے بنایا جائے تو وہ column کے midpoint کے قریب نہیں پہنچے گا، جب تک positions dollar value کے لحاظ سے برابر نہ ہوں۔
اب ان میں سے پانچ names کو fixed share counts کے ساتھ portfolio میں شامل کریں اور دو numbers کا تقابل کریں: ہر holding کا market value میں حصہ، اور سالانہ income میں اس کا حصہ۔
ہر عدد کے پیچھے موجود درست SQL
WITH
positions AS
(
SELECT
tupleElement(p, 1) AS ticker,
toFloat64(tupleElement(p, 2)) AS shares
FROM
(
SELECT arrayJoin([('MSFT', 30.), ('PG', 60.), ('XOM', 80.), ('KO', 100.), ('VZ', 60.)]) AS p
)
),
last_px AS
(
SELECT
ticker,
toFloat64(argMax(close, date)) AS px
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')
AND date >= today() - 30
GROUP BY ticker
),
ttm_dps AS
(
SELECT
ticker,
sum(amount) AS dps
FROM
(
SELECT
ticker,
id,
toFloat64(any(cash_amount)) AS amount
FROM global_markets.stocks_dividends
WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')
AND ex_dividend_date > today() - 365
AND ex_dividend_date <= today()
GROUP BY ticker, id
)
GROUP BY ticker
),
holding AS
(
SELECT
pos.ticker AS ticker,
pos.shares * lp.px AS value_usd,
pos.shares * d.dps AS income_usd
FROM positions AS pos
INNER JOIN last_px AS lp ON lp.ticker = pos.ticker
INNER JOIN ttm_dps AS d ON d.ticker = pos.ticker
)
SELECT
h.ticker AS symbol,
round(100 * h.value_usd / t.total_value, 1) AS weight_pct,
round(100 * h.income_usd / t.total_income, 1) AS income_share_pct,
round(100 * h.income_usd / h.value_usd, 2) AS yield_pct
FROM holding AS h
CROSS JOIN
(
SELECT
sum(value_usd) AS total_value,
sum(income_usd) AS total_income
FROM holding
) AS t
ORDER BY weight_pct DESCLive prices پر script کا pattern دوبارہ دکھائی دیتا ہے۔ MSFT سب سے بڑی position ہے، جو market value کا 31.4% رکھتی ہے جبکہ income کا 10% فراہم کرتی ہے، اور اس کی yield 0.72% ہے۔ دوسری طرف VZ value کا 5.9% رکھتی ہے اور income کا 15.7% ادا کرتی ہے، جبکہ اس کی yield 5.96% ہے۔ جب yields مختلف ہوں تو weight اور income share ایک جیسے نہیں رہتے۔
ان پانچ holdings کا دونوں طریقوں سے average نکالیں تو دو مختلف answers حاصل ہوتے ہیں۔
ہر عدد کے پیچھے موجود درست SQL
WITH
positions AS
(
SELECT
tupleElement(p, 1) AS ticker,
toFloat64(tupleElement(p, 2)) AS shares
FROM
(
SELECT arrayJoin([('MSFT', 30.), ('PG', 60.), ('XOM', 80.), ('KO', 100.), ('VZ', 60.)]) AS p
)
),
last_px AS
(
SELECT
ticker,
toFloat64(argMax(close, date)) AS px
FROM global_markets.stocks_daily_aggs
WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')
AND date >= today() - 30
GROUP BY ticker
),
ttm_dps AS
(
SELECT
ticker,
sum(amount) AS dps
FROM
(
SELECT
ticker,
id,
toFloat64(any(cash_amount)) AS amount
FROM global_markets.stocks_dividends
WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')
AND ex_dividend_date > today() - 365
AND ex_dividend_date <= today()
GROUP BY ticker, id
)
GROUP BY ticker
),
holding AS
(
SELECT
pos.shares * lp.px AS value_usd,
pos.shares * d.dps AS income_usd
FROM positions AS pos
INNER JOIN last_px AS lp ON lp.ticker = pos.ticker
INNER JOIN ttm_dps AS d ON d.ticker = pos.ticker
)
SELECT
tupleElement(m, 1) AS method,
round(tupleElement(m, 2), 2) AS yield_pct
FROM
(
SELECT arrayJoin([
('Market-value weighted portfolio yield', weighted_yield),
('Simple average of the five yields', naive_yield)
]) AS m
FROM
(
SELECT
100 * sum(income_usd) / sum(value_usd) AS weighted_yield,
avg(100 * income_usd / value_usd) AS naive_yield
FROM holding
)
)
ORDER BY yield_pct DESCزیادہ بلند line، 2.93% پر، Simple average of the five yields figure ہے۔ دوسری line 2.24% دکھاتی ہے۔ ان میں سے صرف ایک cash سے مطابقت رکھتی ہے۔ Weighted figure کو portfolio کی market value سے ضرب دیں تو سالانہ income دوبارہ حاصل ہو جاتی ہے۔ Simple average کے ساتھ یہی calculation کریں تو ایسا number ملتا ہے جو کسی statement میں کبھی نظر نہیں آئے گا۔ سمت کا تعلق ساختی طور پر positions کے سائز سے ہے: جب زیادہ yield والی names چھوٹی positions ہوں تو simple average حقیقی portfolio yield سے اوپر ہوتا ہے، اور جب high-yield names بڑی positions ہوں تو یہ اس سے نیچے رہتا ہے۔
Yield on cost، portfolio yield نہیں ہے
Yield on cost موجودہ سالانہ dividend کو اس price سے تقسیم کرتا ہے جو آپ نے ادا کی تھی، نہ کہ اس value سے جو position آج رکھتی ہے۔ $20 پر خریدی گئی position اگر اب $80 پر trade کر رہی ہو اور پھر بھی سالانہ $1.00 فی share ادا کر رہی ہو تو اس کا yield on cost 5.00% ہوگا، جبکہ current yield 1.25% ہوگی۔ Dividend کی dollar رقم وہی ہے۔ صرف denominator بدلا ہے۔
دونوں numbers درست ہیں، لیکن دونوں مختلف سوالات کا جواب دیتے ہیں۔ Denominator میں current market value یہ بتاتی ہے کہ portfolio آج کتنی yield دے رہا ہے۔ یہی وہ figure ہے جس کا ایک اچھی dividend yield یا Treasury bill سے تقابل کیا جا سکتا ہے۔ Denominator میں cost basis آپ کو ماضی میں کی گئی خریداری کے بارے میں بتاتا ہے۔ مسئلہ اس وقت شروع ہوتا ہے جب ایک ہی portfolio total میں دونوں کو ملا دیا جائے: حالیہ buys کے لیے current yield اور ایک دہائی سے رکھی گئی holdings کے لیے yield on cost۔ یہ blend عموماً income portfolio کی ظاہری yield کو دوگنا کر دیتا ہے اور broker کی کسی report سے مطابقت نہیں رکھتا۔ Dividend yield traps اس کے برعکس illusion کا احاطہ کرتا ہے، یعنی قیمت میں شدید کمی کے بعد بلند دکھائی دینے والی yield۔
Trailing یا forward inputs answer بدل دیتے ہیں
اوپر دیا گیا ہر figure اس بات پر منحصر ہے کہ numerator میں کون سا dividend number شامل کیا گیا ہے۔ Trailing yield گزشتہ بارہ ماہ میں حقیقتاً declared payments کا مجموعہ ہے۔ Forward yield حالیہ payment کو annualize کرتی ہے، عموماً تازہ ترین quarterly amount کو چار سے ضرب دے کر۔ جس name نے اپنا payout بدلا ہو یا سال کے دوران special distribution دی ہو، اس میں دونوں numbers مختلف ہوں گے۔ ایک بڑی holding اکیلے ہی portfolio total کو نمایاں طور پر بدل سکتی ہے۔ یہاں کے panels trailing inputs استعمال کرتے ہیں۔ Trailing بمقابلہ forward dividend yield میں بتایا گیا ہے کہ ہر طریقہ کب درست انتخاب ہوتا ہے۔
Yield ایک rate ہے، cash ایک ساتھ موصول نہیں ہوتی
Weighted yield ایک annual rate ہے، payment schedule نہیں۔ یہی پانچ positions چند مخصوص مہینوں میں clustered انداز سے ادائیگی کرتی ہیں، کیونکہ زیادہ تر US companies quarterly ex-dividend ہوتی ہیں اور ان کے calendars ایک دوسرے سے ملتے جلتے ہیں۔
ہر عدد کے پیچھے موجود درست SQL
WITH
positions AS
(
SELECT
tupleElement(p, 1) AS ticker,
toFloat64(tupleElement(p, 2)) AS shares
FROM
(
SELECT arrayJoin([('MSFT', 30.), ('PG', 60.), ('XOM', 80.), ('KO', 100.), ('VZ', 60.)]) AS p
)
),
payments AS
(
SELECT
ticker,
id,
any(ex_dividend_date) AS ex_date,
toFloat64(any(cash_amount)) AS amount
FROM global_markets.stocks_dividends
WHERE ticker IN ('MSFT', 'PG', 'XOM', 'KO', 'VZ')
AND ex_dividend_date > today() - 365
AND ex_dividend_date <= today()
GROUP BY ticker, id
)
SELECT
formatDateTime(toStartOfMonth(pay.ex_date), '%Y-%m') AS month,
formatDateTime(toStartOfMonth(pay.ex_date), '%b %Y') AS month_label,
round(sum(pos.shares * pay.amount), 2) AS income_usd
FROM payments AS pay
INNER JOIN positions AS pos ON pos.ticker = pay.ticker
GROUP BY month, month_label
ORDER BY monthگزشتہ سال کے دوران cash 12 مختلف مہینوں میں موصول ہوئی۔ ان میں سب سے حالیہ مہینہ Jul 2026 تھا، جس میں $107.76 موصول ہوئے۔ چند فیصد کی portfolio yield یہ نہیں بتاتی کہ رقم کس مہینے میں آئے گی۔ اسی لیے monthly figure پر مبنی income plan میں rate کے ساتھ calendar بھی ضروری ہے۔ ان portfolio numbers کے مقابلے کے لیے market-wide level دیکھنے کو S&P 500 dividend yield ملاحظہ کریں۔
اکثر پوچھے جانے والے سوالات
میں اپنے پورے portfolio کی dividend yield کیسے calculate کروں؟
ہر holding کی سالانہ dividend income جمع کریں، یعنی shares کو فی share سالانہ dividend سے ضرب دیں۔ پھر ہر holding کی market value جمع کریں، یعنی shares کو price سے ضرب دیں۔ اس کے بعد total income کو total value سے تقسیم کریں اور 100 سے ضرب دیں۔ نتیجہ آپ کی holdings کی market-value-weighted average yield ہوگا۔
میری holdings کی yields کا average، میرے portfolio yield سے زیادہ کیوں ہے؟
Simple average ہر position کو ایک vote دیتا ہے۔ Portfolio yield ہر position کو اس کے dollars کے تناسب سے vote دیتا ہے۔ جب سب سے زیادہ yield والی names آپ کی چھوٹی positions ہوں تو simple average اس yield سے بلند آتا ہے جو portfolio حقیقتاً ادا کرتا ہے، اور بعض اوقات یہ فرق نصف گنا زیادہ بھی ہو سکتا ہے۔
کیا cash portfolio dividend yield میں شامل ہوتی ہے؟
اگر آپ cash کو portfolio کا حصہ سمجھتے ہیں تو اسے zero dividend کے ساتھ denominator میں شامل کرنا چاہیے، جس سے yield کم ہوگی۔ اسے خارج کرنے سے صرف invested sleeve کی yield report ہوگی۔ دونوں conventions درست ہیں، بشرطیکہ ہر بار ایک ہی convention استعمال کی جائے۔
کیا yield on cost میرے portfolio کی yield کے برابر ہے؟
نہیں۔ Yield on cost آج کے dividend کو اس price سے تقسیم کرتا ہے جو آپ نے برسوں پہلے ادا کی تھی، اس لیے stock کی قیمت بڑھنے پر یہ بڑھتی رہتی ہے۔ Portfolio yield current market value استعمال کرتی ہے، اور یہی وہ figure ہے جو آپ کی موجودہ holdings سے حاصل ہونے والی income سے مطابقت رکھتی ہے۔
کیا ایک high-yield stock شامل کرنے سے portfolio yield بہت بڑھ جاتی ہے؟
صرف اس میں موجود dollars کے تناسب سے۔ اگر 9% yield والی holding portfolio کے 2.5% کے برابر ہو تو وہ weighted yield میں تقریباً 0.2 percentage points کا اضافہ کرے گی، یعنی 0.09 کو 0.025 سے ضرب دینے کے برابر، چاہے yield column کے average پر اس کا اثر کچھ بھی ہو۔
یہاں موجود ہر panel میں وہ exact SQL شامل ہے جس سے اسے تیار کیا گیا۔ اس لیے weighting کو line by line audit کیا جا سکتا ہے۔ اپنی names اور share counts کی فہرست پر یہی calculation چلانے کے لیے Strasmore terminal پر plain English میں درخواست کریں۔