{"slug":"the-september-effect","qid":"monthly","label":"monthly","post_title":"the-september-effect","post_url":"/blog/the-september-effect#q-monthly","columns":["label","avg_return_pct","median_return_pct","stdev_pct","hit_rate_pct","sample_count"],"rows":[{"label":"Jan","avg_return_pct":0.27,"median_return_pct":1.55,"stdev_pct":4.41,"hit_rate_pct":54.5,"sample_count":22},{"label":"Feb","avg_return_pct":0.36,"median_return_pct":1.32,"stdev_pct":4.24,"hit_rate_pct":59.1,"sample_count":22},{"label":"Mar","avg_return_pct":0.6,"median_return_pct":1,"stdev_pct":4.46,"hit_rate_pct":59.1,"sample_count":22},{"label":"Apr","avg_return_pct":1.63,"median_return_pct":1.13,"stdev_pct":4.43,"hit_rate_pct":72.7,"sample_count":22},{"label":"May","avg_return_pct":0.92,"median_return_pct":1.61,"stdev_pct":3.81,"hit_rate_pct":77.3,"sample_count":22},{"label":"Jun","avg_return_pct":-0.1,"median_return_pct":-0.02,"stdev_pct":4.01,"hit_rate_pct":50,"sample_count":22},{"label":"Jul","avg_return_pct":2.36,"median_return_pct":2.28,"stdev_pct":3.32,"hit_rate_pct":77.3,"sample_count":22},{"label":"Aug","avg_return_pct":0.27,"median_return_pct":0.79,"stdev_pct":3.38,"hit_rate_pct":63.6,"sample_count":22},{"label":"Sep","avg_return_pct":-0.71,"median_return_pct":0.48,"stdev_pct":4.59,"hit_rate_pct":59.1,"sample_count":22},{"label":"Oct","avg_return_pct":1.16,"median_return_pct":2.21,"stdev_pct":5.74,"hit_rate_pct":60.9,"sample_count":23},{"label":"Nov","avg_return_pct":2.45,"median_return_pct":2.75,"stdev_pct":3.88,"hit_rate_pct":82.6,"sample_count":23},{"label":"Dec","avg_return_pct":0.45,"median_return_pct":0.7,"stdev_pct":3.46,"hit_rate_pct":65.2,"sample_count":23}],"shape":"table","sql":"WITH month_ends AS\n(\n    SELECT\n        toStartOfMonth(date)           AS month_start,\n        argMax(toFloat64(close), date) AS month_end_close\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker = 'SPY'\n      AND date < toStartOfYear(today())\n    GROUP BY month_start\n),\nmonthly_returns AS\n(\n    SELECT\n        month_start,\n        month_end_close,\n        lagInFrame(month_end_close, 1) OVER (ORDER BY month_start ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS prev_close\n    FROM month_ends\n)\nSELECT\n    formatDateTime(month_start, '%b')                                                                    AS label,\n    round(avg(month_end_close / prev_close - 1) * 100, 2)                                                AS avg_return_pct,\n    round(quantileDeterministic(0.5)(month_end_close / prev_close - 1, toYYYYMM(month_start)) * 100, 2) AS median_return_pct,\n    round(stddevSamp(month_end_close / prev_close - 1) * 100, 2)                                         AS stdev_pct,\n    round(countIf(month_end_close > prev_close) / count() * 100, 1)                                      AS hit_rate_pct,\n    count()                                                                                              AS sample_count\nFROM monthly_returns\nWHERE prev_close > 0\nGROUP BY toMonth(month_start), label\nORDER BY toMonth(month_start)","computed_at":"2026-09-18T15:57:51.421314+00:00","elapsed":0.054546706}