How Markets Recover From Crashes
The S&P 500's underwater curve: worst drawdown from a prior high, by monthseries ·
2026-07-16 · 127×2
The S&P 500's underwater record since 2016 (SPY, one scorecard)scalar ·
2026-07-16 · 1×634.2
S&P 500 worst intra-year drawdown vs the year's price return, since 2016ranking ·
2026-07-16 · 11×3
How far below its high the S&P 500 sits: share of trading days since 2016ranking ·
2026-07-16 · 5×2
The S&P 500's underwater curve: worst drawdown from a prior high, by month
The S&P 500's underwater curve: worst drawdown from a prior high, by month
| month | worst_drawdown_pct |
|---|---|
| 2016-01-01 | -7.8 |
| 2016-02-01 | -9.1 |
| 2016-03-01 | -1.6 |
| 2016-04-01 | -1.8 |
| 2016-05-01 | -2.8 |
| 2016-06-01 | -6 |
| 2016-07-01 | -1.8 |
| 2016-08-01 | -0.9 |
| 2016-09-01 | -2.7 |
| 2016-10-01 | -3.1 |
| 2016-11-01 | -4.8 |
| 2016-12-01 | -1.8 |
| 2017-01-01 | -1.1 |
| 2017-02-01 | -0.8 |
| 2017-03-01 | -2.6 |
| 2017-04-01 | -3 |
| 2017-05-01 | -1.8 |
| 2017-06-01 | -1.3 |
| 2017-07-01 | -1.7 |
| 2017-08-01 | -2.1 |
| 2017-09-01 | -0.7 |
| 2017-10-01 | -0.7 |
| 2017-11-01 | -1 |
| 2017-12-01 | -0.6 |
| 2018-01-01 | -1.7 |
| 2018-02-01 | -10.1 |
| 2018-03-01 | -10 |
| 2018-04-01 | -10.1 |
| 2018-05-01 | -8.4 |
| 2018-06-01 | -6 |
| 2018-07-01 | -5.5 |
| 2018-08-01 | -2 |
| 2018-09-01 | -1.3 |
| 2018-10-01 | -10.1 |
| 2018-11-01 | -10.3 |
| 2018-12-01 | -20.2 |
| 2019-01-01 | -16.8 |
| 2019-02-01 | -8 |
| 2019-03-01 | -6.5 |
| 2019-04-01 | -2.6 |
| 2019-05-01 | -6.3 |
| 2019-06-01 | -6.6 |
| 2019-07-01 | -1.5 |
| 2019-08-01 | -6 |
| 2019-09-01 | -3.7 |
| 2019-10-01 | -4.6 |
| 2019-11-01 | -0.5 |
| 2019-12-01 | -1.9 |
| 2020-01-01 | -3.1 |
| 2020-02-01 | -12.5 |
| 2020-03-01 | -34.2 |
| 2020-04-01 | -27.3 |
| 2020-05-01 | -16.7 |
| 2020-06-01 | -11.3 |
| 2020-07-01 | -8.2 |
| 2020-08-01 | -2.8 |
| 2020-09-01 | -9.8 |
| 2020-10-01 | -8.7 |
| 2020-11-01 | -7.7 |
| 2020-12-01 | -1.5 |
| 2021-01-01 | -3.7 |
| 2021-02-01 | -3.2 |
| 2021-03-01 | -4.1 |
| 2021-04-01 | -1.2 |
| 2021-05-01 | -3.9 |
| 2021-06-01 | -2.4 |
| 2021-07-01 | -2.8 |
| 2021-08-01 | -1.7 |
| 2021-09-01 | -5.3 |
| 2021-10-01 | -5.4 |
| 2021-11-01 | -3 |
| 2021-12-01 | -4.1 |
| 2022-01-01 | -9.7 |
| 2022-02-01 | -11.7 |
| 2022-03-01 | -12.9 |
| 2022-04-01 | -13.8 |
| 2022-05-01 | -18.5 |
| 2022-06-01 | -23.4 |
| 2022-07-01 | -20.9 |
| 2022-08-01 | -17.3 |
| 2022-09-01 | -25.2 |
| 2022-10-01 | -25.4 |
| 2022-11-01 | -22.3 |
| 2022-12-01 | -21.2 |
| 2023-01-01 | -20.6 |
| 2023-02-01 | -17.1 |
| 2023-03-01 | -19.4 |
| 2023-04-01 | -15.4 |
| 2023-05-01 | -15.2 |
| 2023-06-01 | -11.7 |
| 2023-07-01 | -8.2 |
| 2023-08-01 | -8.7 |
| 2023-09-01 | -10.9 |
| 2023-10-01 | -14 |
| 2023-11-01 | -11.5 |
| 2023-12-01 | -4.8 |
| 2024-01-01 | -2.2 |
| 2024-02-01 | -1.4 |
| 2024-03-01 | -1.4 |
| 2024-04-01 | -5.4 |
| 2024-05-01 | -4.4 |
| 2024-06-01 | -1.1 |
| 2024-07-01 | -4.7 |
| 2024-08-01 | -8.4 |
| 2024-09-01 | -4.3 |
| 2024-10-01 | -2.7 |
| 2024-11-01 | -2.5 |
| 2024-12-01 | -3.6 |
| 2025-01-01 | -4.5 |
| 2025-02-01 | -4.5 |
| 2025-03-01 | -10 |
| 2025-04-01 | -19 |
| 2025-05-01 | -8.9 |
| 2025-06-01 | -3.3 |
| 2025-07-01 | -0.8 |
| 2025-08-01 | -2.4 |
| 2025-09-01 | -1.3 |
| 2025-10-01 | -3 |
| 2025-11-01 | -5.1 |
| 2025-12-01 | -2.6 |
| 2026-01-01 | -2.5 |
| 2026-02-01 | -2.6 |
| 2026-03-01 | -9.1 |
| 2026-04-01 | -5.8 |
| 2026-05-01 | -1.9 |
| 2026-06-01 | -4.5 |
| 2026-07-01 | -1.9 |
the exact SQL behind every number
WITH d AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS c
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= '2016-01-01'
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY dt
),
dd AS (
SELECT dt, c,
max(c) OVER (ORDER BY dt ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS peak
FROM d
)
SELECT toStartOfMonth(dt) AS month, round(min((c / peak - 1) * 100), 1) AS worst_drawdown_pct
FROM dd GROUP BY month ORDER BY month
More from this analysisHow Markets Recover From Crashes
S&P 500 worst intra-year drawdown vs the year's price return, since 2016
ranking 11×3
→
How far below its high the S&P 500 sits: share of trading days since 2016
ranking 5×2
→
The S&P 500's underwater record since 2016 (SPY, one scorecard)
scalar 1×6
→
SPY's 20 best and 20 worst days since 2016, counted by year
ranking 11×3
→
See all 2,170 queries →