Dividend Yield Portofolio: Rata-Rata Tertimbang
Cara menghitung dividend yield portofolio dengan membagi total pendapatan tahunan dan nilai pasar, serta mengapa rata-rata kolom yield dapat menyesatkan.
Imbal hasil dividen portofolio Anda adalah satu angka: total pendapatan dividen tahunan yang akan dibayarkan oleh seluruh kepemilikan, dibagi total nilai pasar kepemilikan tersebut. Dengan kata lain, angka ini merupakan rata-rata yield individual yang dibobot berdasarkan nilai pasar, dengan bobot setiap kepemilikan berupa nilai dolarnya sebagai bagian dari total portofolio. Rata-rata kolom yield pada layar broker menghasilkan angka yang berbeda. Dalam sebagian besar portofolio nyata, angka tersebut adalah yang tampak lebih tinggi.
Cara menghitung dividend yield portofolio
Untuk setiap posisi, kalikan jumlah saham dengan dividen tahunan per saham. Hasilnya adalah pendapatan tahunan posisi tersebut dalam dolar. Jumlahkan seluruh pendapatan itu. Kemudian bagi dengan total hasil perkalian jumlah saham dan harga pada semua posisi, lalu kalikan dengan 100. Itulah seluruh perhitungannya, baik untuk four holdings maupun forty.
Ada two cara yang setara untuk menuliskannya:
- Total pendapatan tahunan dibagi total nilai pasar portofolio.
- Jumlah, untuk seluruh kepemilikan, dari bobot dikalikan yield. Bobot adalah nilai posisi dibagi nilai portofolio.
Bentuk kedua menunjukkan letak kesalahan rata-rata sederhana. Setiap kepemilikan muncul dalam kedua versi, tetapi dalam versi yang benar, setiap kepemilikan dibobot berdasarkan nilai dolarnya, bukan memperoleh satu suara yang sama. Jika Anda menghitung cash sebagai bagian dari portofolio, cash juga harus masuk ke penyebut. Mengeluarkannya akan menaikkan yield yang tercetak tanpa menambah pendapatan sedikit pun. Untuk versi perhitungan satu saham, lihat cara menghitung dividend yield.
Mengapa merata-ratakan kolom yield melebih-lebihkan pendapatan Anda
Perbedaan antara kedua metode paling mudah dilihat melalui contoh perhitungan. Script di bawah ini adalah Python 3 standar tanpa import apa pun. Script ini dapat dijalankan pada mesin apa pun yang memiliki python3. Kelima posisi tersebut menggunakan angka bulat hipotetis agar dampaknya terlihat jelas: nama, jumlah saham, harga, dan dividen tahunan per saham.
#!/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}%'
)
Jalankan script tersebut. Dua angka utama akan menunjukkan perbedaan yang besar. Portofolio ini memiliki saham senilai $40,000 dan membayar $1,070 per tahun, atau weighted yield sebesar 2.68%. Rata-rata sederhana dari lima angka yield menghasilkan 4.00%, sekitar one and a half kali lebih tinggi.
Position E menjelaskan seluruh perbedaan tersebut. Yield-nya 9.00%, yang tertinggi dalam portofolio, tetapi nilai sahamnya hanya $1,000. Posisi itu mencakup 2.5% dari nilai portofolio dan menyumbang 8.4% dari pendapatan. Dalam rata-rata sederhana, posisinya memperoleh one fifth suara, sama seperti posisi senilai $15,000 di sebelahnya. Angka yield baru bermakna setelah Anda mengaitkannya dengan nilai dolar yang mendasarinya.
Seperti apa pembobotan pada kepemilikan nyata
Saham pembayar dividen dalam portofolio rumah tangga memiliki rentang yield yang lebar. Karena itu, pilihan metode pembobotan menjadi penting. Panel di bawah menghitung trailing yield setiap saham dari total dividen per saham yang diumumkan selama twelve months terakhir, dibagi harga penutupan harian terbaru.
SQL tepat di balik setiap angka
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 DESCDi antara 10 nama ini, yang dihargai hingga Aug 7, 2026, yield berkisar dari 5.96% sebesar VZ hingga 0.34% sebesar AAPL. Portofolio yang dibangun dari rentang seperti ini tidak akan berada di sekitar titik tengah kolom, kecuali nilai setiap posisi kebetulan sama dalam dolar.
Sekarang masukkan five di antaranya ke dalam portofolio dengan jumlah saham tetap. Kemudian bandingkan two angka: porsi setiap kepemilikan terhadap nilai pasar dan porsi kepemilikan tersebut terhadap pendapatan tahunan.
SQL tepat di balik setiap angka
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 DESCPola dari script tersebut kembali terlihat pada harga aktual. MSFT adalah posisi terbesar, dengan 31.4% dari nilai pasar, sementara menyumbang 10% dari pendapatan dengan yield 0.72%. Di sisi lain, VZ hanya mencakup 5.9% dari nilai dan membayar 15.7% dari pendapatan, dengan yield 5.96%. Bobot dan porsi pendapatan akan berbeda setiap kali yield tidak sama.
Jika dihitung dengan kedua metode, lima kepemilikan yang sama menghasilkan two jawaban berbeda.
SQL tepat di balik setiap angka
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 DESCAngka yang lebih tinggi, yaitu 2.93%, adalah angka Simple average of the five yields. Angka lainnya tercatat sebesar 2.24%. Hanya one di antaranya yang sesuai dengan cash. Kalikan angka berbobot dengan nilai pasar portofolio untuk mendapatkan kembali pendapatan tahunan. Lakukan hal yang sama pada rata-rata sederhana, dan Anda memperoleh angka yang tidak akan pernah muncul pada laporan mana pun. Arahnya bersifat struktural: ketika saham dengan yield lebih tinggi merupakan posisi yang lebih kecil, rata-rata sederhana berada di atas yield portofolio yang sebenarnya. Ketika saham dengan yield tinggi merupakan posisi besar, rata-rata sederhana berada di bawahnya.
Yield on cost bukan yield portofolio
Yield on cost membagi dividen tahunan saat ini dengan harga yang Anda bayarkan, bukan dengan nilai posisi saat ini. Posisi yang dibeli seharga $20 dan kini diperdagangkan pada $80, dengan dividen tahunan tetap $1.00 per saham, menunjukkan yield on cost sebesar 5.00% dibandingkan current yield sebesar 1.25%. Nilai dividennya dalam dolar sama. Hanya penyebutnya yang berubah.
Kedua angka tersebut sah dan menjawab pertanyaan yang berbeda. Nilai pasar saat ini sebagai penyebut menunjukkan yield portofolio hari ini. Angka ini dapat dibandingkan dengan dividend yield yang baik atau dengan Treasury bill. Cost basis sebagai penyebut memberi informasi tentang pembelian yang Anda lakukan pada masa lalu. Masalah muncul ketika kedua metode dicampur dalam satu total portofolio: current yield untuk pembelian terbaru, dan yield on cost untuk posisi yang telah dimiliki selama satu dekade. Campuran ini secara rutin menggandakan yield yang tampak dari portofolio pendapatan dan tidak sesuai dengan angka yang dilaporkan broker. Dividend yield traps membahas ilusi yang berlawanan, yaitu yield yang tampak tinggi setelah penurunan harga yang tajam.
Input trailing atau forward mengubah hasil
Setiap angka di atas bergantung pada angka dividen yang digunakan sebagai pembilang. Trailing yield menjumlahkan pembayaran selama twelve months terakhir yang benar-benar telah diumumkan. Forward yield mengannualisasi pembayaran terbaru, biasanya jumlah quarterly terbaru dikalikan four. Kedua metode menghasilkan angka berbeda untuk saham yang mengubah payout atau membayar special distribution selama tahun berjalan. Satu posisi besar saja dapat mengubah total portofolio secara berarti. Panel di sini menggunakan input trailing. Trailing vs forward dividend yield menjelaskan kapan setiap metode menjadi pilihan yang tepat.
Yield adalah tingkat, sedangkan cash diterima secara berkala
Weighted yield adalah tingkat tahunan, bukan jadwal pembayaran. Kelima posisi yang sama membayar dividen dalam beberapa bulan yang berdekatan. Sebagian besar perusahaan AS memasuki ex-dividend date setiap quarter dan memiliki jadwal yang serupa.
SQL tepat di balik setiap angka
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 monthCash diterima dalam 12 bulan berbeda selama trailing year. Pembayaran terbaru terjadi pada Jul 2026 sebesar $107.76. Portfolio yield sebesar beberapa persen tidak menjelaskan pada bulan apa cash tersebut diterima. Karena itu, rencana pendapatan yang menggunakan angka bulanan memerlukan kalender selain rate. Untuk level pasar secara keseluruhan yang menjadi pembanding angka portofolio ini, lihat dividend yield S&P 500.
FAQ
Bagaimana cara menghitung dividend yield seluruh portofolio saya?
Jumlahkan pendapatan dividen tahunan setiap kepemilikan, yaitu jumlah saham dikalikan dividen tahunan per saham. Kemudian jumlahkan nilai pasar setiap kepemilikan, yaitu jumlah saham dikalikan harga. Bagi total pendapatan dengan total nilai, lalu kalikan dengan 100. Hasilnya adalah rata-rata yield kepemilikan yang dibobot berdasarkan nilai pasar.
Mengapa rata-rata yield kepemilikan saya lebih tinggi daripada yield portofolio?
Rata-rata sederhana memberikan satu suara kepada setiap posisi. Portfolio yield memberikan suara yang sebanding dengan nilai dolarnya. Ketika saham dengan yield tertinggi merupakan posisi terkecil, rata-rata sederhana berada di atas yield yang sebenarnya dibayarkan portofolio, terkadang hingga half again as much.
Apakah cash dihitung dalam portfolio dividend yield?
Jika Anda menganggap cash sebagai bagian dari portofolio, cash masuk ke dalam penyebut dengan dividen sebesar zero, sehingga menurunkan yield. Mengeluarkannya berarti melaporkan yield dari bagian portofolio yang diinvestasikan saja. Kedua metode dapat digunakan selama Anda menerapkan metode yang sama setiap kali melakukan pengukuran.
Apakah yield on cost sama dengan yield portofolio saya?
Tidak. Yield on cost membagi dividen saat ini dengan harga yang Anda bayarkan bertahun-tahun lalu. Karena itu, angkanya meningkat ketika harga saham naik. Portfolio yield menggunakan nilai pasar saat ini. Angka inilah yang terkait langsung dengan pendapatan yang dihasilkan oleh kepemilikan Anda saat ini.
Apakah menambahkan satu saham dengan yield tinggi akan banyak menaikkan portfolio yield?
Hanya sebanding dengan nilai dolar posisi tersebut. Saham dengan yield 9% yang mencakup 2.5% portofolio menambah sekitar 0.2 percentage points pada weighted yield (0.09 dikalikan 0.025), terlepas dari dampaknya terhadap rata-rata kolom yield.
Setiap panel di sini memuat SQL yang menghasilkan angka tersebut secara persis. Karena itu, pembobotannya dapat diaudit baris demi baris. Untuk menjalankan perhitungan yang sama pada daftar nama dan jumlah saham Anda sendiri, minta perhitungannya dalam bahasa biasa melalui terminal Strasmore.