Як розрахувати дивідендну дохідність портфеля
Формула дивідендної дохідності портфеля: загальний річний дохід, поділений на ринкову вартість. Чому просте середнє дохідності вводить в оману.
Дивідендна дохідність вашого портфеля — це одна величина: загальний річний дивідендний дохід, який мають виплатити активи у складі портфеля, поділений на їхню загальну ринкову вартість. Інакше кажучи, це середньозважена за ринковою вартістю дохідність окремих позицій. Вага кожної позиції дорівнює її вартості в доларах як частці всього портфеля. Середнє значення стовпця дохідності на екрані брокера — інша величина. У більшості реальних портфелів саме вона виглядає привабливішою.
Як розрахувати дивідендну дохідність портфеля
Для кожної позиції помножте кількість акцій на річний дивіденд на акцію. Це дасть річний дохід за позицією в доларах. Складіть ці доходи, поділіть суму на загальну вартість усіх позицій — кількість акцій, помножена на ціну, — і помножте на 100. Це весь розрахунок — для чотирьох позицій чи сорока.
Є два рівнозначні способи записати формулу:
- Загальний річний дохід, поділений на загальну ринкову вартість портфеля.
- Сума добутків ваги та дохідності за всіма позиціями, де вага — це вартість позиції, поділена на вартість портфеля.
Друга форма показує, де проста середня дає хибний результат. У кожній формулі враховано всі позиції, але в коректній кожна з них має вагу відповідно до вкладених у неї доларів, а не один голос. Якщо ви вважаєте грошові кошти частиною портфеля, їх також потрібно включити до знаменника. Якщо не врахувати cash, опублікована дохідність зросте, хоча дохід не збільшиться ні на цент. Для розрахунку дохідності окремої акції див. як розрахувати дивідендну дохідність.
Чому усереднення стовпця дохідності завищує ваш дохід
Різницю між двома методами найпростіше побачити на прикладі. Наведений нижче скрипт написано звичайною мовою Python 3, без імпорту додаткових модулів. Він запуститься на будь-якому комп’ютері з python3. П’ять позицій — умовні круглі числа, підібрані так, щоб ефект був очевидним: назва, кількість акцій, ціна та річний дивіденд на акцію.
#!/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}%'
)
Запустіть його — і два підсумкові показники суттєво відрізнятимуться. У портфелі акції на $40,000, які приносять $1,070 на рік. Середньозважена дохідність становить 2.68%. Просте середнє п’яти показників дохідності дорівнює 4.00%, тобто приблизно в one and a half рази більше.
Позиція E пояснює всю різницю. Її дохідність становить 9.00% — це найвищий показник у портфелі — за вартості акцій $1,000. На неї припадає 2.5% вартості портфеля та 8.4% його доходу. У простому середньому вона має one fifth голосів — стільки само, скільки позиція на $15,000 поруч із нею. Показник дохідності набуває сенсу лише тоді, коли зрозуміло, яка сума в доларах за ним стоїть.
Як виглядає зважування для реальних позицій
Дивідендні акції домогосподарств мають широкий діапазон дохідності, тому вибір методу зважування має значення. На панелі нижче для кожної компанії розраховано trailing yield: дивіденди на акцію, оголошені за останні twelve months, поділено на останню денну ціну закриття.
Точний 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 назв, оцінених через Aug 7, 2026, дохідність коливається від 5.96% на рівні VZ до 0.34% на рівні AAPL. Портфель, сформований із такого набору, не наблизиться до середнього значення стовпця, якщо тільки позиції не мають однакової вартості в доларах.
Тепер включімо п’ять із них до портфеля з фіксованою кількістю акцій і порівняймо два показники: частку кожної позиції в ринковій вартості та її частку в річному доході.
Точний 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 DESCНа реальних цінах повторюється закономірність зі скрипту. MSFT — найбільша позиція: на неї припадає 31.4% ринкової вартості, але вона забезпечує 10% доходу за дохідності 0.72%. На іншому кінці діапазону VZ становить 5.9% вартості та забезпечує 15.7% доходу за дохідності 5.96%. Вага та частка доходу розходяться, коли дохідність позицій відрізняється.
Якщо усереднити ці п’ять позицій двома способами, отримаємо дві різні відповіді.
Точний 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Вищий показник, 2.93%, — це показник Simple average of the five yields. Інший становить 2.24%. Лише один із них відповідає фактичному грошовому доходу. Помножте зважений показник на ринкову вартість портфеля — і отримаєте річний дохід. Якщо зробити те саме з простим середнім, вийде сума, яка не буде вказана в жодній виписці. Напрямок різниці визначається структурно: коли акції з вищою дохідністю мають менші ваги, просте середнє перевищує фактичну дохідність портфеля. Коли ж високодохідні позиції є найбільшими, просте середнє буде нижчим.
Yield on cost — це не дохідність портфеля
Yield on cost ділить поточний річний дивіденд на ціну купівлі, а не на поточну вартість позиції. Позиція, придбана за $20, яка тепер торгується по $80 і все ще виплачує $1.00 на акцію на рік, має yield on cost 5.00% проти поточної дохідності 1.25%. Дивіденд у доларах однаковий. Змінився лише знаменник.
Обидва показники коректні, але відповідають на різні запитання. Поточна ринкова вартість у знаменнику показує, яку дохідність портфель має сьогодні. Це показник, який можна порівнювати з хорошою дивідендною дохідністю або з Treasury bill. Cost basis у знаменнику показує результат інвестиції, зробленої в минулому. Проблема виникає, коли ці два підходи змішують в одному підсумку портфеля: для нещодавно придбаних позицій використовують поточну дохідність, а для позицій, що утримуються десять років, — yield on cost. Така комбінація регулярно подвоює уявну дохідність income-портфеля і не відповідає жодному показнику брокерської звітності. Пастки дивідендної дохідності описують протилежну ілюзію — високу дохідність, яка з’являється після різкого падіння ціни.
Trailing або forward inputs змінюють результат
Кожен наведений вище показник залежить від того, який дивіденд використано в чисельнику. Trailing yield підсумовує виплати за останні twelve months, фактично оголошені компанією. Forward yield приводить до річного виміру останню виплату, зазвичай множачи останній квартальний дивіденд на чотири. Ці два показники відрізняються для будь-якої компанії, яка змінила виплату або здійснила special distribution протягом року. Одна велика позиція може самостійно суттєво змінити показник портфеля. На цих панелях використано trailing inputs. У матеріалі Trailing vs forward dividend yield пояснюється, коли доречно використовувати кожен із них.
Дохідність — це ставка, а cash надходить окремими виплатами
Зважена дохідність — це річна ставка, а не графік виплат. Ті самі п’ять позицій виплачують дивіденди протягом кількох місяців, що часто йдуть поспіль, оскільки більшість компаній США проходять ex-dividend date щоквартально й мають схожі календарі виплат.
Точний 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Протягом trailing year cash надійшов у 12 різних місяцях. Найсвіжіша виплата відбулася у Jul 2026 і становила $107.76. Дивідендна дохідність портфеля на рівні кількох відсотків нічого не говорить про те, в якому місяці надійдуть кошти. Тому income-план, розрахований за місячним показником, має враховувати календар виплат поряд зі ставкою. Для загальноринкового показника, з яким порівнюють ці дані портфеля, див. дивідендну дохідність S&P 500.
Поширені запитання
Як розрахувати дивідендну дохідність усього портфеля?
Підсумуйте річний дивідендний дохід за кожною позицією — кількість акцій, помножена на річний дивіденд на акцію. Окремо підсумуйте ринкову вартість кожної позиції — кількість акцій, помножена на ціну. Потім поділіть загальний дохід на загальну вартість і помножте на 100. Результат — середньозважена за ринковою вартістю дохідність позицій портфеля.
Чому середня дохідність моїх позицій вища за дохідність портфеля?
Просте середнє дає кожній позиції один голос. Дохідність портфеля дає кожній позиції голос пропорційно до вкладених у неї доларів. Коли акції з найвищою дохідністю є найменшими позиціями, просте середнє перевищує дохідність, яку фактично генерує портфель, іноді приблизно на half again as much.
Чи враховуються cash у дивідендній дохідності портфеля?
Якщо ви вважаєте cash частиною портфеля, його потрібно включити до знаменника з нульовим дивідендом. Це знижує дохідність. Якщо не враховувати cash, ви показуєте дохідність лише інвестованої частини портфеля. Обидва підходи коректні, якщо щоразу застосовувати один і той самий.
Чи є yield on cost тотожним дохідності мого портфеля?
Ні. Yield on cost ділить сьогоднішній дивіденд на ціну, яку ви сплатили кілька років тому, тому показник зростає разом із ціною акції. Дохідність портфеля використовує поточну ринкову вартість. Саме цей показник пов’язаний із доходом, який генерують ваші поточні позиції.
Чи суттєво підвищить дохідність портфеля додавання однієї високодохідної акції?
Лише пропорційно до вкладених у неї доларів. Акція з дохідністю 9%, яка становить 2.5% портфеля, додає приблизно 0.2 процентного пункта до зваженої дохідності — 0.09, помножене на 0.025, — незалежно від її впливу на середнє значення стовпця дохідності.
Кожна панель містить точний SQL-запит, за яким її побудовано, тому зважування можна перевірити на кожному рядку. Щоб виконати такий самий розрахунок для власного переліку назв і кількості акцій, сформулюйте запит звичайною англійською мовою в терміналі Strasmore.