{"slug":"unusual-options-activity","qid":"oa_followthrough","label":"What follows a heavy options session: next-session absolute move vs. the same names on an ordinary day","post_title":"Unusual Options Activity: Last Session","post_url":"/blog/unusual-options-activity#q-oa_followthrough","columns":["rvol_bucket","event_count","median_next_move_pct","median_typical_move_pct","gap_pp","median_next_signed_pct"],"rows":[{"rvol_bucket":"5x or more","event_count":593,"median_next_move_pct":2.51,"median_typical_move_pct":1.96,"gap_pp":0.55,"median_next_signed_pct":-0.29},{"rvol_bucket":"3x to 5x","event_count":1193,"median_next_move_pct":2.35,"median_typical_move_pct":2.15,"gap_pp":0.2,"median_next_signed_pct":-0.24},{"rvol_bucket":"2x to 3x","event_count":1793,"median_next_move_pct":2.29,"median_typical_move_pct":2.2,"gap_pp":0.09,"median_next_signed_pct":-0.26},{"rvol_bucket":"1x to 2x","event_count":8175,"median_next_move_pct":2,"median_typical_move_pct":2.21,"gap_pp":-0.21,"median_next_signed_pct":-0.03},{"rvol_bucket":"below 1x","event_count":11135,"median_next_move_pct":1.88,"median_typical_move_pct":2.08,"gap_pp":-0.19,"median_next_signed_pct":0}],"shape":"table","sql":"WITH daily AS (\n    SELECT underlying_symbol AS sym,\n           date AS d,\n           sum(volume) AS vol,\n           max(underlying_close) AS px\n    FROM global_markets.options_greeks\n    WHERE date >= today() - 200\n      AND underlying_close > 0\n      AND underlying_symbol NOT IN ('SPCX')\n      AND underlying_symbol NOT IN ('KORU','SOXL','SOXS','TQQQ','SQQQ','NVDL','NVDS','NVD','TSLL','TSLQ','TSLZ','SPXL','SPXS','UPRO','SPXU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','SOXY','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','BITX','ETHU','MSTX','MSTU','CONL','DUST','JNUG','JDST','NUGT')\n      AND underlying_symbol NOT IN (SELECT ticker FROM global_markets.stocks_splits\n                                    WHERE execution_date BETWEEN today() - 230 AND today())\n    GROUP BY sym, d\n),\nseq AS (\n    SELECT sym, d, vol, px,\n           avg(vol) OVER (PARTITION BY sym ORDER BY d ROWS BETWEEN 20 PRECEDING AND 1 PRECEDING) AS base,\n           count() OVER (PARTITION BY sym ORDER BY d ROWS BETWEEN 20 PRECEDING AND 1 PRECEDING) AS base_n,\n           any(px) OVER (PARTITION BY sym ORDER BY d ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) AS next_px,\n           any(px) OVER (PARTITION BY sym ORDER BY d ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_px\n    FROM daily\n),\nmoves AS (\n    SELECT sym, vol, base, base_n,\n           if(next_px > 0, 100 * abs(next_px / px - 1), -1) AS next_abs,\n           if(next_px > 0, 100 * (next_px / px - 1), -999) AS next_signed,\n           if(prev_px > 0, 100 * abs(px / prev_px - 1), -1) AS own_abs\n    FROM seq\n),\ntypical AS (\n    SELECT sym, quantileExact(0.5)(own_abs) AS typ\n    FROM moves\n    WHERE own_abs >= 0\n    GROUP BY sym\n)\nSELECT arrayElement(['5x or more', '3x to 5x', '2x to 3x', '1x to 2x', 'below 1x'], bk) AS rvol_bucket,\n       count() AS event_count,\n       round(quantileExact(0.5)(next_abs), 2) AS median_next_move_pct,\n       round(quantileExact(0.5)(typ), 2) AS median_typical_move_pct,\n       round(quantileExact(0.5)(next_abs) - quantileExact(0.5)(typ), 2) AS gap_pp,\n       round(quantileExact(0.5)(next_signed), 2) AS median_next_signed_pct\nFROM (\n    SELECT m.sym AS sym,\n           multiIf(m.vol / m.base >= 5, 1, m.vol / m.base >= 3, 2, m.vol / m.base >= 2, 3,\n                   m.vol / m.base >= 1, 4, 5) AS bk,\n           m.next_abs AS next_abs,\n           m.next_signed AS next_signed,\n           t.typ AS typ\n    FROM moves m INNER JOIN typical t ON m.sym = t.sym\n    WHERE m.base_n = 20 AND m.base >= 5000 AND m.vol >= 25000 AND m.next_abs >= 0\n)\nGROUP BY bk\nORDER BY bk ASC","computed_at":"2026-08-25T13:14:38.460843+00:00","elapsed":36.401733164}