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

FINRA Margin Debt Statistics, Explained
Largest month-over-month declines in SPY month-end closesranking · 2026-08-22 · 10×2Preview: 10 ranked values, smallest first. What the market does between the month-end as-of date and a third-week releaseseries · 2026-08-22 · 21×5Preview: a 16-point series, ending lower. Month-end closes that set a new high for the window, by year (SPY)ranking · 2026-08-22 · 21×4Preview: 16 ranked values, largest first. How far SPY travels between month end and the third-week release windowranking · 2026-08-22 · 6×3Preview: 6 ranked values, largest first.
Largest month-over-month declines in SPY month-end closes

Largest month-over-month declines in SPY month-end closes

most recentas of ranking 10×2read in context →
Largest month-over-month declines in SPY month-end closes — 10 rows by 2 columns, computed from US exchange, SIP and OPRA data.
calendar_labelspy_change_pct
Oct 2008-16.74
Mar 2020-12.99
Feb 2009-10.53
Sep 2022-9.6
Sep 2008-9.32
Dec 2018-9.3
Apr 2022-8.77
Jun 2008-8.77
Jun 2022-8.63
Jan 2009-8.4
the exact SQL behind every number
WITH daily AS
(
    SELECT
        toDate(toTimeZone(window_start, 'America/New_York')) AS d,
        argMax(close, window_start)                          AS px
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2006-01-01 00:00:00')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) < 960
    GROUP BY d
),
month_close AS
(
    SELECT
        toStartOfMonth(d)        AS m,
        toFloat64(argMax(px, d)) AS close_px
    FROM daily
    GROUP BY m
),
chained AS
(
    SELECT
        m,
        close_px,
        lagInFrame(close_px, 1) OVER (ORDER BY m ASC
            ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prior_close
    FROM month_close
)
SELECT
    formatDateTime(m, '%b %Y')                   AS calendar_label,
    round(100 * (close_px / prior_close - 1), 2) AS spy_change_pct
FROM chained
WHERE prior_close > 0
ORDER BY spy_change_pct ASC
LIMIT 10
$