Strasmore Research
Learn am Matt ConnorBy Matt Connor · Updated 2026-07-25

Wetin be triple witching? Volume & volatility

Triple witching na di quarterly session wen index futures, index options and stock options dey expire together. Volume and volatility, measured on di real tape.

Triple witching na di quarterly trading session — di third Friday of March, June, September and December — wen stock index futures, index options and single-stock options all dey expire di same time. Four times a year, di whole pile of expiring derivatives gatz settle, close or roll forward at once, and index funds dey run scheduled rebalances into di same closing print. Below, di last eight witching sessions wey dem measure on di real tape: volume, volatility, di closing auction, di strikes. For di calendar itself — every quarterly expiration date, including di Juneteenth shift wey move June 2026 go Thursday — check di 2026 triple witching dates.

Wetin dey expire for triple witching day?

Three families of contracts dey share the quarterly date: stock index futures (and options on those futures), index options, and single-stock options. Single-stock options dey expire for the third Friday of every month — wetin make the quarterly dates different na the index futures and index options cycle wey dey stack on top.

The two settlement styles split the day for two. Many index futures and index options na AM-settled: dem stop trading the prior afternoon and settle against a price wey dem compute from the constituent stocks' opening prints, wey dey funnel flow into that morning opening auctions. Single-stock and ETF options na PM-settled, dem dey live until the 4:00 p.m. close.

The third piece of the day no be derivative at all. The major index families dey schedule constituent changes — adds, deletes, share-count updates — for these same quarterly dates, and index funds dey trade those changes at the close. Rebalance flow and expiring positions meet for one closing auction for the same afternoon.

Why dem dey call am witching?

Di name come from di old talk about "witching hour," wey be di time wey strange things dey suppose happen. For di 1980s, index futures (S&P 500 futures wey dem list for 1982) and index options join single-stock options (wey don dey for exchange since 1973) for one shared quarterly calendar, and di last hour of trading for those dates become so notorious sotey dem give am di nickname "di triple witching hour." Exchanges later move settlement of di main index contracts go di opening print instead of di close, and dat one remove plenty of di wahala from dat last hour. "Quadruple witching" show face when single-stock futures list for US for early 2000s; di venue wey carry dem close for 2020, and di two terms now dey describe di same four dates.

Triple witching dates: 2024–2027

Di rule simple: na di third Friday of March, June, September and December. If dat Friday fall on exchange holiday, dem go move di expiration go di trading day wey dey before am — check when options expire for di full calendar, plus weekly and daily cycles.

  • 2024: March 15, June 21, September 20, December 20
  • 2025: March 21, June 20, September 19, December 19
  • 2026: March 20, June 18 (dem move am back from Friday June 19 — na Juneteenth holiday, US exchanges no dey open), September 18, December 18
  • 2027: March 19, June 18, September 17, December 17

Di next one na Friday, September 18, 2026.

How heavy witching session dey, for real?

Every quarterly witching session wey dey our tape since late 2024, side-by-side with the median share volume of the other sessions for that same month. The last column na the receipt for the "heaviest day of the month" claim: e dey subtract the month heaviest non-witching session, so if the number positive, witching win the month, and if e negative, another session beat am.

QueryEvery quarterly witching session since September 2024 — market-wide share volume vs. di month oda sessions
The exact SQL behind every number
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
           sum(toFloat64(volume)) / 1e9 AS shares_b
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= '2024-09-01 04:00:00'
      AND window_start < '2026-07-01 04:00:00'
      AND toMonth(toTimeZone(window_start, 'America/New_York')) IN (3, 6, 9, 12)
    GROUP BY day
),
witching AS (
    SELECT toStartOfMonth(day) AS m,
           maxIf(day, day <= addDays(toStartOfMonth(day),
                 ((5 - toDayOfWeek(toStartOfMonth(day)) + 7) % 7) + 14)) AS witching_day
    FROM daily
    GROUP BY m
)
SELECT toString(w.witching_day) AS witching_session,
       round(anyIf(d.shares_b, d.day = w.witching_day), 1) AS witching_shares_b,
       round(quantileDeterministicIf(0.5)(d.shares_b, cityHash64(toString(d.day)), d.day != w.witching_day), 1) AS other_days_median_b,
       round(anyIf(d.shares_b, d.day = w.witching_day)
             / quantileDeterministicIf(0.5)(d.shares_b, cityHash64(toString(d.day)), d.day != w.witching_day), 2) AS times_median,
       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
FROM daily AS d
INNER JOIN witching AS w ON toStartOfMonth(d.day) = w.m
GROUP BY w.witching_day
HAVING countIf(d.day != w.witching_day) > 0
ORDER BY w.witching_day

