{"slug":"dividend-yield-traps","qid":"yield_bands_outcome","label":"Dividend outcome over the following 12 months by starting yield band (cohort of June 30, 2025)","post_title":"Dividend Yield Traps: How to Spot One","post_url":"/blog/dividend-yield-traps#q-yield_bands_outcome","columns":["yield_band","payers","median_yield_pct","pct_stopped_paying","pct_reduced_rate","pct_reduced_or_stopped","pct_maintained_or_raised"],"rows":[{"yield_band":"under 2%","payers":1369,"median_yield_pct":1.06,"pct_stopped_paying":2.3,"pct_reduced_rate":21.1,"pct_reduced_or_stopped":23.4,"pct_maintained_or_raised":76.6},{"yield_band":"2-4%","payers":912,"median_yield_pct":2.89,"pct_stopped_paying":2.1,"pct_reduced_rate":20.1,"pct_reduced_or_stopped":22.1,"pct_maintained_or_raised":77.9},{"yield_band":"4-6%","payers":444,"median_yield_pct":4.88,"pct_stopped_paying":2.3,"pct_reduced_rate":18,"pct_reduced_or_stopped":20.3,"pct_maintained_or_raised":79.7},{"yield_band":"6-8%","payers":425,"median_yield_pct":6.77,"pct_stopped_paying":2.1,"pct_reduced_rate":8.5,"pct_reduced_or_stopped":10.6,"pct_maintained_or_raised":89.4},{"yield_band":"8% and up","payers":330,"median_yield_pct":9.66,"pct_stopped_paying":7.6,"pct_reduced_rate":28.8,"pct_reduced_or_stopped":36.4,"pct_maintained_or_raised":63.6}],"shape":"table","sql":"WITH px_base AS (\n    SELECT ticker,\n           argMax(toFloat64(close), window_start) AS price\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE toDate(toTimeZone(window_start, 'America/New_York')) = toDate('2025-06-30')\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959\n    GROUP BY ticker\n    HAVING price >= 5\n),\nrate_before AS (\n    SELECT ticker,\n           argMax(toFloat64(cash_amount) * frequency, ex_dividend_date) AS annual_rate\n    FROM global_markets.stocks_dividends\n    WHERE distribution_type = 'recurring'\n      AND frequency = 4\n      AND cash_amount > 0\n      AND ex_dividend_date > toDate('2024-06-30')\n      AND ex_dividend_date <= toDate('2025-06-30')\n    GROUP BY ticker\n),\nrate_after AS (\n    SELECT ticker,\n           argMax(toFloat64(cash_amount) * frequency, ex_dividend_date) AS annual_rate\n    FROM global_markets.stocks_dividends\n    WHERE distribution_type = 'recurring'\n      AND frequency > 0\n      AND cash_amount > 0\n      AND ex_dividend_date > toDate('2025-06-30')\n      AND ex_dividend_date <= toDate('2026-06-30')\n    GROUP BY ticker\n)\nSELECT multiIf(100 * b.annual_rate / p.price >= 8, '8% and up',\n               100 * b.annual_rate / p.price >= 6, '6-8%',\n               100 * b.annual_rate / p.price >= 4, '4-6%',\n               100 * b.annual_rate / p.price >= 2, '2-4%',\n               'under 2%') AS yield_band,\n       count() AS payers,\n       round(quantileDeterministic(0.5)(100 * b.annual_rate / p.price, cityHash64(p.ticker)), 2) AS median_yield_pct,\n       round(100 * countIf(ifNull(a.annual_rate, 0) = 0) / count(), 1) AS pct_stopped_paying,\n       round(100 * countIf(ifNull(a.annual_rate, 0) > 0 AND a.annual_rate < b.annual_rate * 0.99) / count(), 1) AS pct_reduced_rate,\n       round(100 * countIf(ifNull(a.annual_rate, 0) = 0 OR a.annual_rate < b.annual_rate * 0.99) / count(), 1) AS pct_reduced_or_stopped,\n       round(100 * countIf(ifNull(a.annual_rate, 0) >= b.annual_rate * 0.99) / count(), 1) AS pct_maintained_or_raised\nFROM px_base AS p\nINNER JOIN rate_before AS b ON p.ticker = b.ticker\nLEFT JOIN rate_after AS a ON p.ticker = a.ticker\nGROUP BY yield_band\nORDER BY median_yield_pct","computed_at":"2026-08-22T04:04:33.016261+00:00","elapsed":1.775721866}