{"slug":"what-happens-after-a-big-one-day-gain","qid":"distribution","label":"The full spread of next-session returns for top-20 daily gainers","post_title":"What Happens After a Big One-Day Gain","post_url":"/blog/what-happens-after-a-big-one-day-gain#q-distribution","columns":["percentile","close_to_close_pct","open_to_close_pct"],"rows":[{"percentile":"p05","close_to_close_pct":-26.28,"open_to_close_pct":-18.68},{"percentile":"p25","close_to_close_pct":-8.05,"open_to_close_pct":-6.2},{"percentile":"p50","close_to_close_pct":-1.6,"open_to_close_pct":-0.9},{"percentile":"p75","close_to_close_pct":4.21,"open_to_close_pct":3.85},{"percentile":"p95","close_to_close_pct":21.8,"open_to_close_pct":18.8}],"shape":"ranking","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 * (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),\npicks AS\n(\n    SELECT\n        date,\n        ticker,\n        next_cc_pct,\n        next_oc_pct,\n        arrayJoin(['p05', 'p25', 'p50', 'p75', 'p95']) AS percentile\n    FROM movers\n    WHERE rnk <= 20\n)\nSELECT\n    percentile,\n    round(multiIf(percentile = 'p05', quantileDeterministic(0.05)(next_cc_pct, cityHash64(ticker, toString(date))),\n                  percentile = 'p25', quantileDeterministic(0.25)(next_cc_pct, cityHash64(ticker, toString(date))),\n                  percentile = 'p50', quantileDeterministic(0.5)(next_cc_pct, cityHash64(ticker, toString(date))),\n                  percentile = 'p75', quantileDeterministic(0.75)(next_cc_pct, cityHash64(ticker, toString(date))),\n                                      quantileDeterministic(0.95)(next_cc_pct, cityHash64(ticker, toString(date)))), 2) AS close_to_close_pct,\n    round(multiIf(percentile = 'p05', quantileDeterministic(0.05)(next_oc_pct, cityHash64(ticker, toString(date))),\n                  percentile = 'p25', quantileDeterministic(0.25)(next_oc_pct, cityHash64(ticker, toString(date))),\n                  percentile = 'p50', quantileDeterministic(0.5)(next_oc_pct, cityHash64(ticker, toString(date))),\n                  percentile = 'p75', quantileDeterministic(0.75)(next_oc_pct, cityHash64(ticker, toString(date))),\n                                      quantileDeterministic(0.95)(next_oc_pct, cityHash64(ticker, toString(date)))), 2) AS open_to_close_pct\nFROM picks\nGROUP BY percentile\nORDER BY percentile ASC","computed_at":"2026-09-27T15:39:09.801429+00:00","elapsed":26.31236539}