{"slug":"what-happens-if-an-option-expires-itm","qid":"weekend_gap","label":"Friday close to Monday's first minute: absolute overnight move, 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-weekend_gap","columns":["ticker","weekends_count","median_weekend_gap_pct","p90_weekend_gap_pct"],"rows":[{"ticker":"NVDA","weekends_count":157,"median_weekend_gap_pct":1.05,"p90_weekend_gap_pct":3.04},{"ticker":"CVX","weekends_count":157,"median_weekend_gap_pct":0.49,"p90_weekend_gap_pct":1.59},{"ticker":"AAPL","weekends_count":157,"median_weekend_gap_pct":0.49,"p90_weekend_gap_pct":1.71},{"ticker":"MSFT","weekends_count":157,"median_weekend_gap_pct":0.41,"p90_weekend_gap_pct":1.36},{"ticker":"T","weekends_count":157,"median_weekend_gap_pct":0.35,"p90_weekend_gap_pct":1.15},{"ticker":"KO","weekends_count":157,"median_weekend_gap_pct":0.31,"p90_weekend_gap_pct":0.68},{"ticker":"JNJ","weekends_count":157,"median_weekend_gap_pct":0.28,"p90_weekend_gap_pct":0.88},{"ticker":"SPY","weekends_count":157,"median_weekend_gap_pct":0.28,"p90_weekend_gap_pct":0.99}],"shape":"ranking","sql":"WITH session_marks AS (\n    SELECT ticker,\n           toDate(toTimeZone(window_start, 'America/New_York')) AS session,\n           argMax(toFloat64(close), window_start) AS close_px,\n           argMin(toFloat64(close), window_start) AS first_minute_px,\n           count() AS session_bars\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'))) IN (1, 5)\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959\n    GROUP BY ticker, session\n    HAVING session_bars > 300\n),\nweekends AS (\n    SELECT ticker,\n           subtractDays(toMonday(session), if(toDayOfWeek(session) = 1, 7, 0)) AS weekend_id,\n           argMaxIf(close_px, session, toDayOfWeek(session) = 5) AS friday_close,\n           argMaxIf(first_minute_px, session, toDayOfWeek(session) = 1) AS monday_first_px\n    FROM session_marks\n    GROUP BY ticker, weekend_id\n    HAVING countIf(toDayOfWeek(session) = 5) = 1\n       AND countIf(toDayOfWeek(session) = 1) = 1\n       AND friday_close > 0\n)\nSELECT ticker,\n       count() AS weekends_count,\n       round(quantileDeterministic(0.5)(abs(monday_first_px / friday_close - 1) * 100,\n                                        cityHash64(toString(weekend_id))), 2) AS median_weekend_gap_pct,\n       round(quantileDeterministic(0.9)(abs(monday_first_px / friday_close - 1) * 100,\n                                        cityHash64(toString(weekend_id))), 2) AS p90_weekend_gap_pct\nFROM weekends\nGROUP BY ticker\nORDER BY median_weekend_gap_pct DESC","computed_at":"2026-08-04T12:41:32.813150+00:00","elapsed":0.004554138}