{"slug":"monthly-dividend-stocks","qid":"yield_shape","label":"Yield distribution across liquid monthly payers, with each band's median 12-month price change","post_title":"Monthly Dividend Stocks: The Full List","post_url":"/blog/monthly-dividend-stocks#q-yield_shape","columns":["bucket","payers","median_yield_pct","median_price_change_12m_pct","company_filings"],"rows":[{"bucket":"Under 3%","payers":66,"median_yield_pct":2.2,"median_price_change_12m_pct":0.8,"company_filings":1},{"bucket":"From 3% to 5%","payers":279,"median_yield_pct":4.21,"median_price_change_12m_pct":-1.1,"company_filings":3},{"bucket":"From 5% to 8%","payers":234,"median_yield_pct":6.28,"median_price_change_12m_pct":-1.2,"company_filings":8},{"bucket":"From 8% to 12%","payers":98,"median_yield_pct":9.42,"median_price_change_12m_pct":-1.5,"company_filings":6},{"bucket":"Above 12%","payers":71,"median_yield_pct":14.26,"median_price_change_12m_pct":-8.2,"company_filings":11}],"shape":"table","sql":"WITH monthly AS (\n    SELECT ticker, argMax(cash_amount, ex_dividend_date) AS latest_payment\n    FROM global_markets.stocks_dividends\n    WHERE ex_dividend_date > today() - 365\n      AND ex_dividend_date <= today()\n      AND cash_amount > 0\n      AND distribution_type = 'recurring'\n      AND ticker NOT IN ('SPCX')\n      AND ticker NOT IN ('KORU','SOXL','SOXS','TQQQ','SQQQ','NVDL','NVDS','NVD','TSLL','TSLQ','TSLZ','SPXL','SPXS','UPRO','SPXU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','SOXY','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','BITX','ETHU','MSTX','MSTU','CONL','DUST','JNUG','JDST','NUGT')\n      AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits\n                         WHERE execution_date BETWEEN today() - 400 AND today())\n    GROUP BY ticker\n    HAVING count() BETWEEN 10 AND 14\n       AND argMax(frequency, ex_dividend_date) = 12\n),\nfilers AS (\n    SELECT ticker\n    FROM global_markets.stocks_ratios\n    GROUP BY ticker\n    HAVING argMax(market_cap, date) > 0\n),\ntape AS (\n    SELECT ticker,\n           toDate(toTimeZone(window_start, 'America/New_York')) AS d,\n           sum(toFloat64(close) * volume) AS dollar_vol,\n           argMax(toFloat64(close), window_start) AS close_px\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker IN (SELECT ticker FROM monthly)\n      AND (window_start >= toDateTime(today() - 32)\n           OR (window_start >= toDateTime(today() - 378) AND window_start < toDateTime(today() - 358)))\n      AND toDate(toTimeZone(window_start, 'America/New_York')) < today()\n      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60\n          + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570\n      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60\n          + toMinute(toTimeZone(window_start, 'America/New_York')) < 960\n    GROUP BY ticker, d\n),\npx AS (\n    SELECT ticker,\n           avgIf(dollar_vol, d > today() - 32) AS adv_usd,\n           argMaxIf(close_px, d, d > today() - 32) AS last_close,\n           argMaxIf(close_px, d, d <= today() - 358) AS close_year_ago,\n           countIf(d > today() - 32) AS recent_sessions,\n           countIf(d <= today() - 358) AS old_sessions\n    FROM tape\n    GROUP BY ticker\n    HAVING recent_sessions >= 15\n       AND old_sessions > 0\n       AND adv_usd >= 1000000\n       AND last_close > 0\n       AND close_year_ago > 0\n),\nnamed AS (\n    SELECT m.ticker AS ticker,\n           100 * m.latest_payment * 12 / p.last_close AS yld,\n           100 * (p.last_close - p.close_year_ago) / p.close_year_ago AS price_change,\n           m.ticker IN (SELECT ticker FROM filers) AS is_filer\n    FROM monthly m\n    INNER JOIN px p ON p.ticker = m.ticker\n)\nSELECT multiIf(yld < 3, 'Under 3%',\n               yld < 5, 'From 3% to 5%',\n               yld < 8, 'From 5% to 8%',\n               yld < 12, 'From 8% to 12%',\n               'Above 12%') AS bucket,\n       count() AS payers,\n       round(quantileDeterministic(0.5)(yld, cityHash64(ticker)), 2) AS median_yield_pct,\n       round(quantileDeterministic(0.5)(price_change, cityHash64(ticker)), 1) AS median_price_change_12m_pct,\n       countIf(is_filer) AS company_filings\nFROM named\nGROUP BY bucket\nORDER BY median_yield_pct","computed_at":"2026-08-22T04:16:58.076187+00:00","elapsed":10.384774126}