{"slug":"what-happens-if-an-option-expires-itm","qid":"late_move","label":"Absolute move over the final 30 minutes of Friday sessions, 2023 to July 2026","post_title":"What Happens If an Option Expires In the Money","post_url":"/blog/what-happens-if-an-option-expires-itm#q-late_move","columns":["ticker","fridays_count","median_last30_move_pct","p90_last30_move_pct"],"rows":[{"ticker":"NVDA","fridays_count":177,"median_last30_move_pct":0.272,"p90_last30_move_pct":0.804},{"ticker":"CVX","fridays_count":177,"median_last30_move_pct":0.174,"p90_last30_move_pct":0.559},{"ticker":"AAPL","fridays_count":177,"median_last30_move_pct":0.174,"p90_last30_move_pct":0.531},{"ticker":"MSFT","fridays_count":177,"median_last30_move_pct":0.16,"p90_last30_move_pct":0.532},{"ticker":"T","fridays_count":177,"median_last30_move_pct":0.155,"p90_last30_move_pct":0.46},{"ticker":"JNJ","fridays_count":177,"median_last30_move_pct":0.134,"p90_last30_move_pct":0.38},{"ticker":"KO","fridays_count":177,"median_last30_move_pct":0.118,"p90_last30_move_pct":0.362},{"ticker":"SPY","fridays_count":177,"median_last30_move_pct":0.071,"p90_last30_move_pct":0.261}],"shape":"ranking","sql":"WITH friday_bars AS (\n    SELECT ticker,\n           toDate(toTimeZone(window_start, 'America/New_York')) AS session,\n           toHour(toTimeZone(window_start, 'America/New_York')) * 60\n             + toMinute(toTimeZone(window_start, 'America/New_York')) AS et_minute,\n           window_start,\n           toFloat64(close) AS px\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker IN ('SPY', 'AAPL', 'MSFT', 'NVDA', 'JNJ', 'CVX', 'KO', 'T')\n      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2023-01-02')\n      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')\n      AND toDayOfWeek(toDate(toTimeZone(window_start, 'America/New_York'))) = 5\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959\n),\nfriday_sessions AS (\n    SELECT ticker,\n           session,\n           argMaxIf(px, window_start, et_minute <= 930) AS px_330,\n           argMaxIf(px, window_start, et_minute > 930) AS px_close,\n           countIf(et_minute <= 930) AS early_bars,\n           countIf(et_minute > 930) AS late_bars\n    FROM friday_bars\n    GROUP BY ticker, session\n    HAVING early_bars > 100 AND late_bars > 10 AND px_330 > 0\n)\nSELECT ticker,\n       count() AS fridays_count,\n       round(quantileDeterministic(0.5)(abs(px_close / px_330 - 1) * 100,\n                                        cityHash64(toString(session))), 3) AS median_last30_move_pct,\n       round(quantileDeterministic(0.9)(abs(px_close / px_330 - 1) * 100,\n                                        cityHash64(toString(session))), 3) AS p90_last30_move_pct\nFROM friday_sessions\nGROUP BY ticker\nORDER BY median_last30_move_pct DESC","computed_at":"2026-08-04T12:41:32.713568+00:00","elapsed":0.00425171}