Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

How Markets Recover From Crashes

Every S&P 500 crash since 2016 recovered. We charted the market's underwater history: how deep the drawdowns ran, how often, and where it stands now.

Every S&P 500 crash since 2016 has recovered to a new high to date. The index fell about a third of its value in five weeks in early 2020 and climbed back to a record inside six months. It lost a quarter across 2022 and reclaimed the high in 2024. The market spends most of its life somewhere below a prior peak, and so far every one of those lows has been temporary.

That last sentence is the whole post. A crash feels like a break in the chart. In the record it is a dip that the index has always, eventually, dug out of. This does not promise the next one will. It shows what the last decade actually did, off stored prices you can open and audit.

How far below its high the market usually sits

Investors picture the market as a line that goes up. Most of the time it is a line sitting below a high it already set. A drawdown is the drop from the highest close so far to wherever the price is now, and it stays open until the index prints a fresh record. The chart below buckets every trading day since 2016 by how far the S&P 500, measured through the SPY ETF, closed below its running peak.

QueryHow far below its high the S&P 500 sits: share of trading days since 2016
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) - 1) * 100 AS ddpct
    FROM d
),
b AS (
    SELECT multiIf(ddpct >= -0.5, 'At a new high',
                   ddpct >= -5,   'Within 5% of the high',
                   ddpct >= -10,  '5-10% below',
                   ddpct >= -20,  '10-20% below',
                                  'More than 20% below') AS bucket,
           multiIf(ddpct >= -0.5, 0, ddpct >= -5, 1, ddpct >= -10, 2, ddpct >= -20, 3, 4) AS ord
    FROM dd
)
SELECT bucket, round(100.0 * count() / (SELECT count() FROM b), 1) AS pct_of_trading_days
FROM b GROUP BY bucket, ord ORDER BY ord

The index closed at a brand-new high on only 29.7% of trading days. It sat within 5% of a high on another 38.7%, and more than 20% below one on 2.8%. Being underwater is the market's normal condition, not the alarm. The deep holes are rare, and the shallow ones are almost constant.

The market's underwater history since 2016

Plot the worst drawdown open in each month and the shape of the last decade appears. Each episode carves down, then claws back to the zero line as the index sets a new record. A reading of zero means the market touched a fresh high that month.

QueryThe S&P 500's underwater curve: worst drawdown from a prior high, by month
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

The two deep troughs are unmistakable. The COVID crash of March 2020 cut the index by about a third in a matter of weeks. The 2022 bear market ground lower across most of the year. Around them sit the ordinary pullbacks: a rough December in 2018, a sharp autumn in 2019, repeated 5-to-10% dips that never made a headline. Every one of them returned to the zero line. The chart is a decade of scares, each erased by the next new high.

Every drawdown so far recovered

The recovery reads more plainly year by year. For each calendar year below, the worst drawdown the index suffered from its running high sits next to the price return the year actually delivered.

QueryS&P 500 worst intra-year drawdown vs the year's price return, since 2016
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, toYear(dt) AS yr, c,
           (c / max(c) OVER (ORDER BY dt ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) - 1) * 100 AS ddpct
    FROM d
)
SELECT toString(yr) AS year,
       round(min(ddpct), 1) AS worst_drawdown_pct,
       round((argMax(c, dt) / argMin(c, dt) - 1) * 100, 1) AS year_return_pct
FROM dd GROUP BY yr ORDER BY yr

2020 is the cleanest example. The worst drawdown reached -34.2%, and the year still finished at 15.1%. 2019 fell as far as -16.8% at its low and closed at 28.6%. The one losing year in the span was 2022, an intra-year low of -25.4% and a full-year price return of -20%. The index reclaimed that ground the following year, when 2023 returned 24.8%. A double-digit drawdown inside a year has been the rule rather than the exception, and most of those years still finished higher.

The pattern is not magic. Splitting the index into a handful of mega-caps and everything else explains a lot of a modern drawdown, a point covered in our study of index concentration. A crash also lands hardest on the highest-beta names, while the calmest stocks fall less. The recovery, though, has shown up across the whole tape so far.

Where the market stands today

One scorecard puts the current standing in context against the full period.

QueryThe S&P 500's underwater record since 2016 (SPY, one scorecard)
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) - 1) * 100 AS ddpct
    FROM d
)
SELECT round(-min(ddpct), 1) AS deepest_fall_pct,
       round(-argMax(ddpct, dt), 1) AS current_fall_pct,
       round(100.0 * countIf(ddpct < -0.5) / count(), 0) AS pct_days_below_high,
       round(100.0 * countIf(ddpct < -5) / count(), 0) AS pct_days_below_5,
       round(100.0 * countIf(ddpct < -10) / count(), 0) AS pct_days_below_10,
       count() AS trading_days
FROM dd

Since 2016 the deepest the S&P 500 has fallen from a high is 34.2%, the COVID low. As of the latest session it sits 0.6% below its high. Across 2647 trading days it closed below a prior peak on 70% of them, more than 5% below on 32%, and more than 10% below on 16%. The market has spent roughly a third of its life a meaningful distance from its high, and to date it has climbed to a new record out of every one of those holes.

None of this is a forecast. Past recoveries describe what happened, not what a future crash will do, and an index that recovered from a 34% fall could still fall further next time. The value in the record is perspective: a drawdown is the market's resting state as much as its emergency, and the reflex to sell into one has, in this window, sold into the recovery.

FAQ

Do stock market crashes always recover?

Every S&P 500 drawdown since 2016 has recovered to a new high to date, including the roughly 34.2% COVID crash and the 2022 bear market. Past recoveries are a record of what happened, not a guarantee about any future decline.

How long does the market take to recover from a crash?

It has varied widely. The 2020 crash reclaimed its high within months, while the 2022 bear market took into 2024. The underwater chart above shows each drawdown returning to the zero line at its own pace.

How much of the time is the stock market below its high?

Since 2016 the S&P 500 has closed below a prior high on about 70% of trading days. It reached a brand-new high on only 29.7% of them. Sitting below a peak is the market's normal state.

What was the worst stock market drawdown since 2016?

The COVID crash of early 2020, when the index fell about 34.2% from its high in a few weeks. The 2022 bear market was the next deepest, with an intra-year low near -25.4%.

Is it a good idea to buy stocks after a crash?

This post offers no advice. The historical record shows the market has spent much of its life below a high and has recovered from every crash in the window so far, though whether that holds is unknown. See our data study of buying during fear for how the market's most fearful days have performed.


Every number here comes from a stored query you can open and audit under each chart. Run the same underwater test on any ticker on the Strasmore terminal.

#market data#drawdowns#crashes#bear market#investing