STRASMORE/EXPLORE 2,170 QUERIES 22Y EQUITIES · 12Y OPTIONS

2,170 answered market questions

every one with its exact SQL, its result and the date it was computed · free, no signup

How Markets Recover From Crashes
The S&P 500's underwater curve: worst drawdown from a prior high, by monthseries · 2026-07-16 · 127×2Preview: a 16-point series, ending higher. 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×3Preview: 11 ranked values, largest first. How far below its high the S&P 500 sits: share of trading days since 2016ranking · 2026-07-16 · 5×2Preview: 5 ranked values, largest first.
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

most recentas of series 127×2read in context →
The S&P 500's underwater curve: worst drawdown from a prior high, by month — 127 rows by 2 columns, computed from US exchange, SIP and OPRA data.
monthworst_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
$