{"slug":"sell-in-may-and-go-away","qid":"season_summary","label":"The seasonal gap by era: average half-year returns and the spread between them","post_title":"Does Sell in May and Go Away Work?","post_url":"/blog/sell-in-may-and-go-away#q-season_summary","columns":["era","season_count","avg_may_oct_pct","avg_nov_apr_pct","winter_minus_summer_pct","summers_positive"],"rows":[{"era":"All seasons 2005-2025","season_count":21,"avg_may_oct_pct":3.88,"avg_nov_apr_pct":6.06,"winter_minus_summer_pct":2.18,"summers_positive":16},{"era":"First half 2005-2014","season_count":10,"avg_may_oct_pct":1.22,"avg_nov_apr_pct":6.06,"winter_minus_summer_pct":4.84,"summers_positive":7},{"era":"Second half 2015-2025","season_count":11,"avg_may_oct_pct":6.3,"avg_nov_apr_pct":6.06,"winter_minus_summer_pct":-0.24,"summers_positive":9}],"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),\npairs AS (\n    SELECT toYear(apr_m.month_start) AS season_year,\n           toFloat64(oct_m.month_close) / toFloat64(apr_m.month_close) - 1 AS may_oct,\n           toFloat64(apr_next.month_close) / toFloat64(oct_m.month_close) - 1 AS nov_apr\n    FROM monthly AS apr_m\n    INNER JOIN monthly AS oct_m ON oct_m.month_start = addMonths(apr_m.month_start, 6)\n    INNER JOIN monthly AS apr_next ON apr_next.month_start = addMonths(apr_m.month_start, 12)\n    WHERE toMonth(apr_m.month_start) = 4\n),\ntagged AS (\n    SELECT may_oct,\n           nov_apr,\n           arrayJoin(['All seasons 2005-2025',\n                      if(season_year <= 2014, 'First half 2005-2014', 'Second half 2015-2025')]) AS era\n    FROM pairs\n)\nSELECT era,\n       count() AS season_count,\n       round(100 * avg(may_oct), 2) AS avg_may_oct_pct,\n       round(100 * avg(nov_apr), 2) AS avg_nov_apr_pct,\n       round(100 * (avg(nov_apr) - avg(may_oct)), 2) AS winter_minus_summer_pct,\n       countIf(may_oct > 0) AS summers_positive\nFROM tagged\nGROUP BY era\nORDER BY era","computed_at":"2026-08-03T10:51:59.154500+00:00","elapsed":15.738436366}