{"slug":"what-is-maximum-drawdown","qid":"window_length_effect","label":"Same fund, five lookback windows: SPY maximum drawdown by sample length to July 31, 2026","post_title":"What Is Maximum Drawdown? Depth vs Recovery","post_url":"/blog/what-is-maximum-drawdown#q-window_length_effect","columns":["lookback","max_drawdown_pct","worst_point"],"rows":[{"lookback":"1 year","max_drawdown_pct":9.1,"worst_point":"Mar 2026"},{"lookback":"2 years","max_drawdown_pct":19,"worst_point":"Apr 2025"},{"lookback":"3 years","max_drawdown_pct":19,"worst_point":"Apr 2025"},{"lookback":"5 years","max_drawdown_pct":25.4,"worst_point":"Oct 2022"},{"lookback":"10 years","max_drawdown_pct":34.2,"worst_point":"Mar 2020"}],"shape":"ranking","sql":"WITH daily AS (\n    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,\n           argMax(toFloat64(close), window_start) AS close_px\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2016-07-01')\n      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')\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 session_date\n),\nscoped AS (\n    SELECT arrayJoin([1, 2, 3, 5, 10]) AS lookback_years,\n           session_date,\n           close_px\n    FROM daily\n),\nwindowed AS (\n    SELECT lookback_years, session_date, close_px\n    FROM scoped\n    WHERE session_date >= subtractYears(toDate('2026-07-31'), lookback_years)\n),\nruns AS (\n    SELECT lookback_years,\n           session_date,\n           close_px,\n           max(close_px) OVER (PARTITION BY lookback_years ORDER BY session_date\n                               ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_peak\n    FROM windowed\n)\nSELECT concat(toString(lookback_years), if(lookback_years = 1, ' year', ' years')) AS lookback,\n       round(100 * max(1 - close_px / running_peak), 1) AS max_drawdown_pct,\n       formatDateTime(argMax(session_date, 1 - close_px / running_peak), '%b %Y') AS worst_point\nFROM runs\nGROUP BY lookback_years\nORDER BY lookback_years","computed_at":"2026-08-05T03:38:20.883936+00:00","elapsed":4.473746513}