{"slug":"does-a-stock-go-up-after-a-split","qid":"by_period","label":"Every liquid forward split, 2016-2025: median 3-month return after the split vs the S&P 500, by period","post_title":"Does a Stock Go Up After a Split?","post_url":"/blog/does-a-stock-go-up-after-a-split#q-by_period","columns":["period","splits","median_runup_before_pct","median_after_3mo_pct","median_spy_3mo_pct","median_gap_vs_spy_pct","pct_beat_spy"],"rows":[{"period":"2016-2019","splits":139,"median_runup_before_pct":10.6,"median_after_3mo_pct":1.8,"median_spy_3mo_pct":3.8,"median_gap_vs_spy_pct":-2.1,"pct_beat_spy":40},{"period":"2020-2023","splits":177,"median_runup_before_pct":17.1,"median_after_3mo_pct":1,"median_spy_3mo_pct":4.9,"median_gap_vs_spy_pct":-2.8,"pct_beat_spy":37},{"period":"2024-2025","splits":98,"median_runup_before_pct":10.8,"median_after_3mo_pct":0,"median_spy_3mo_pct":3.3,"median_gap_vs_spy_pct":-1.9,"pct_beat_spy":41}],"shape":"table","sql":"WITH\ncohort AS (\n    SELECT ticker, min(execution_date) AS ex\n    FROM global_markets.stocks_splits\n    WHERE adjustment_type IN ('forward_split', 'stock_dividend') AND split_to >= 2 * split_from\n      AND execution_date >= '2016-01-01' AND execution_date <= '2025-12-31' AND ticker != 'SPCX'\n    GROUP BY ticker, execution_date\n),\nbars AS (\n    SELECT ticker, toDate(toTimeZone(window_start, 'America/New_York')) AS d,\n           toFloat64(argMax(close, window_start)) AS px\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE (ticker IN (SELECT ticker FROM cohort) OR ticker = 'SPY')\n      AND window_start >= '2015-06-01 00:00:00' AND window_start < '2026-02-01 00:00:00'\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 ticker, d\n),\nseries AS (\n    SELECT ticker,\n           arrayMap(x -> x.1, arraySort(x -> x.1, groupArray((d, px)))) AS days,\n           arrayMap(x -> x.2, arraySort(x -> x.1, groupArray((d, px)))) AS prices\n    FROM bars GROUP BY ticker\n),\nspy AS (SELECT days AS sd, prices AS sp FROM series WHERE ticker = 'SPY'),\nfwd AS (\n    SELECT ex,\n        (prices[i0 - 1] / prices[i0 - 1 - 126] - 1) * 100 AS run_up,\n        (prices[i0 + 63] / prices[i0] - 1) * 100 AS ret,\n        (sp[j0 + 63] / sp[j0] - 1) * 100 AS spy_ret\n    FROM (\n        SELECT c.ex AS ex, indexOf(s.days, c.ex) AS i0, indexOf(spy.sd, c.ex) AS j0,\n               s.prices AS prices, spy.sp AS sp\n        FROM cohort c INNER JOIN series s ON s.ticker = c.ticker CROSS JOIN spy\n    )\n    WHERE i0 > 130 AND length(prices) >= i0 + 63 AND prices[i0] > 0 AND prices[i0 - 1] >= 30\n)\nSELECT multiIf(toYear(ex) <= 2019, '2016-2019', toYear(ex) <= 2023, '2020-2023', '2024-2025') AS period,\n    count() AS splits,\n    round(median(run_up), 1) AS median_runup_before_pct,\n    round(median(ret), 1) AS median_after_3mo_pct,\n    round(median(spy_ret), 1) AS median_spy_3mo_pct,\n    round(median(ret - spy_ret), 1) AS median_gap_vs_spy_pct,\n    round(100.0 * countIf(ret > spy_ret) / count(), 0) AS pct_beat_spy\nFROM fwd GROUP BY period ORDER BY period","computed_at":"2026-07-15T11:02:35.845471+00:00","elapsed":0.006273181}