{"slug":"am-vs-pm-settled-options","qid":"witching_concentration","label":"The same hypothetical on every session: expiration mornings against the rest of the tape","post_title":"AM vs PM Settled Index Options Explained","post_url":"/blog/am-vs-pm-settled-options#q-witching_concentration","columns":["bucket","group_size","median_gap_abs_pct","median_settlement_spread_usd","median_open_minute_volume_m"],"rows":[{"bucket":"triple witching Friday","group_size":9,"median_gap_abs_pct":0.49,"median_settlement_spread_usd":0,"median_open_minute_volume_m":0.95},{"bucket":"other monthly expiration","group_size":20,"median_gap_abs_pct":0.23,"median_settlement_spread_usd":0.8,"median_open_minute_volume_m":0.75},{"bucket":"ordinary session","group_size":618,"median_gap_abs_pct":0.28,"median_settlement_spread_usd":0.95,"median_open_minute_volume_m":0.62}],"shape":"table","sql":"WITH sessions AS (\n    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session_date,\n           toFloat64(argMin(open, window_start)) AS first_print,\n           toFloat64(argMax(close, window_start)) AS last_print,\n           toFloat64(sumIf(volume, (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n                + toMinute(toTimeZone(window_start, 'America/New_York'))) = 570)) AS open_minute_shares\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND toDate(toTimeZone(window_start, 'America/New_York')) BETWEEN toDate('2023-12-01') AND toDate('2026-07-31')\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 session_date\n),\nsequenced AS (\n    SELECT session_date,\n           first_print,\n           last_print,\n           open_minute_shares,\n           any(last_print) OVER (ORDER BY session_date ASC\n                                 ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prior_close\n    FROM sessions\n),\nlabelled AS (\n    SELECT session_date,\n           multiIf(toDayOfWeek(session_date) = 5\n                       AND toDayOfMonth(session_date) BETWEEN 15 AND 21\n                       AND toMonth(session_date) IN (3, 6, 9, 12), 'triple witching Friday',\n                   toDayOfWeek(session_date) = 5\n                       AND toDayOfMonth(session_date) BETWEEN 15 AND 21, 'other monthly expiration',\n                   'ordinary session') AS bucket,\n           abs(first_print / prior_close - 1) * 100 AS gap_abs_raw,\n           abs(greatest(last_print - round(prior_close, 0), 0)\n               - greatest(first_print - round(prior_close, 0), 0)) AS spread_raw,\n           open_minute_shares / 1000000 AS open_minute_millions\n    FROM sequenced\n    WHERE prior_close > 0\n      AND session_date >= toDate('2024-01-01')\n)\nSELECT bucket,\n       count() AS group_size,\n       round(quantileDeterministic(0.5)(gap_abs_raw, cityHash64(session_date)), 2) AS median_gap_abs_pct,\n       round(quantileDeterministic(0.5)(spread_raw, cityHash64(session_date)), 2) AS median_settlement_spread_usd,\n       round(quantileDeterministic(0.5)(open_minute_millions, cityHash64(session_date)), 2) AS median_open_minute_volume_m\nFROM labelled\nGROUP BY bucket\nORDER BY group_size ASC","computed_at":"2026-08-03T07:28:39.149924+00:00","elapsed":0.005411601}