{"slug":"what-happens-after-a-big-one-day-gain","qid":"gain_buckets","label":"Next-session returns after a big one-day gain, by size of the gain","post_title":"What Happens After a Big One-Day Gain","post_url":"/blog/what-happens-after-a-big-one-day-gain#q-gain_buckets","columns":["gain_bucket","observations","median_next_cc_pct","mean_next_cc_pct","median_next_oc_pct"],"rows":[{"gain_bucket":"under 10%","observations":639,"median_next_cc_pct":-0.27,"mean_next_cc_pct":-0.15,"median_next_oc_pct":-0.23},{"gain_bucket":"10 to 15%","observations":2647,"median_next_cc_pct":-0.58,"mean_next_cc_pct":-0.18,"median_next_oc_pct":-0.54},{"gain_bucket":"15 to 25%","observations":5689,"median_next_cc_pct":-1.1,"mean_next_cc_pct":-0.64,"median_next_oc_pct":-0.82},{"gain_bucket":"25 to 50%","observations":4188,"median_next_cc_pct":-2.35,"mean_next_cc_pct":-0.5,"median_next_oc_pct":-1.14},{"gain_bucket":"50% and up","observations":1817,"median_next_cc_pct":-9.66,"mean_next_cc_pct":-5.85,"median_next_oc_pct":-2.32}],"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        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        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(gain_pct < 10, 'under 10%',\n            gain_pct < 15, '10 to 15%',\n            gain_pct < 25, '15 to 25%',\n            gain_pct < 50, '25 to 50%',\n                           '50% and up')                                                  AS gain_bucket,\n    count()                                                                               AS observations,\n    round(quantileDeterministic(0.5)(next_cc_pct, cityHash64(ticker, toString(date))), 2)  AS median_next_cc_pct,\n    round(avg(next_cc_pct), 2)                                                            AS mean_next_cc_pct,\n    round(quantileDeterministic(0.5)(next_oc_pct, cityHash64(ticker, toString(date))), 2)  AS median_next_oc_pct\nFROM movers\nWHERE rnk <= 20\nGROUP BY gain_bucket\nORDER BY min(gain_pct) ASC","computed_at":"2026-09-27T15:37:42.632018+00:00","elapsed":32.135403352}