{"slug":"what-happens-after-a-big-one-day-gain","qid":"mechanism_split","label":"Overnight gap versus intraday run: what the next session did","post_title":"What Happens After a Big One-Day Gain","post_url":"/blog/what-happens-after-a-big-one-day-gain#q-mechanism_split","columns":["move_shape","observations","median_next_cc_pct","median_next_oc_pct","mean_next_cc_pct"],"rows":[{"move_shape":"mostly intraday","observations":7551,"median_next_cc_pct":-1.6,"median_next_oc_pct":-1.07,"mean_next_cc_pct":-0.56},{"move_shape":"mixed","observations":3790,"median_next_cc_pct":-0.89,"median_next_oc_pct":-0.83,"mean_next_cc_pct":-0.61},{"move_shape":"mostly overnight gap","observations":3638,"median_next_cc_pct":-1.95,"median_next_oc_pct":-0.43,"mean_next_cc_pct":-2.84}],"shape":"table","sql":"WITH bars AS\n(\n    SELECT\n        ticker,\n        date,\n        max(toFloat64(open))   AS o,\n        max(toFloat64(close))  AS c,\n        max(toFloat64(volume)) AS vol\n    FROM global_markets.stocks_daily_aggs\n    WHERE date >= today() - 1095\n      AND date <= today() - 2\n      AND ifNull(otc, 0) = 0\n      AND ticker NOT IN ('SPCX')\n    GROUP BY ticker, date\n),\nseq AS\n(\n    SELECT\n        ticker,\n        date,\n        o,\n        c,\n        vol,\n        lagInFrame(c)     OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_c,\n        leadInFrame(o)    OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) AS next_o,\n        leadInFrame(c)    OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) AS next_c,\n        leadInFrame(date) OVER (PARTITION BY ticker ORDER BY date ASC ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) AS next_date\n    FROM bars\n),\nmovers AS\n(\n    SELECT\n        date,\n        ticker,\n        100 * (c / prev_c - 1)                        AS gain_pct,\n        (o / prev_c - 1) / (c / prev_c - 1)           AS gap_share,\n        100 * (next_c / next_o - 1)                   AS next_oc_pct,\n        100 * (next_c / c - 1)                        AS next_cc_pct,\n        row_number() OVER (PARTITION BY date ORDER BY c / prev_c DESC, ticker ASC) AS rnk\n    FROM seq\n    WHERE prev_c >= 5\n      AND next_o > 0\n      AND next_c > 0\n      AND c * vol >= 5000000\n      AND dateDiff('day', date, next_date) <= 6\n)\nSELECT\n    multiIf(gap_share >= 0.7, 'mostly overnight gap',\n            gap_share >= 0.3, 'mixed',\n                              'mostly intraday')                                     AS move_shape,\n    count()                                                                          AS observations,\n    round(quantileDeterministic(0.5)(next_cc_pct, cityHash64(ticker, toString(date))), 2) AS median_next_cc_pct,\n    round(quantileDeterministic(0.5)(next_oc_pct, cityHash64(ticker, toString(date))), 2) AS median_next_oc_pct,\n    round(avg(next_cc_pct), 2)                                                       AS mean_next_cc_pct\nFROM movers\nWHERE rnk <= 20\n  AND gain_pct >= 5\nGROUP BY move_shape\nORDER BY min(gap_share) ASC","computed_at":"2026-09-27T15:38:43.287344+00:00","elapsed":28.479434039}