{"slug":"monthly-dividend-stocks-explained","qid":"rate_direction","label":"Liquid monthly payers grouped by the change in their monthly rate over three years, with each group's current yield","post_title":"Monthly Dividend Stocks Explained","post_url":"/blog/monthly-dividend-stocks-explained#q-rate_direction","columns":["rate_direction","payers","share_of_group_pct","median_yield_pct","median_rate_change_pct"],"rows":[{"rate_direction":"Rate cut","payers":133,"share_of_group_pct":21.8,"median_yield_pct":4.76,"median_rate_change_pct":-22.7},{"rate_direction":"Rate held flat","payers":133,"share_of_group_pct":21.8,"median_yield_pct":6.87,"median_rate_change_pct":0},{"rate_direction":"Rate raised up to 25%","payers":165,"share_of_group_pct":27,"median_yield_pct":4.94,"median_rate_change_pct":13.4},{"rate_direction":"Rate raised over 25%","payers":179,"share_of_group_pct":29.3,"median_yield_pct":5,"median_rate_change_pct":48.2}],"shape":"table","sql":"WITH monthly AS (\n    SELECT ticker,\n           argMaxIf(cash_amount, ex_dividend_date, ex_dividend_date >= '2025-07-01') AS recent_rate,\n           argMinIf(cash_amount, ex_dividend_date, ex_dividend_date <= '2023-12-31') AS early_rate\n    FROM global_markets.stocks_dividends\n    WHERE cash_amount > 0\n      AND distribution_type = 'recurring'\n      AND ex_dividend_date >= '2023-07-01'\n      AND ex_dividend_date <= '2026-06-30'\n      AND ticker NOT IN ('SPCX')\n    GROUP BY ticker\n    HAVING countIf(ex_dividend_date >= '2025-07-01') BETWEEN 10 AND 14\n       AND argMax(frequency, ex_dividend_date) = 12\n       AND countIf(ex_dividend_date <= '2023-12-31') >= 4\n       AND early_rate > 0\n),\ntape AS (\n    SELECT ticker,\n           argMax(toFloat64(close), window_start) AS last_close,\n           sum(toFloat64(close) * volume) AS dollar_vol\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker IN (SELECT ticker FROM monthly)\n      AND window_start >= toDateTime('2026-06-01 00:00:00')\n      AND window_start < toDateTime('2026-07-01 00:00:00')\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 last_close > 0 AND dollar_vol >= 20000000\n)\nSELECT multiIf(100 * (recent_rate - early_rate) / early_rate < -5, 'Rate cut',\n               100 * (recent_rate - early_rate) / early_rate <= 5, 'Rate held flat',\n               100 * (recent_rate - early_rate) / early_rate <= 25, 'Rate raised up to 25%',\n               'Rate raised over 25%') AS rate_direction,\n       count() AS payers,\n       round(100 * count() / sum(count()) OVER (), 1) AS share_of_group_pct,\n       round(quantileDeterministic(0.5)(100 * recent_rate * 12 / last_close, cityHash64(ticker)), 2) AS median_yield_pct,\n       round(quantileDeterministic(0.5)(100 * (recent_rate - early_rate) / early_rate, cityHash64(ticker)), 1) AS median_rate_change_pct\nFROM monthly\nINNER JOIN tape USING (ticker)\nGROUP BY rate_direction\nORDER BY median_rate_change_pct","computed_at":"2026-07-31T08:39:32.541525+00:00","elapsed":0.005224378}