{"slug":"march-2009-market-bottom","qid":"bottoms_compare","label":"Four major lows: SPY forward returns at three and twelve months","post_title":"March 9, 2009: The Bottom, On the Tape","post_url":"/blog/march-2009-market-bottom#q-bottoms_compare","columns":["bottom_session","bottom_close","plus_3mo_pct","plus_1yr_pct"],"rows":[{"bottom_session":"2009-03-09","bottom_close":68.07,"plus_3mo_pct":38.5,"plus_1yr_pct":68.1},{"bottom_session":"2011-10-03","bottom_close":109.92,"plus_3mo_pct":16.1,"plus_1yr_pct":31.4},{"bottom_session":"2018-12-24","bottom_close":234.37,"plus_3mo_pct":19.1,"plus_1yr_pct":37.1},{"bottom_session":"2020-03-23","bottom_close":222.51,"plus_3mo_pct":39.6,"plus_1yr_pct":75.1}],"shape":"series","sql":"WITH daily AS (\n    SELECT\n        toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,\n        argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) AS close_usd\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND ((window_start >= toDateTime('2009-03-09 04:00:00') AND window_start < toDateTime('2010-03-17 00:00:00'))\n        OR (window_start >= toDateTime('2011-10-03 04:00:00') AND window_start < toDateTime('2012-10-10 00:00:00'))\n        OR (window_start >= toDateTime('2018-12-24 04:00:00') AND window_start < toDateTime('2019-12-31 00:00:00'))\n        OR (window_start >= toDateTime('2020-03-23 04:00:00') AND window_start < toDateTime('2021-03-30 00:00:00')))\n    GROUP BY et_date\n)\nSELECT\n    bottom_session,\n    round(argMin(close_usd, et_date), 2) AS bottom_close,\n    round((argMinIf(close_usd, et_date, et_date >= toDate(bottom_session) + 91) / argMin(close_usd, et_date) - 1) * 100, 1) AS plus_3mo_pct,\n    round((argMinIf(close_usd, et_date, et_date >= toDate(bottom_session) + 365) / argMin(close_usd, et_date) - 1) * 100, 1) AS plus_1yr_pct\nFROM (\n    SELECT\n        multiIf(et_date >= toDate('2020-03-23'), '2020-03-23',\n                et_date >= toDate('2018-12-24'), '2018-12-24',\n                et_date >= toDate('2011-10-03'), '2011-10-03',\n                '2009-03-09') AS bottom_session,\n        et_date,\n        close_usd\n    FROM daily\n)\nGROUP BY bottom_session\nORDER BY bottom_session","computed_at":"2026-07-26T05:41:01.900372+00:00","elapsed":1.547513191}