{"slug":"trailing-vs-forward-dividend-yield","qid":"convention_gap_by_schedule","label":"Distance between trailing and forward dividend yield, by payment schedule","post_title":"Trailing vs Forward Dividend Yield Explained","post_url":"/blog/trailing-vs-forward-dividend-yield#q-convention_gap_by_schedule","columns":["schedule","payers","median_trailing_pct","median_forward_pct","median_gap_pp","p90_gap_pp","pct_gap_over_half_point"],"rows":[{"schedule":"quarterly","payers":1121,"median_trailing_pct":1.93,"median_forward_pct":2,"median_gap_pp":0.031,"p90_gap_pp":0.379,"pct_gap_over_half_point":8.8},{"schedule":"monthly","payers":20,"median_trailing_pct":5.51,"median_forward_pct":5.8,"median_gap_pp":0.442,"p90_gap_pp":1.175,"pct_gap_over_half_point":40},{"schedule":"semi-annual","payers":19,"median_trailing_pct":0.97,"median_forward_pct":0.97,"median_gap_pp":0,"p90_gap_pp":0.487,"pct_gap_over_half_point":5.3},{"schedule":"annual","payers":10,"median_trailing_pct":0.6,"median_forward_pct":0.6,"median_gap_pp":0,"p90_gap_pp":0,"pct_gap_over_half_point":0}],"shape":"table","sql":"WITH universe AS (\n    SELECT ticker,\n           argMax(price, date) AS last_price\n    FROM global_markets.stocks_ratios\n    WHERE date = (SELECT max(date) FROM global_markets.stocks_ratios)\n      AND price >= 5\n      AND market_cap >= 1000000000\n    GROUP BY ticker\n),\npaid AS (\n    SELECT ticker,\n           sum(cash_amount) AS ttm_cash,\n           argMax(cash_amount, ex_dividend_date) AS latest_cash,\n           argMax(frequency, ex_dividend_date) AS pay_frequency\n    FROM global_markets.stocks_dividends\n    WHERE distribution_type = 'recurring'\n      AND cash_amount > 0\n      AND frequency IN (1, 2, 4, 12)\n      AND ex_dividend_date > today() - INTERVAL 1 YEAR\n      AND ex_dividend_date <= today()\n    GROUP BY ticker\n)\nSELECT multiIf(d.pay_frequency = 12, 'monthly',\n               d.pay_frequency = 4, 'quarterly',\n               d.pay_frequency = 2, 'semi-annual',\n               'annual') AS schedule,\n       count() AS payers,\n       round(quantileDeterministic(0.5)(toFloat64(d.ttm_cash) / toFloat64(u.last_price) * 100,\n                                        cityHash64(u.ticker)), 2) AS median_trailing_pct,\n       round(quantileDeterministic(0.5)(toFloat64(d.latest_cash) * d.pay_frequency / toFloat64(u.last_price) * 100,\n                                        cityHash64(u.ticker)), 2) AS median_forward_pct,\n       round(quantileDeterministic(0.5)(abs(toFloat64(d.latest_cash) * d.pay_frequency - toFloat64(d.ttm_cash))\n                                        / toFloat64(u.last_price) * 100,\n                                        cityHash64(u.ticker)), 3) AS median_gap_pp,\n       round(quantileDeterministic(0.9)(abs(toFloat64(d.latest_cash) * d.pay_frequency - toFloat64(d.ttm_cash))\n                                        / toFloat64(u.last_price) * 100,\n                                        cityHash64(u.ticker)), 3) AS p90_gap_pp,\n       round(100 * countIf(abs(toFloat64(d.latest_cash) * d.pay_frequency - toFloat64(d.ttm_cash))\n                           / toFloat64(u.last_price) * 100 >= 0.5) / count(), 1) AS pct_gap_over_half_point\nFROM universe AS u\nINNER JOIN paid AS d ON u.ticker = d.ticker\nGROUP BY schedule\nORDER BY payers DESC","computed_at":"2026-08-22T04:23:41.313226+00:00","elapsed":0.080063933}