{"slug":"what-is-triple-witching","qid":"witching_history","label":"Every quarterly witching session since September 2024: market-wide share volume vs. the month's other sessions","post_title":"What Is Triple Witching? Volume & Volatility","post_url":"/blog/what-is-triple-witching#q-witching_history","columns":["witching_session","witching_shares_b","other_days_median_b","times_median","gap_to_next_heaviest"],"rows":[{"witching_session":"2024-09-20","witching_shares_b":13.6,"other_days_median_b":10.1,"times_median":1.34,"gap_to_next_heaviest":1.97},{"witching_session":"2024-12-20","witching_shares_b":16.1,"other_days_median_b":13.1,"times_median":1.23,"gap_to_next_heaviest":-1.37},{"witching_session":"2025-03-21","witching_shares_b":13.9,"other_days_median_b":14.3,"times_median":0.97,"gap_to_next_heaviest":-4.03},{"witching_session":"2025-06-20","witching_shares_b":16.2,"other_days_median_b":15.8,"times_median":1.02,"gap_to_next_heaviest":-7.24},{"witching_session":"2025-09-19","witching_shares_b":20.2,"other_days_median_b":16.7,"times_median":1.21,"gap_to_next_heaviest":1.37},{"witching_session":"2025-12-19","witching_shares_b":18,"other_days_median_b":14.5,"times_median":1.24,"gap_to_next_heaviest":1.15},{"witching_session":"2026-03-20","witching_shares_b":19.9,"other_days_median_b":18.9,"times_median":1.05,"gap_to_next_heaviest":-3.14},{"witching_session":"2026-06-18","witching_shares_b":26.7,"other_days_median_b":20.1,"times_median":1.33,"gap_to_next_heaviest":1.15}],"shape":"series","sql":"WITH daily AS (\n    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,\n           sum(toFloat64(volume)) / 1e9 AS shares_b\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE window_start >= '2024-09-01 04:00:00'\n      AND window_start < '2026-07-01 04:00:00'\n      AND toMonth(toTimeZone(window_start, 'America/New_York')) IN (3, 6, 9, 12)\n    GROUP BY day\n),\nwitching AS (\n    SELECT toStartOfMonth(day) AS m,\n           maxIf(day, day <= addDays(toStartOfMonth(day),\n                 ((5 - toDayOfWeek(toStartOfMonth(day)) + 7) % 7) + 14)) AS witching_day\n    FROM daily\n    GROUP BY m\n)\nSELECT toString(w.witching_day) AS witching_session,\n       round(anyIf(d.shares_b, d.day = w.witching_day), 1) AS witching_shares_b,\n       round(quantileDeterministicIf(0.5)(d.shares_b, cityHash64(toString(d.day)), d.day != w.witching_day), 1) AS other_days_median_b,\n       round(anyIf(d.shares_b, d.day = w.witching_day)\n             / quantileDeterministicIf(0.5)(d.shares_b, cityHash64(toString(d.day)), d.day != w.witching_day), 2) AS times_median,\n       round(anyIf(d.shares_b, d.day = w.witching_day) - maxIf(d.shares_b, d.day != w.witching_day), 2) AS gap_to_next_heaviest\nFROM daily AS d\nINNER JOIN witching AS w ON toStartOfMonth(d.day) = w.m\nGROUP BY w.witching_day\nHAVING countIf(d.day != w.witching_day) > 0\nORDER BY w.witching_day","computed_at":"2026-08-10T14:15:56.540186+00:00","elapsed":0.004893761}