The volume premium dey real and e dey repeat. The latest witching session, 2026-06-18, trade 26.7 billion shares against 20.1 billion median for the month other sessions — na 1.33x of a normal day, and e clear the next-heaviest June session by 1.15 billion shares. The first row, 2024-09-20, print similar 1.34x.

But e no be law, and the table show am. 2025-03-21 trade 0.97x of im month median — e dey slightly below one ordinary session — and e finish -4.03 billion shares behind the month heaviest day. Both signs show for that last column: witching na strong bet for the busiest day of im month, no be certainty. Index reconstitutions, quarter-end flows and macro releases all fit produce sessions wey beat am.

Why June 2026 witchin fall for Thursday

Di third Friday of June 2026 na June 19 — Juneteenth, wey US exchanges close — so di whole quarterly stack expire for Thursday, June 18. Di options tape show where di open positions siddon: contract volume wey dem trade June 1–18, group by di expiration date wey di contracts carry.

QueryContract volume by expiration date — all US options wey dem trade June 1-18, 2026, top eight expiries
The exact SQL behind every number
SELECT toString(expiry) AS expiry,
       round(sum(vol) / 1e6, 1) AS contracts_mm
FROM (
    SELECT toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) AS expiry,
           toFloat64(volume) AS vol
    FROM global_markets.options_minute_aggs
    WHERE window_start >= '2026-06-01 04:00:00'
      AND window_start < '2026-06-19 04:00:00'
)
WHERE expiry IS NOT NULL
GROUP BY expiry
ORDER BY contracts_mm DESC
LIMIT 8

Contracts wey dey expire 2026-06-18 draw 193.7 million contracts of trading for those fourteen sessions — against 113.1 million for di next-biggest expiration date, 2026-06-12. Open interest dey pile onto di quarterly date over months; trading volume dey follow am go there.

Contract or shares — wetin dey really spike?

Na one difference wey plenty witching explainers dey skip be dis. Positions dey build enter di quarterly expiry, but di option contracts wey dey change hand for di day itself no too special. For down, di witching session sidon near di two ordinary Fridays wey dey before am, and we break out di share of each session own wey dey expire di same day — 0DTE.

QueryWitching Thursday vs. di two ordinary Fridays before am — US option contracts wey dem trade, and di same-day-expiring share
The exact SQL behind every number
SELECT toString(d) AS session_date,
       round(sum(vol) / 1e6, 1) AS all_contracts_mm,
       round(sumIf(vol, expiry = d) / 1e6, 1) AS expiring_same_day_mm,
       round(sumIf(vol, expiry = d) / sum(vol) * 100, 1) AS pct_expiring_same_day
FROM (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) AS expiry,
           toFloat64(volume) AS vol
    FROM global_markets.options_minute_aggs
    WHERE (window_start >= '2026-06-05 04:00:00' AND window_start < '2026-06-06 04:00:00')
       OR (window_start >= '2026-06-12 04:00:00' AND window_start < '2026-06-13 04:00:00')
       OR (window_start >= '2026-06-18 04:00:00' AND window_start < '2026-06-19 04:00:00')
)
WHERE expiry IS NOT NULL
GROUP BY d
ORDER BY d

Witching day handle 79.2 million contracts; di ordinary Friday of 2026-06-05 handle 103.1 million — e pass. Wetin change na di mix: 48.7% of witching-day volume siddon for contracts wey dey expire dat same session, against 43.9% and 44.7% for di ordinary Fridays. Di witching signature no be "everybody dey trade more options" — e be say di shares market dey busy. Index settlement and fund rebalancing dem dey execute for stock, no be for contract.

Triple witching dey raise volatility?

Volume and volatility na different tori, and people no too dey check di second one. Dis panel dey measure SPY intraday high-to-low range for each witching session, as percentage of di opening price, plus di absolute open-to-close move — each one against di median of oda sessions for di same month.

