{"slug":"march-2009-market-bottom","qid":"drawdown","label":"Peak to trough to round trip: the whole crisis in one row","post_title":"March 9, 2009: The Bottom, On the Tape","post_url":"/blog/march-2009-market-bottom#q-drawdown","columns":["peak_close","peak_date","trough_close","trough_date","decline_pct","recovered_date"],"rows":[{"peak_close":156.41,"peak_date":"2007-10-09","trough_close":68.07,"trough_date":"2009-03-09","decline_pct":-56.5,"recovered_date":"2013-03-14"}],"shape":"scalar","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('2007-01-02 00:00:00') AND window_start < toDateTime('2013-07-01 00:00:00')\n    GROUP BY et_date\n),\n(SELECT max(close_usd) FROM daily WHERE et_date < toDate('2008-01-01')) AS peak_close_usd\nSELECT\n    round(peak_close_usd, 2) AS peak_close,\n    toString(argMaxIf(et_date, (close_usd, et_date), et_date < toDate('2008-01-01'))) AS peak_date,\n    round(minIf(close_usd, et_date BETWEEN toDate('2008-07-01') AND toDate('2009-06-30')), 2) AS trough_close,\n    toString(argMinIf(et_date, (close_usd, et_date), et_date BETWEEN toDate('2008-07-01') AND toDate('2009-06-30'))) AS trough_date,\n    round((minIf(close_usd, et_date BETWEEN toDate('2008-07-01') AND toDate('2009-06-30')) / peak_close_usd - 1) * 100, 1) AS decline_pct,\n    toString(minIf(et_date, et_date > toDate('2009-03-09') AND close_usd >= peak_close_usd)) AS recovered_date\nFROM daily","computed_at":"2026-07-26T05:40:59.285794+00:00","elapsed":2.54056491}