What Is Maximum Drawdown? Depth vs Recovery
Same fund, five lookback windows: SPY maximum drawdown by sample length to July 31, 2026ranking ·
2026-08-05 · 5×3
Completed SPY drawdowns since 2016: depth, days falling, days climbing backtable ·
2026-08-05 · 8×5
SPY underwater curve: month end close against its running peak, 2016 to 2026series ·
2026-08-05 · 127×2
Maximum drawdown against annualized volatility: eight large caps, five years to July 31, 2026ranking ·
2026-08-05 · 8×3
Same fund, five lookback windows: SPY maximum drawdown by sample length to July 31, 2026
Same fund, five lookback windows: SPY maximum drawdown by sample length to July 31, 2026
| lookback | max_drawdown_pct | worst_point |
|---|---|---|
| 1 year | 9.1 | Mar 2026 |
| 2 years | 19 | Apr 2025 |
| 3 years | 19 | Apr 2025 |
| 5 years | 25.4 | Oct 2022 |
| 10 years | 34.2 | Mar 2020 |
the exact SQL behind every number
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,
argMax(toFloat64(close), window_start) AS close_px
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2016-07-01')
AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY session_date
),
scoped AS (
SELECT arrayJoin([1, 2, 3, 5, 10]) AS lookback_years,
session_date,
close_px
FROM daily
),
windowed AS (
SELECT lookback_years, session_date, close_px
FROM scoped
WHERE session_date >= subtractYears(toDate('2026-07-31'), lookback_years)
),
runs AS (
SELECT lookback_years,
session_date,
close_px,
max(close_px) OVER (PARTITION BY lookback_years ORDER BY session_date
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_peak
FROM windowed
)
SELECT concat(toString(lookback_years), if(lookback_years = 1, ' year', ' years')) AS lookback,
round(100 * max(1 - close_px / running_peak), 1) AS max_drawdown_pct,
formatDateTime(argMax(session_date, 1 - close_px / running_peak), '%b %Y') AS worst_point
FROM runs
GROUP BY lookback_years
ORDER BY lookback_years
More from this analysisWhat Is Maximum Drawdown? Depth vs Recovery
Maximum drawdown against annualized volatility: eight large caps, five years to July 31, 2026
ranking 8×3
→
SPY underwater curve: month end close against its running peak, 2016 to 2026
series 127×2
→
Completed SPY drawdowns since 2016: depth, days falling, days climbing back
table 8×5
→
The calmest large caps: annualized realized volatility over the past year, lowest first
ranking 15×2
→
See all 2,170 queries →