QuerySPY on witching sessions vs. di same month oda sessions — intraday range and net move (% of di open)
The exact SQL behind every number
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
           toFloat64(max(high) - min(low)) / toFloat64(argMin(open, window_start)) * 100 AS range_pct,
           abs(toFloat64(argMax(close, window_start)) - toFloat64(argMin(open, window_start)))
               / toFloat64(argMin(open, window_start)) * 100 AS net_move_pct
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= '2024-09-01 04:00:00'
      AND window_start < '2026-07-01 04:00:00'
      AND toMonth(toTimeZone(window_start, 'America/New_York')) IN (3, 6, 9, 12)
      AND toHour(toTimeZone(window_start, 'America/New_York')) >= 9
      AND toHour(toTimeZone(window_start, 'America/New_York')) < 16
      AND NOT (toHour(toTimeZone(window_start, 'America/New_York')) = 9
               AND toMinute(toTimeZone(window_start, 'America/New_York')) < 30)
    GROUP BY day
),
witching AS (
    SELECT toStartOfMonth(day) AS m,
           maxIf(day, day <= addDays(toStartOfMonth(day),
                 ((5 - toDayOfWeek(toStartOfMonth(day)) + 7) % 7) + 14)) AS witching_day
    FROM daily
    GROUP BY m
)
SELECT toString(w.witching_day) AS witching_session,
       round(anyIf(d.range_pct, d.day = w.witching_day), 2) AS witching_range_pct,
       round(quantileDeterministicIf(0.5)(d.range_pct, cityHash64(toString(d.day)), d.day != w.witching_day), 2) AS other_days_median_range_pct,
       round(anyIf(d.net_move_pct, d.day = w.witching_day), 2) AS witching_net_move_pct,
       round(quantileDeterministicIf(0.5)(d.net_move_pct, cityHash64(toString(d.day)), d.day != w.witching_day), 2) AS other_days_median_net_move_pct
FROM daily AS d
INNER JOIN witching AS w ON toStartOfMonth(d.day) = w.m
GROUP BY w.witching_day
HAVING countIf(d.day != w.witching_day) > 0
ORDER BY w.witching_day

Di answer be: e no dey happen systematically. Witching sessions dey land for both sides of dia month median. 2024-12-20 range na 2.55% against 0.61% median — dat one na truly wild session. But di most recent one, 2026-06-18, range na 0.58% against 1.12% median, and e move net 0.16% open-to-close against 0.55% median: di day wey get heaviest volume for im month also be one of di calmest ones by price.

Dat na di honest headline of di whole mata. Witching dey concentrate scheduled, mechanical flow, and mechanical flow na two-sided by construction — every rolled position dem close am for one contract and open am for anoda, every index add match by a delete. Enormous volume with ordinary price path na wetin dat one dey produce.

Inside di closing auction

Di one place wey di day truly look different na di close. Dis one dey isolate di closing-cross window — di 3:59 and 4:00 p.m. ET bars, wey carry di auction print — and measure di dollars wey change hand for there on witching day against wetin dey happen for normal June session.

QueryDi closing-cross window (3:59-4:00 p.m. ET) — dollar volume on witching day vs. a typical June 2026 session
The exact SQL behind every number
WITH sessions AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
           sumIf(toFloat64(close) * toFloat64(volume),
                 toHour(toTimeZone(window_start, 'America/New_York')) = 16
                 OR (toHour(toTimeZone(window_start, 'America/New_York')) = 15
                     AND toMinute(toTimeZone(window_start, 'America/New_York')) = 59)) AS close_dollars,
           sum(toFloat64(close) * toFloat64(volume)) AS day_dollars
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= '2026-06-01 04:00:00'
      AND window_start < '2026-07-01 04:00:00'
      AND toHour(toTimeZone(window_start, 'America/New_York')) >= 9
      AND toHour(toTimeZone(window_start, 'America/New_York')) <= 16
      AND NOT (toHour(toTimeZone(window_start, 'America/New_York')) = 9
               AND toMinute(toTimeZone(window_start, 'America/New_York')) < 30)
      AND NOT (toHour(toTimeZone(window_start, 'America/New_York')) = 16
               AND toMinute(toTimeZone(window_start, 'America/New_York')) > 0)
    GROUP BY day
)
SELECT round(anyIf(close_dollars, day = '2026-06-18') / 1e9, 1) AS witching_close_dollars_b,
       round(quantileDeterministicIf(0.5)(close_dollars, cityHash64(toString(day)), day != '2026-06-18') / 1e9, 1) AS other_june_median_close_dollars_b,
       round(anyIf(close_dollars, day = '2026-06-18')
             / quantileDeterministicIf(0.5)(close_dollars, cityHash64(toString(day)), day != '2026-06-18'), 2) AS times_median,
       round(anyIf(close_dollars / day_dollars, day = '2026-06-18') * 100, 1) AS witching_close_pct_of_day,
       round(quantileDeterministicIf(0.5)(close_dollars / day_dollars, cityHash64(toString(day)), day != '2026-06-18') * 100, 1) AS other_june_median_close_pct_of_day
FROM sessions
HAVING countIf(day != '2026-06-18') > 0

Dat window absorb $56.1 billion of stock on witching day against $36.1 billion for di median June session — 1.56x — and e carry 4.9% of im own session traded dollars versus 3.7% on a typical day. Two minutes of di clock, one-twentieth of di money: na there one index fund wey get billions to rebalance go find di other side.

