{"slug":"when-do-vix-futures-expire","qid":"calendar_2026","label":"calendar_2026","post_title":"when-do-vix-futures-expire","post_url":"/blog/when-do-vix-futures-expire#q-calendar_2026","columns":["settlement_date","settlement_label","vix_contract","spx_anchor_friday","days_from_equity_expiry"],"rows":[{"settlement_date":"2026-01-21","settlement_label":"Wed Jan 21","vix_contract":"VX Jan 2026","spx_anchor_friday":"Feb 20","days_from_equity_expiry":5},{"settlement_date":"2026-02-18","settlement_label":"Wed Feb 18","vix_contract":"VX Feb 2026","spx_anchor_friday":"Mar 20","days_from_equity_expiry":-2},{"settlement_date":"2026-03-18","settlement_label":"Wed Mar 18","vix_contract":"VX Mar 2026","spx_anchor_friday":"Apr 17","days_from_equity_expiry":-2},{"settlement_date":"2026-04-15","settlement_label":"Wed Apr 15","vix_contract":"VX Apr 2026","spx_anchor_friday":"May 15","days_from_equity_expiry":-2},{"settlement_date":"2026-05-19","settlement_label":"Tue May 19","vix_contract":"VX May 2026","spx_anchor_friday":"Jun 18","days_from_equity_expiry":4},{"settlement_date":"2026-06-17","settlement_label":"Wed Jun 17","vix_contract":"VX Jun 2026","spx_anchor_friday":"Jul 17","days_from_equity_expiry":-2},{"settlement_date":"2026-07-22","settlement_label":"Wed Jul 22","vix_contract":"VX Jul 2026","spx_anchor_friday":"Aug 21","days_from_equity_expiry":5},{"settlement_date":"2026-08-19","settlement_label":"Wed Aug 19","vix_contract":"VX Aug 2026","spx_anchor_friday":"Sep 18","days_from_equity_expiry":-2},{"settlement_date":"2026-09-16","settlement_label":"Wed Sep 16","vix_contract":"VX Sep 2026","spx_anchor_friday":"Oct 16","days_from_equity_expiry":-2},{"settlement_date":"2026-10-21","settlement_label":"Wed Oct 21","vix_contract":"VX Oct 2026","spx_anchor_friday":"Nov 20","days_from_equity_expiry":5},{"settlement_date":"2026-11-18","settlement_label":"Wed Nov 18","vix_contract":"VX Nov 2026","spx_anchor_friday":"Dec 18","days_from_equity_expiry":-2},{"settlement_date":"2026-12-16","settlement_label":"Wed Dec 16","vix_contract":"VX Dec 2026","spx_anchor_friday":"Jan 15","days_from_equity_expiry":-2}],"shape":"series","sql":"WITH\n    traded AS\n    (\n        SELECT groupArray(session_day) AS session_days\n        FROM\n        (\n            SELECT date AS session_day\n            FROM global_markets.stocks_daily_aggs\n            WHERE ticker = 'SPY'\n              AND date >= toDate('2014-11-01')\n            GROUP BY session_day\n        )\n    ),\n    closures_ahead AS\n    (\n        SELECT groupArray(date) AS closed_days\n        FROM global_markets.stocks_market_holidays\n        WHERE status = 'closed'\n    )\nSELECT\n    toString(settlement)                                    AS settlement_date,\n    formatDateTime(settlement, '%a %b %e')                  AS settlement_label,\n    concat('VX ', formatDateTime(contract_month, '%b %Y'))  AS vix_contract,\n    formatDateTime(spx_anchor, '%b %e')                     AS spx_anchor_friday,\n    toInt32(dateDiff('day', equity_monthly, settlement))    AS days_from_equity_expiry\nFROM\n(\n    SELECT\n        a.contract_month AS contract_month,\n        a.equity_monthly AS equity_monthly,\n        if(((a.ref_friday <= toDate(arrayMax(t.session_days))) AND (NOT has(t.session_days, a.ref_friday)))\n            OR has(h.closed_days, a.ref_friday),\n           addDays(a.ref_friday, -1),\n           a.ref_friday)                                    AS spx_anchor,\n        addDays(spx_anchor, -30)                            AS wednesday_target,\n        if(((wednesday_target <= toDate(arrayMax(t.session_days))) AND (NOT has(t.session_days, wednesday_target)))\n            OR has(h.closed_days, wednesday_target),\n           addDays(wednesday_target, -1),\n           wednesday_target)                                AS settlement\n    FROM\n    (\n        SELECT\n            contract_month,\n            addMonths(contract_month, 1)                                                       AS ref_month,\n            addDays(ref_month, ((5 - toInt32(toDayOfWeek(ref_month)) + 7) % 7) + 14)           AS ref_friday,\n            addDays(contract_month, ((5 - toInt32(toDayOfWeek(contract_month)) + 7) % 7) + 14) AS equity_monthly\n        FROM\n        (\n            SELECT addMonths(toDate('2026-01-01'), toInt32(arrayJoin(range(12)))) AS contract_month\n        )\n    ) AS a\n    CROSS JOIN traded AS t\n    CROSS JOIN closures_ahead AS h\n)\nORDER BY settlement ASC","computed_at":"2026-10-01T15:14:21.749560+00:00","elapsed":0.125405905}