How to Calculate Dividend Yield: 3 Ways
Dividend yield is annual dividends per share divided by price. Work the formula on Coca-Cola, see trailing vs forward vs yield on cost, and when it misleads.
Dividend yield is a stock's annual dividends per share divided by its share price, multiplied by 100. A share paying $2.00 a year at $50 yields 4%. The arithmetic is trivial. The difficulty sits in the numerator, since the figure on top can be the last twelve months of payments or the latest payment annualized, and the number a broker shows against a position you already own is a third calculation again.
The dividend yield formula
Dividend yield = (annual dividends per share ÷ price per share) × 100
The denominator is the easy half: whatever the stock last traded at, a number that moves every second the market is open. The numerator is the cash one share collects over a year, and US companies almost always pay it in four installments rather than one. Coca-Cola (KO) is the standard worked example, a quarterly payer with a long unbroken record.
Below are the payments a single KO share collected in the twelve months to the end of June 2026, with a running total in the last column.
The exact SQL behind every number
SELECT ex_dividend_date AS date,
formatDateTime(ex_dividend_date, '%b %e, %Y') AS ex_date_label,
round(cash_amount, 4) AS dividend_per_share_usd,
round(sum(cash_amount) OVER (ORDER BY ex_dividend_date), 4) AS trailing_total_usd
FROM global_markets.stocks_dividends
WHERE ticker = 'KO'
AND distribution_type = 'recurring'
AND cash_amount > 0
AND ex_dividend_date >= toDate('2025-07-01')
AND ex_dividend_date <= toDate('2026-06-30')
ORDER BY ex_dividend_dateRead the running column from the bottom. A share collected $2.08 across the 4 payments, from $0.51 on Sep 15, 2025 to $0.53 on Jun 15, 2026. That total is the numerator. Put June's closing price underneath and the formula finishes itself: $2.08 ÷ $81.25 × 100 = 2.56%.
No company is required to pay anything. Plenty of large US names pay nothing at all, and their yield is zero rather than undefined. What dividend yield measures sets out the full distribution.
Is dividend yield annual?
Yes. A yield is always an annual rate, whatever the payment schedule underneath it. Most US companies pay quarterly. Some funds and income vehicles pay monthly, and many foreign companies pay twice a year on home-market custom. Every schedule gets converted to one annual figure before the division happens.
In practice: a 4% yield on a $50 stock is $2.00 per share per year, arriving as four payments of about 50 cents. Quote pages rarely label the number as annual, and the gap between an annual rate and a quarterly payment is the most common misreading in the subject. Timing matters as well, since only holders on the books before the ex-dividend date collect a given payment.
Trailing yield vs forward yield
Trailing twelve month yield sums the dividends actually paid over the past year, exactly as the KO panel does. It is history, and it is verifiable.
Forward yield, often printed as indicated yield, takes the most recently declared payment and multiplies it by the payment frequency, four for a quarterly payer. It estimates the next twelve months on the assumption that the company keeps paying at the current rate. A company that raised its payout during the year prints a higher forward figure, since the raise counts for four quarters instead of one or two.
Eight household payers, both methods, at the latest prices on file:
The exact SQL behind every number
WITH px AS (
SELECT ticker, argMax(close, window_start) AS price
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('KO', 'PEP', 'JNJ', 'PG', 'VZ', 'XOM', 'CVX', 'MCD')
AND window_start >= now() - INTERVAL 7 DAY
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker
),
dv AS (
SELECT ticker,
sum(cash_amount) AS ttm_dividends,
argMax(cash_amount, ex_dividend_date) AS latest_payment,
max(frequency) AS pay_frequency
FROM global_markets.stocks_dividends
WHERE ticker IN ('KO', 'PEP', 'JNJ', 'PG', 'VZ', 'XOM', 'CVX', 'MCD')
AND distribution_type = 'recurring'
AND cash_amount > 0
AND ex_dividend_date > today() - INTERVAL 1 YEAR
AND ex_dividend_date <= today()
GROUP BY ticker
)
SELECT px.ticker AS ticker,
round(px.price, 2) AS price,
round(dv.ttm_dividends, 4) AS ttm_dividends_usd,
round(dv.latest_payment * dv.pay_frequency, 4) AS forward_dividends_usd,
round(dv.ttm_dividends / px.price * 100, 2) AS trailing_yield_pct,
round(dv.latest_payment * dv.pay_frequency / px.price * 100, 2) AS forward_yield_pct,
round(abs(dv.latest_payment * dv.pay_frequency - dv.ttm_dividends) / px.price * 100, 2) AS gap_abs_pct
FROM px
INNER JOIN dv ON px.ticker = dv.ticker
ORDER BY gap_abs_pct DESCPEP shows the widest spread in the panel: 4.12% on the trailing calculation against 4.24% on the forward one, 0.12 of a percentage point apart on the same share price of $139.6. At the other end of the panel, XOM has the two methods agreeing to within 0.03 of a point.
Which one is on your screen? Most free quote pages publish the trailing twelve month figure and label it simply "dividend yield". Brokerage platforms and fund fact sheets more often carry the forward or indicated number. When two sites disagree about the same stock on the same day, the convention is usually the difference. Fund sheets add a third convention again, the standardized 30 day SEC yield, calculated from a fund's recent net investment income rather than its declared distributions.
Why the yield moves when the price moves
Yield has a moving denominator, so the ratio changes on days when nothing about the dividend changed at all. Two years of KO month ends make the mechanic visible.
The exact SQL behind every number
WITH px AS (
SELECT toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York'))) AS month_start,
argMax(close, window_start) AS price,
max(toDate(toTimeZone(window_start, 'America/New_York'))) AS last_day
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'KO'
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2024-06-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY month_start
),
dv AS (
SELECT ex_dividend_date, cash_amount
FROM global_markets.stocks_dividends
WHERE ticker = 'KO'
AND distribution_type = 'recurring'
AND cash_amount > 0
AND ex_dividend_date >= toDate('2023-06-01')
)
SELECT formatDateTime(px.month_start, '%Y-%m') AS month,
formatDateTimeInJodaSyntax(px.month_start, 'MMMM yyyy') AS month_label,
round(any(px.price), 2) AS price,
round(sum(dv.cash_amount), 4) AS ttm_dividends_usd,
round(sum(dv.cash_amount) / any(px.price) * 100, 2) AS dividend_yield_pct
FROM px, dv
WHERE dv.ex_dividend_date <= px.last_day
AND dv.ex_dividend_date > px.last_day - INTERVAL 1 YEAR
GROUP BY px.month_start
ORDER BY px.month_startRead it as two lines. The trailing dividend column is a staircase, stepping only when a payment enters or leaves the twelve month window. The price column moves every month. Since the yield is the first divided by the second, every move in the yield line between those steps is a move in the price. In June 2024 the panel reads $63.65 with a yield of 2.97%. In June 2026 it reads $81.25 and 2.56%, on trailing payments of $2.08.
This is worth sitting with. A screener sorted by yield ranks the output of that division and shows nothing about which input moved. A yield can climb while the payout is frozen and the price is falling. What counts as a good dividend yield puts the market-wide distribution around any single reading.
Yield on cost, the number on a position screen
Yield on cost divides today's annual dividend by the price you paid, not by today's price. Brokers often show it beside a long-held position, where it gets mistaken for the stock's current yield. Here is one KO dividend measured against seven entry prices, one for each late June from 2019 onward.
The exact SQL behind every number
WITH cur AS (
SELECT argMax(cash_amount, ex_dividend_date) * 4 AS annual_now
FROM global_markets.stocks_dividends
WHERE ticker = 'KO'
AND distribution_type = 'recurring'
AND cash_amount > 0
AND ex_dividend_date <= toDate('2026-06-30')
),
px_now AS (
SELECT argMax(close, window_start) AS price_now
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'KO'
AND window_start >= now() - INTERVAL 7 DAY
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
),
buys AS (
SELECT toYear(toTimeZone(window_start, 'America/New_York')) AS year,
argMax(close, window_start) AS cost_basis
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'KO'
AND toMonth(toTimeZone(window_start, 'America/New_York')) = 6
AND toDayOfMonth(toTimeZone(window_start, 'America/New_York')) >= 20
AND toYear(toTimeZone(window_start, 'America/New_York')) BETWEEN 2019 AND 2025
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY year
)
SELECT buys.year AS year,
round(buys.cost_basis, 2) AS cost_basis_usd,
round(cur.annual_now, 4) AS annual_dividend_now_usd,
round(cur.annual_now / buys.cost_basis * 100, 2) AS yield_on_cost_pct,
round(cur.annual_now / px_now.price_now * 100, 2) AS current_yield_pct,
round(cur.annual_now / buys.cost_basis * 100 - cur.annual_now / px_now.price_now * 100, 2) AS yoc_premium_pts
FROM buys, cur, px_now
ORDER BY yearA holder who bought at $50.9 in June 2019 now collects $2.12 a share a year, a yield on cost of 4.17%. A buyer today collects identical cash on a different denominator, 2.42%, leaving 1.74 points between the two readings of one share.
Both numbers are correct and they answer different questions. Yield on cost describes an entry that already happened, and it rises with every later raise. It cannot be bought today, and it says nothing about the share at the current price, which is the only open decision. For the income arithmetic that runs off the current yield instead, see $1,000 a month in dividends.
The sanity check: payout ratio
A yield says what a share pays. The payout ratio, annual dividends per share divided by earnings per share, asks whether the company can afford it. Under 100%, reported profit covers the payment. Above 100%, the difference is coming from somewhere other than this year's profit.
The exact SQL behind every number
SELECT ticker,
round(argMax(dividend_yield, date) * 100, 2) AS dividend_yield_pct,
round(argMax(dividend_yield * price, date), 2) AS annual_dividend_usd,
round(argMax(earnings_per_share, date), 2) AS earnings_per_share_usd,
round(argMax(dividend_yield * price / earnings_per_share, date) * 100, 1) AS payout_ratio_pct
FROM global_markets.stocks_ratios
WHERE ticker IN ('KO', 'JNJ', 'PG', 'VZ', 'XOM', 'CVX', 'MO', 'IBM')
AND date = (SELECT max(date) FROM global_markets.stocks_ratios)
AND dividend_yield > 0
AND earnings_per_share > 0
GROUP BY ticker
ORDER BY payout_ratio_pct DESCThe panel sorts by payout ratio. CVX sits at the top at 120.7%, paying $6.67 a share against $5.53 of earnings per share, on a yield of 3.47%. IBM sits at the bottom of the same panel at 58.8%. Two companies can quote a similar yield with very different coverage behind it. The ratio belongs beside the yield on any screen.
Real estate trusts and pipeline partnerships routinely print payout ratios above 100% against reported earnings, since heavy depreciation charges push accounting profit below the cash the business generates. Analysts measure those on funds from operations instead. At an ordinary operating company, a ratio far above 100% is the flag the measure was invented to raise. The payout ratio guide works through that calculation.
Dividend yield FAQ
How do you calculate dividend yield by hand?
Add up the dividends per share paid over the last twelve months, divide by the current share price, and multiply by 100. In the panels above, KO's 4 payments totalled $2.08 a share, which against a $81.25 price is 2.56%.
Is dividend yield annual or quarterly?
Annual, always. A quarterly payer's yield already annualizes its four payments, so a 4% yield on a $50 share means about $2.00 a year, not $2.00 a quarter.
Why do two websites show different dividend yields for the same stock?
One is usually trailing, the last twelve months actually paid, and the other forward, the latest declared payment multiplied by the payment frequency. In the panel above the two methods sit 0.12 of a percentage point apart on PEP on the same day.
Does a high dividend yield mean a good stock?
It means a large payout relative to the current price, and nothing further. The yield rises whenever the price falls with the dividend unchanged, so a high reading is the start of a question about coverage rather than an answer to it.
What is yield on cost?
Today's annual dividend divided by the price you originally paid. It rises with every dividend raise and stays anchored to your entry, so it describes a position rather than the stock. In the panel above, a June 2019 entry at $50.9 yields 4.17% on cost against 2.42% for a buyer today.
Every figure above is a stored, versioned query over filed dividend records and real prices. Open any panel to read the SQL behind it, or run the same calculation on a ticker of your own on the Strasmore terminal.