{"slug":"how-markets-recover-from-crashes","qid":"standing","label":"The S&P 500's underwater record since 2016 (SPY, one scorecard)","post_title":"How Markets Recover From Crashes","post_url":"/blog/how-markets-recover-from-crashes#q-standing","columns":["deepest_fall_pct","current_fall_pct","pct_days_below_high","pct_days_below_5","pct_days_below_10","trading_days"],"rows":[{"deepest_fall_pct":34.2,"current_fall_pct":0.6,"pct_days_below_high":70,"pct_days_below_5":32,"pct_days_below_10":16,"trading_days":2647}],"shape":"scalar","sql":"WITH d AS (\n    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS dt,\n           argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS c\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY' AND window_start >= '2016-01-01'\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 dt\n),\ndd AS (\n    SELECT dt,\n           (c / max(c) OVER (ORDER BY dt ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - 1) * 100 AS ddpct\n    FROM d\n)\nSELECT round(-min(ddpct), 1) AS deepest_fall_pct,\n       round(-argMax(ddpct, dt), 1) AS current_fall_pct,\n       round(100.0 * countIf(ddpct < -0.5) / count(), 0) AS pct_days_below_high,\n       round(100.0 * countIf(ddpct < -5) / count(), 0) AS pct_days_below_5,\n       round(100.0 * countIf(ddpct < -10) / count(), 0) AS pct_days_below_10,\n       count() AS trading_days\nFROM dd","computed_at":"2026-07-16T11:19:00.193687+00:00","elapsed":0.003096101}