{"slug":"what-happens-after-a-reverse-stock-split","qid":"forward_returns","label":"forward_returns","post_title":"what-happens-after-a-reverse-stock-split","post_url":"/blog/what-happens-after-a-reverse-stock-split#q-forward_returns","columns":["horizon","names_count","median_return_pct","share_below_split_close_pct"],"rows":[{"horizon":"20 sessions after","names_count":586,"median_return_pct":-12.7,"share_below_split_close_pct":69.5},{"horizon":"60 sessions after","names_count":557,"median_return_pct":-26,"share_below_split_close_pct":73.1},{"horizon":"120 sessions after","names_count":513,"median_return_pct":-38.6,"share_below_split_close_pct":75.6}],"shape":"ranking","sql":"WITH\nreverse_splits AS\n(\n    SELECT ticker, toDate(execution_date) AS execution_date\n    FROM global_markets.stocks_splits\n    WHERE split_to < split_from\n      AND toDate(execution_date) >= '2025-03-01'\n      AND toDate(execution_date) <  '2026-03-01'\n      AND ticker NOT IN ('SPCX')\n    GROUP BY ticker, execution_date\n),\npost_split_closes AS\n(\n    SELECT\n        d.ticker                                                                                   AS ticker,\n        r.execution_date                                                                           AS execution_date,\n        arrayMap(x -> tupleElement(x, 2), arraySort(groupArray((d.date, toFloat64(d.close)))))    AS closes\n    FROM global_markets.stocks_daily_aggs AS d\n    INNER JOIN reverse_splits AS r ON r.ticker = d.ticker\n    WHERE d.ticker IN (SELECT ticker FROM reverse_splits)\n      AND d.date >= '2025-03-01'\n      AND d.date <  '2026-10-01'\n      AND d.date >= r.execution_date\n      AND d.date <  r.execution_date + 200\n      AND d.close > 0\n    GROUP BY d.ticker, r.execution_date\n)\nSELECT\n    horizon,\n    count()                                                                AS names_count,\n    round(quantileDeterministic(0.5)(return_pct, cityHash64(ticker)), 1)   AS median_return_pct,\n    round(100 * countIf(return_pct < 0) / count(), 1)                      AS share_below_split_close_pct\nFROM\n(\n    SELECT\n        ticker,\n        sessions_after,\n        concat(toString(sessions_after), ' sessions after')    AS horizon,\n        100 * (closes[sessions_after + 1] / closes[1] - 1)     AS return_pct\n    FROM post_split_closes\n    ARRAY JOIN [20, 60, 120] AS sessions_after\n    WHERE length(closes) > sessions_after\n)\nGROUP BY horizon\nORDER BY min(sessions_after)","computed_at":"2026-09-12T04:42:35.905852+00:00","elapsed":0.676087089}