{"slug":"what-time-do-options-stop-trading","qid":"closing_tail","label":"SPY and SPX option volume by the minute, 15:45 to 16:25 ET","post_title":"What Time Do Options Stop Trading?","post_url":"/blog/what-time-do-options-stop-trading#q-closing_tail","columns":["et_time","spy_pct","spx_pct"],"rows":[{"et_time":"15:45","spy_pct":11,"spx_pct":5.21},{"et_time":"15:46","spy_pct":3.07,"spx_pct":3.77},{"et_time":"15:47","spy_pct":3.19,"spx_pct":3.78},{"et_time":"15:48","spy_pct":3.04,"spx_pct":3.79},{"et_time":"15:49","spy_pct":3.03,"spx_pct":4.36},{"et_time":"15:50","spy_pct":4.92,"spx_pct":6.83},{"et_time":"15:51","spy_pct":2.72,"spx_pct":4.27},{"et_time":"15:52","spy_pct":3.17,"spx_pct":5.99},{"et_time":"15:53","spy_pct":2.93,"spx_pct":4.44},{"et_time":"15:54","spy_pct":3.7,"spx_pct":6.08},{"et_time":"15:55","spy_pct":3.93,"spx_pct":6.81},{"et_time":"15:56","spy_pct":3.09,"spx_pct":4.8},{"et_time":"15:57","spy_pct":3.36,"spx_pct":4.48},{"et_time":"15:58","spy_pct":3.2,"spx_pct":4.67},{"et_time":"15:59","spy_pct":6.14,"spx_pct":8.25},{"et_time":"16:00","spy_pct":4.12,"spx_pct":1.76},{"et_time":"16:01","spy_pct":2.57,"spx_pct":1.32},{"et_time":"16:02","spy_pct":2.29,"spx_pct":1.27},{"et_time":"16:03","spy_pct":2.55,"spx_pct":1.52},{"et_time":"16:04","spy_pct":2.97,"spx_pct":1.02},{"et_time":"16:05","spy_pct":3.25,"spx_pct":1.56},{"et_time":"16:06","spy_pct":3.27,"spx_pct":1.29},{"et_time":"16:07","spy_pct":2.34,"spx_pct":1.5},{"et_time":"16:08","spy_pct":1.46,"spx_pct":1.53},{"et_time":"16:09","spy_pct":1.51,"spx_pct":1.98},{"et_time":"16:10","spy_pct":2.07,"spx_pct":1.76},{"et_time":"16:11","spy_pct":1.71,"spx_pct":1.18},{"et_time":"16:12","spy_pct":1.37,"spx_pct":1.49},{"et_time":"16:13","spy_pct":3.42,"spx_pct":0.85},{"et_time":"16:14","spy_pct":4.59,"spx_pct":0.81},{"et_time":"16:15","spy_pct":0,"spx_pct":0.28},{"et_time":"16:16","spy_pct":0,"spx_pct":0.21},{"et_time":"16:17","spy_pct":0,"spx_pct":0.27},{"et_time":"16:18","spy_pct":0,"spx_pct":0.16},{"et_time":"16:19","spy_pct":0,"spx_pct":0.18},{"et_time":"16:20","spy_pct":0,"spx_pct":0.11},{"et_time":"16:21","spy_pct":0,"spx_pct":0.11},{"et_time":"16:22","spy_pct":0,"spx_pct":0.13},{"et_time":"16:23","spy_pct":0,"spx_pct":0.05},{"et_time":"16:24","spy_pct":0,"spx_pct":0.05},{"et_time":"16:25","spy_pct":0,"spx_pct":0.05}],"shape":"series","sql":"SELECT\n    et_time,\n    round(100 * spy_contracts / sum(spy_contracts) OVER (), 2) AS spy_pct,\n    round(100 * spx_contracts / sum(spx_contracts) OVER (), 2) AS spx_pct\nFROM\n(\n    SELECT\n        concat(toString(intDiv(945 + grid.slot, 60)), ':',\n               leftPad(toString(modulo(945 + grid.slot, 60)), 2, '0')) AS et_time,\n        ifNull(tape.spy_contracts, 0)                                  AS spy_contracts,\n        ifNull(tape.spx_contracts, 0)                                  AS spx_contracts\n    FROM\n    (\n        SELECT arrayJoin(range(41)) AS slot\n    ) AS grid\n    LEFT JOIN\n    (\n        WITH\n            extract(ticker, '^O:([A-Z]+)')                AS root,\n            toTimeZone(sip_timestamp, 'America/New_York') AS et\n        SELECT\n            toHour(et) * 60 + toMinute(et) - 945 AS slot,\n            sumIf(size, root = 'SPY')            AS spy_contracts,\n            sumIf(size, root IN ('SPX', 'SPXW')) AS spx_contracts\n        FROM global_markets.options_trades\n        WHERE (ticker LIKE 'O:SPY%' OR ticker LIKE 'O:SPX%')\n          AND root IN ('SPY', 'SPX', 'SPXW')\n          AND sip_timestamp >= '2026-07-13 19:45:00'\n          AND sip_timestamp <  '2026-07-17 20:30:00'\n          AND (toHour(et) * 60 + toMinute(et)) BETWEEN 945 AND 985\n        GROUP BY slot\n    ) AS tape ON tape.slot = grid.slot\n)\nORDER BY et_time","computed_at":"2026-08-16T14:08:28.469369+00:00","elapsed":1.727999906}