STRASMORE/EXPLORE 2,170 QUERIES

What happened next: median move after a reverse split vs. SPY, splits executed 4-9 months ago

Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-08-22, from What Is a Reverse Stock Split? Good or Bad?.

as of series 3×7read in context →
What happened next: median move after a reverse split vs. SPY, splits executed 4-9 months ago — 3 rows by 7 columns, computed from US exchange, SIP and OPRA data.
horizonsplits_measuredmedian_stock_pctmedian_stock_pct_absmedian_spy_pctmedian_gap_pctpct_below_split_day
1 week after (5 sessions)319-6.96.90.2-7.164.3
1 month after (21 sessions)315-10100.7-10.666
3 months after (63 sessions)307-22.622.66.8-29.469.4
Rows × columns
3 × 7
Computed
Completeness
No missing values
Source
US exchange, SIP and OPRA market data
Licence
Strasmore terms · free, no signup
Formats
JSON · CSV · the SQL below

What each column holds

Column definitions for What happened next: median move after a reverse split vs. SPY, splits executed 4-9 months ago, derived from the stored result.
ColumnTypeRangeNotes
horizon text 3 distinct values
splits_measured number 307 to 319
median_stock_pct number -22.6 to -6.9 percent
median_stock_pct_abs number 6.9 to 22.6 percent
median_spy_pct number 0.2 to 6.8 percent
median_gap_pct number -29.4 to -7.1 percent
pct_below_split_day number 64.3 to 69.4 percent

Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.

the exact SQL behind every number
WITH cohort AS (
    SELECT ticker, min(execution_date) AS ex
    FROM global_markets.stocks_splits
    WHERE adjustment_type = 'reverse_split'
      AND execution_date >= today() - INTERVAL 270 DAY
      AND execution_date <= today() - INTERVAL 120 DAY
      AND ticker != 'SPCX'
    GROUP BY ticker
),
bars AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           toFloat64(argMax(close, window_start)) AS px
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE (ticker IN (SELECT ticker FROM cohort) OR ticker = 'SPY')
      AND window_start >= today() - INTERVAL 275 DAY
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, d
),
series AS (
    SELECT ticker,
           arrayMap(x -> x.1, arraySort(x -> x.1, groupArray((d, px)))) AS days,
           arrayMap(x -> x.2, arraySort(x -> x.1, groupArray((d, px)))) AS prices
    FROM bars
    GROUP BY ticker
),
spy AS (
    SELECT days AS spy_days, prices AS spy_prices
    FROM series
    WHERE ticker = 'SPY'
),
horizons AS (SELECT arrayJoin([5, 21, 63]) AS h),
fwd AS (
    SELECT c.ticker AS ticker,
           h.h AS h,
           indexOf(s.days, c.ex) AS i0,
           indexOf(spy.spy_days, c.ex) AS j0,
           (s.prices[i0 + h.h] / s.prices[i0] - 1) * 100 AS ret,
           (spy.spy_prices[j0 + h.h] / spy.spy_prices[j0] - 1) * 100 AS spy_ret
    FROM cohort AS c
    INNER JOIN series AS s ON s.ticker = c.ticker
    CROSS JOIN horizons AS h
    CROSS JOIN spy AS spy
    WHERE i0 > 0
      AND j0 > 0
      AND length(s.prices) >= i0 + h.h
      AND s.prices[i0] > 0
)
SELECT multiIf(h = 5, '1 week after (5 sessions)',
               h = 21, '1 month after (21 sessions)',
               '3 months after (63 sessions)') AS horizon,
       count() AS splits_measured,
       round(quantileDeterministic(0.5)(ret, cityHash64(ticker)), 1) AS median_stock_pct,
       round(abs(quantileDeterministic(0.5)(ret, cityHash64(ticker))), 1) AS median_stock_pct_abs,
       round(quantileDeterministic(0.5)(spy_ret, cityHash64(ticker)), 1) AS median_spy_pct,
       round(quantileDeterministic(0.5)(ret, cityHash64(ticker))
             - quantileDeterministic(0.5)(spy_ret, cityHash64(ticker)), 1) AS median_gap_pct,
       round(100.0 * countIf(ret < 0) / count(), 1) AS pct_below_split_day
FROM fwd
GROUP BY h
ORDER BY h

Run your own version of this

The same 22 years of US equities and 12 years of options data are queryable in SQL or plain English. A free account runs 100 queries a day and takes no card.

More from this analysisWhat Is a Reverse Stock Split? Good or Bad?
ASST: daily closes around its 1-for-20 reverse split (execution date 2026-02-06) series 69×3 The most recent US reverse stock splits on record series 12×4 ASST's reverse split history on record series 2×6 2026's most common reverse split ratios ranking 10×2 Reverse vs. forward splits by year, 2019 to today ranking 8×4 Where reverse-split companies stood a year later (splits executed 12-18 months ago) ranking 3×3 See all 2,170 queries →