STRASMORE/EXPLORE 2,882 QUERIES

walk_back

Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-10-01, from when-do-vix-futures-expire.

as of table 4×7read in context →
walk_back — 4 rows by 7 columns, computed from US exchange, SIP and OPRA data.
vix_contractnext_month_third_fridayfriday_statuscounted_back_fromthirty_days_earlierthat_day_statusfinal_settlement_date
VX Jan 2026Fri Feb 20, 2026trading dayFri Feb 20, 2026Wed Jan 21, 2026trading dayWed Jan 21, 2026
VX Dec 2026Fri Jan 15, 2027trading dayFri Jan 15, 2027Wed Dec 16, 2026trading dayWed Dec 16, 2026
VX May 2026Fri Jun 19, 2026exchange holidayThu Jun 18, 2026Tue May 19, 2026trading dayTue May 19, 2026
VX Jun 2024Fri Jul 19, 2024trading dayFri Jul 19, 2024Wed Jun 19, 2024exchange holidayTue Jun 18, 2024
Rows × columns
4 × 7
Computed
Completeness
No missing values
Source
US exchange, SIP and OPRA market data
Licence
Strasmore terms · free, no signup
Formats
JSON · CSV · the SQL below

What each column holds

Column definitions for walk_back, derived from the stored result.
ColumnTypeRangeNotes
vix_contract text 4 distinct values (VX Dec 2026, VX Jan 2026, VX Jun 2024…)
next_month_third_friday text 4 distinct values
friday_status text 2 distinct values (exchange holiday, trading day)
counted_back_from text 4 distinct values
thirty_days_earlier text 4 distinct values
that_day_status text 2 distinct values (exchange holiday, trading day)
final_settlement_date text 4 distinct values

Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.

Run it yourself

This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.

WITH
    traded AS
    (
        SELECT groupArray(session_day) AS session_days
        FROM
        (
            SELECT date AS session_day
            FROM global_markets.stocks_daily_aggs
            WHERE ticker = 'SPY'
              AND date >= toDate('2014-11-01')
            GROUP BY session_day
        )
    ),
    closures_ahead AS
    (
        SELECT groupArray(date) AS closed_days
        FROM global_markets.stocks_market_holidays
        WHERE status = 'closed'
    )
SELECT
    concat('VX ', formatDateTime(contract_month, '%b %Y'))  AS vix_contract,
    formatDateTime(ref_friday, '%a %b %e, %Y')              AS next_month_third_friday,
    if(friday_closed, 'exchange holiday', 'trading day')    AS friday_status,
    formatDateTime(spx_anchor, '%a %b %e, %Y')              AS counted_back_from,
    formatDateTime(wednesday_target, '%a %b %e, %Y')        AS thirty_days_earlier,
    if(target_closed, 'exchange holiday', 'trading day')    AS that_day_status,
    formatDateTime(settlement, '%a %b %e, %Y')              AS final_settlement_date
FROM
(
    SELECT
        a.contract_month AS contract_month,
        a.ref_friday     AS ref_friday,
        ((a.ref_friday <= toDate(arrayMax(t.session_days))) AND (NOT has(t.session_days, a.ref_friday)))
            OR has(h.closed_days, a.ref_friday)             AS friday_closed,
        if(friday_closed, addDays(a.ref_friday, -1), a.ref_friday) AS spx_anchor,
        addDays(spx_anchor, -30)                            AS wednesday_target,
        ((wednesday_target <= toDate(arrayMax(t.session_days))) AND (NOT has(t.session_days, wednesday_target)))
            OR has(h.closed_days, wednesday_target)         AS target_closed,
        if(target_closed, addDays(wednesday_target, -1), wednesday_target) AS settlement
    FROM
    (
        SELECT
            contract_month,
            addMonths(contract_month, 1)                                             AS ref_month,
            addDays(ref_month, ((5 - toInt32(toDayOfWeek(ref_month)) + 7) % 7) + 14) AS ref_friday
        FROM
        (
            SELECT toDate(arrayJoin(['2026-01-01', '2026-12-01', '2026-05-01', '2024-06-01'])) AS contract_month
        )
    ) AS a
    CROSS JOIN traded AS t
    CROSS JOIN closures_ahead AS h
)
ORDER BY multiIf(contract_month = toDate('2026-01-01'), 1,
                 contract_month = toDate('2026-12-01'), 2,
                 contract_month = toDate('2026-05-01'), 3,
                 4) ASC
⌘/Ctrl + Enter

Work with this data in your AI assistant

Opens ready to query, with this page's data. Free, no account.

More from this analysiswhen-do-vix-futures-expire
tuesday_settlements table 5×4 → roll_cycle series 12×3 → calendar_2026 series 12×5 → The 2s10s spread, every print of the half table 124×2 → The 2s10s spread, every print of the half table 124×2 → Every half-year since 1976: the 2y and 10y change, the twist between them, and the half's lowest 2s10s print table 100×7 → See all 2,882 queries →