{"slug":"quadruple-witching-vs-triple-witching","qid":"expiry_move","label":"Average absolute open to close move on SPY Fridays, expiration vs ordinary, by year","post_title":"Quadruple Witching vs Triple Witching","post_url":"/blog/quadruple-witching-vs-triple-witching#q-expiry_move","columns":["year","expiry_friday_move_pct","other_friday_move_pct","expiry_session_count"],"rows":[{"year":"2016","expiry_friday_move_pct":0.22,"other_friday_move_pct":0.49,"expiry_session_count":4},{"year":"2017","expiry_friday_move_pct":0.24,"other_friday_move_pct":0.2,"expiry_session_count":4},{"year":"2018","expiry_friday_move_pct":0.78,"other_friday_move_pct":0.61,"expiry_session_count":4},{"year":"2019","expiry_friday_move_pct":0.27,"other_friday_move_pct":0.45,"expiry_session_count":4},{"year":"2020","expiry_friday_move_pct":2.33,"other_friday_move_pct":0.7,"expiry_session_count":4},{"year":"2021","expiry_friday_move_pct":0.44,"other_friday_move_pct":0.51,"expiry_session_count":4},{"year":"2022","expiry_friday_move_pct":0.61,"other_friday_move_pct":1.18,"expiry_session_count":4},{"year":"2023","expiry_friday_move_pct":0.63,"other_friday_move_pct":0.61,"expiry_session_count":4},{"year":"2024","expiry_friday_move_pct":0.44,"other_friday_move_pct":0.45,"expiry_session_count":4},{"year":"2025","expiry_friday_move_pct":0.58,"other_friday_move_pct":0.71,"expiry_session_count":4}],"shape":"ranking","sql":"WITH fridays AS\n(\n    SELECT\n        toYear(date) AS y,\n        abs(100 * (toFloat64(close) - toFloat64(open)) / toFloat64(open)) AS abs_move_pct,\n        (toMonth(date) IN (3, 6, 9, 12) AND toDayOfMonth(date) BETWEEN 15 AND 21) AS is_expiry\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker = 'SPY'\n      AND date >= '2016-01-01'\n      AND date <  today()\n      AND toDayOfWeek(date) = 5\n      AND toFloat64(open) > 0\n)\nSELECT\n    toString(y)                                  AS year,\n    round(avgIf(abs_move_pct, is_expiry = 1), 2) AS expiry_friday_move_pct,\n    round(avgIf(abs_move_pct, is_expiry = 0), 2) AS other_friday_move_pct,\n    countIf(is_expiry = 1)                       AS expiry_session_count\nFROM fridays\nGROUP BY y\nHAVING countIf(is_expiry = 1) >= 2\n   AND countIf(is_expiry = 0) >= 2\nORDER BY y","computed_at":"2026-08-22T04:18:27.971458+00:00","elapsed":0.035484964}