{"slug":"sell-in-may-and-go-away","qid":"month_profile","label":"Average S&P 500 tracker return by calendar month, May 2005 through April 2026","post_title":"Does Sell in May and Go Away Work?","post_url":"/blog/sell-in-may-and-go-away#q-month_profile","columns":["label","readings","avg_return_pct","median_return_pct","positive_readings"],"rows":[{"label":"Jan","readings":21,"avg_return_pct":0.36,"median_return_pct":1.59,"positive_readings":12},{"label":"Feb","readings":21,"avg_return_pct":0.13,"median_return_pct":0.25,"positive_readings":11},{"label":"Mar","readings":21,"avg_return_pct":0.58,"median_return_pct":0.96,"positive_readings":13},{"label":"Apr","readings":21,"avg_return_pct":2.4,"median_return_pct":1.56,"positive_readings":17},{"label":"May","readings":21,"avg_return_pct":0.88,"median_return_pct":1.39,"positive_readings":16},{"label":"Jun","readings":21,"avg_return_pct":-0.19,"median_return_pct":-0.19,"positive_readings":10},{"label":"Jul","readings":21,"avg_return_pct":2.63,"median_return_pct":2.28,"positive_readings":17},{"label":"Aug","readings":21,"avg_return_pct":0.28,"median_return_pct":1.42,"positive_readings":13},{"label":"Sep","readings":21,"avg_return_pct":-0.75,"median_return_pct":0.38,"positive_readings":12},{"label":"Oct","readings":21,"avg_return_pct":0.97,"median_return_pct":2.17,"positive_readings":12},{"label":"Nov","readings":21,"avg_return_pct":2.39,"median_return_pct":2.75,"positive_readings":16},{"label":"Dec","readings":21,"avg_return_pct":0.19,"median_return_pct":0.4,"positive_readings":13}],"shape":"table","sql":"WITH monthly AS (\n    SELECT toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York'))) AS month_start,\n           argMax(close, window_start) AS month_close\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2005-04-01')\n      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-04-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 month_start\n),\nmonth_returns AS (\n    SELECT m1.month_start AS month_start,\n           100 * (toFloat64(m1.month_close) / toFloat64(m0.month_close) - 1) AS ret_pct\n    FROM monthly AS m1\n    INNER JOIN monthly AS m0 ON m0.month_start = addMonths(m1.month_start, -1)\n)\nSELECT formatDateTime(month_start, '%b') AS label,\n       count() AS readings,\n       round(avg(ret_pct), 2) AS avg_return_pct,\n       round(quantileDeterministic(0.5)(ret_pct, cityHash64(month_start)), 2) AS median_return_pct,\n       countIf(ret_pct > 0) AS positive_readings\nFROM month_returns\nGROUP BY label\nORDER BY min(toMonth(month_start))","computed_at":"2026-08-03T10:51:59.257865+00:00","elapsed":0.003978899}