{"slug":"what-happens-after-a-big-one-day-gain","qid":"by_year","label":"Sample coverage and next-session medians, year by year","post_title":"What Happens After a Big One-Day Gain","post_url":"/blog/what-happens-after-a-big-one-day-gain#q-by_year","columns":["year","sessions","mover_rows","median_next_cc_pct","mean_next_cc_pct"],"rows":[{"year":"2023","sessions":64,"mover_rows":1280,"median_next_cc_pct":-0.36,"mean_next_cc_pct":0.14},{"year":"2024","sessions":252,"mover_rows":5040,"median_next_cc_pct":-1.25,"mean_next_cc_pct":-0.96},{"year":"2025","sessions":250,"mover_rows":5000,"median_next_cc_pct":-2.25,"mean_next_cc_pct":-1.62},{"year":"2026","sessions":183,"mover_rows":3660,"median_next_cc_pct":-1.44,"mean_next_cc_pct":-1.13}],"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 * (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    toString(toYear(date))                                                                AS year,\n    countDistinct(date)                                                                   AS sessions,\n    count()                                                                               AS mover_rows,\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\nFROM movers\nWHERE rnk <= 20\nGROUP BY year\nORDER BY year ASC","computed_at":"2026-09-27T15:39:39.403682+00:00","elapsed":29.461380156}