{"slug":"quadruple-witching-vs-triple-witching","qid":"intraday_shape","label":"Share of SPY regular hours volume by half hour: expiration Friday vs the Friday after","post_title":"Quadruple Witching vs Triple Witching","post_url":"/blog/quadruple-witching-vs-triple-witching#q-intraday_shape","columns":["et_time","expiry_friday_pct","ordinary_friday_pct"],"rows":[{"et_time":"09:30","expiry_friday_pct":8.07,"ordinary_friday_pct":11.59},{"et_time":"10:00","expiry_friday_pct":5.9,"ordinary_friday_pct":7.39},{"et_time":"10:30","expiry_friday_pct":14.17,"ordinary_friday_pct":5.12},{"et_time":"11:00","expiry_friday_pct":4.89,"ordinary_friday_pct":7.32},{"et_time":"11:30","expiry_friday_pct":6.43,"ordinary_friday_pct":5.36},{"et_time":"12:00","expiry_friday_pct":5.21,"ordinary_friday_pct":4.75},{"et_time":"12:30","expiry_friday_pct":3.34,"ordinary_friday_pct":5.09},{"et_time":"13:00","expiry_friday_pct":3.57,"ordinary_friday_pct":6.88},{"et_time":"13:30","expiry_friday_pct":3.81,"ordinary_friday_pct":5.26},{"et_time":"14:00","expiry_friday_pct":7.66,"ordinary_friday_pct":6.65},{"et_time":"14:30","expiry_friday_pct":7.1,"ordinary_friday_pct":6.19},{"et_time":"15:00","expiry_friday_pct":8.96,"ordinary_friday_pct":8.92},{"et_time":"15:30","expiry_friday_pct":20.34,"ordinary_friday_pct":19},{"et_time":"16:00","expiry_friday_pct":0.54,"ordinary_friday_pct":0.46}],"shape":"series","sql":"WITH bars AS\n(\n    SELECT\n        toTimeZone(window_start, 'America/New_York')         AS et,\n        toDate(toTimeZone(window_start, 'America/New_York')) AS session,\n        toFloat64(volume)                                    AS vol\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND window_start >= '2026-03-20 00:00:00'\n      AND window_start <  '2026-03-28 00:00:00'\n      AND toDate(toTimeZone(window_start, 'America/New_York')) IN ('2026-03-20', '2026-03-27')\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) <= 960\n),\nday_totals AS\n(\n    SELECT\n        sumIf(vol, session = '2026-03-20') AS expiry_total,\n        sumIf(vol, session = '2026-03-27') AS ordinary_total\n    FROM bars\n)\nSELECT\n    formatDateTime(toStartOfInterval(b.et, INTERVAL 30 MINUTE), '%H:%i')            AS et_time,\n    round(100 * sumIf(b.vol, b.session = '2026-03-20') / any(t.expiry_total), 2)    AS expiry_friday_pct,\n    round(100 * sumIf(b.vol, b.session = '2026-03-27') / any(t.ordinary_total), 2)  AS ordinary_friday_pct\nFROM bars AS b\nCROSS JOIN day_totals AS t\nGROUP BY et_time\nORDER BY et_time","computed_at":"2026-08-22T04:18:27.654781+00:00","elapsed":0.147158736}