Pin risk: e get as price dey move go near big strikes?

"Pin risk," and im cousin "max pain," na the street talk wey dey talk say one stock wey dey expire dey get draw go near the strike wey get the biggest open interest as dealers dey hedge those options as market dey close. Na wetin the tape show be this: SPY im June 18, 2026 expiring series, wey dem rank by contracts wey dem trade, with each strike im distance from where SPY finish the regular session.

QuerySPY expiring June 18, 2026 series — contracts wey dem trade by strike, and each strike distance from di closing price
The exact SQL behind every number
WITH spy_close AS (
    SELECT toFloat64(argMax(close, window_start)) AS px
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2026-06-18 09:30:00', 'America/New_York')
      AND window_start < toDateTime('2026-06-18 16:00:00', 'America/New_York')
),
strikes AS (
    SELECT toFloat64(substring(ticker, length(ticker) - 7, 8)) / 1000 AS strike,
           sum(toFloat64(size)) AS contracts
    FROM global_markets.options_trades
    WHERE ticker LIKE 'O:SPY260618%'
      AND sip_timestamp >= '2026-06-18 08:00:00'
      AND sip_timestamp < '2026-06-19 01:00:00'
    GROUP BY strike
)
SELECT concat('$', toString(toInt32(s.strike))) AS strike,
       round(s.contracts / 1000, 1) AS contracts_k,
       round(s.strike - c.px, 2) AS strike_minus_close,
       round(abs(s.strike - c.px) / c.px * 100, 2) AS pct_from_close
FROM strikes AS s
CROSS JOIN spy_close AS c
ORDER BY s.contracts DESC, s.strike ASC
LIMIT 12

SPY im close land between the two expiring strikes wey busy pass. The heaviest one, $746, carry 1488.3 thousand contracts and e sit -0.56 points from the close (0.08% away); the second one, $747, carry 1482.4 thousand and e sit 0.44 points for the other side.

No gree for the obvious conclusion. Traders dey concentrate volume for at-the-money strikes by design — those ones dey carry the live outcome and the tightest spreads — so "the heaviest strikes bracket the close" na near-tautology for any expiration, e no be evidence say dem drag the close go anywhere. One session no fit separate magnet from coincidence. Wetin the panel really show: one expiring option wey dem strike within one dollar of the money get im whole value decided for that last, crowded minute.

Wetin you suppose do different for witching day

  • No trust your relative-volume screens. Every stock go show unusual volume for the same time. One relative volume reading of 2x for witching session na because of the calendar, no be say something dey push am.
  • Expect deep market, no be calm market. Liquidity plenty, wey dey make big orders easy to work — but the range table wey dey up show say witching sessions fit land for both sides of normal day swing.
  • Watch expiring positions as market dey close. PM-settled single-stock and ETF options dey decided by the closing print; contracts wey dey near-the-money fit change from worthless to in-the-money for the final minutes.
  • No read the closing print as sentiment. One-twentieth of the day dollars dey trade inside two-minute window wey full with mechanical rebalance orders.
  • Know the four dates ahead of time. The cheapest filter for trading na calendar.

FAQ

When di next triple witching day go happen?

Triple witching dey always fall for di third Friday of March, June, September and December. Di next one na Friday, September 18, 2026, den December 18, 2026, den for 2027 e go be March 19, June 18, September 17 and December 17.

Wetin be di difference between triple and quadruple witching?

"Quadruple" add single-stock futures join di three classic expiring families (index futures, index options, single-stock options). Dose US products vanish afta di venue wey carry dem close for 2020, and now both terms dey describe di same four quarterly dates.

Why trading volume dey high well-well for triple witching days?

Expiration dey force decision for every open derivative position — weda to settle, close, or roll — and index providers dey schedule constituent rebalances for di same sessions, wey index funds go execute for stock at di close. Di most recent witching session trade 1.33x im month median share volume, and di closing-cross window alone absorb $56.1 billion.

Triple witching dey make stock market more volatile?

E no dey reliable. Wen dem measure am on SPY, witching sessions dey fall for both sides of dia month median intraday range: 2024-12-20 range 2.55% against a 0.61% median, while 2026-06-18 range just 0.58% against a 1.12% median. Heavy volume and big price move na separate phenomena.

Wetin be pin risk for expiration day?

Pin risk na di exposure of an option wey finish very near im strike: nobody sabi until afta di close weda e go expire worthless or in di money, and a short position fit wake up see assigned shares. On June 18, 2026, SPY two busiest expiring strikes siddon -0.56 and 0.44 points from di closing price.


Every panel na stored, versioned query over di real tape — expand di SQL to audit any number, or measure di next witching session yourself on di Strasmore terminal.