What Is Triple Witching? Volume & Volatility
Triple witching is the quarterly session when index futures, index options and stock options expire together. Volume and volatility, measured on the real tape.
Triple witching is the quarterly trading session, the third Friday of March, June, September and December, when stock index futures, index options and single-stock options all reach expiration together. Four times a year the whole stack of expiring derivatives has to be settled, closed or rolled forward at once, and index funds execute scheduled rebalances into the same closing print. Below, the last eight witching sessions measured on the real tape: volume, volatility, the closing auction, the strikes. For the calendar itself, every quarterly expiration date, including the Juneteenth shift that moved June 2026 to a Thursday, see the 2026 triple witching dates.
What expires on a triple witching day?
Three families of contracts share the quarterly date: stock index futures (and options on those futures), index options, and single-stock options. Single-stock options expire on the third Friday of every month, what makes the quarterly dates different is the index futures and index options cycle stacking on top.
The two settlement styles split the day in half. Many index futures and index options are AM-settled: they stop trading the prior afternoon and settle against a price computed from the constituent stocks' opening prints, which funnels flow into that morning's opening auctions. Single-stock and ETF options are PM-settled, living until the 4:00 p.m. close.
The third piece of the day is not a derivative at all. The major index families schedule constituent changes, adds, deletes, share-count updates, for these same quarterly dates, and index funds trade those changes at the close. Rebalance flow and expiring positions meet in one closing auction on the same afternoon.
Why is it called witching?
The name borrows the folklore "witching hour," when strange things are supposed to happen. In the 1980s, index futures (S&P 500 futures listed in 1982) and index options joined single-stock options (exchange-listed since 1973) on a shared quarterly calendar, and the final hour of trading on those dates grew notorious enough to earn the nickname "the triple witching hour." Exchanges later moved settlement of the main index contracts to the opening print rather than the close, taking much of the drama out of that last hour. "Quadruple witching" arrived when single-stock futures listed in the US in the early 2000s; the venue carrying them shut in 2020, and the two terms now describe the same four dates.
Triple witching dates: 2024–2027
The rule is simple: the third Friday of March, June, September and December. When that Friday is an exchange holiday, the expiration moves to the preceding trading day, see when options expire for the full calendar, weekly and daily cycles included.
- 2024: March 15, June 21, September 20, December 20
- 2025: March 21, June 20, September 19, December 19
- 2026: March 20, June 18 (moved back from Friday June 19, the Juneteenth holiday, with US exchanges closed), September 18, December 18
- 2027: March 19, June 18, September 17, December 17
The next one is Friday, September 18, 2026.
How heavy is a witching session, really?
Every quarterly witching session on our tape since late 2024, next to the median share volume of the other sessions in the same month. The last column is the receipt for the "heaviest day of the month" claim: it subtracts the month's heaviest non-witching session, so a positive number means witching won the month and a negative one means another session outdid it.
| witching_session | witching_shares_b | other_days_median_b | times_median | gap_to_next_heaviest |
|---|---|---|---|---|
| 2024-09-20 | 13.6 | 10.1 | 1.34 | 1.97 |
| 2024-12-20 | 16.1 | 13.1 | 1.23 | -1.37 |
| 2025-03-21 | 13.9 | 14.3 | 0.97 | -4.03 |
| 2025-06-20 | 16.2 | 15.8 | 1.02 | -7.24 |
| 2025-09-19 | 20.2 | 16.7 | 1.21 | 1.37 |
| 2025-12-19 | 18 | 14.5 | 1.24 | 1.15 |
| 2026-03-20 | 19.9 | 18.9 | 1.05 | -3.14 |
| 2026-06-18 | 26.7 | 20.1 | 1.33 | 1.15 |
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_dayThe volume premium is real and repeatable. The latest witching session, 2026-06-18, traded 26.7 billion shares against a 20.1 billion median for the month's other sessions, 1.33x a typical day, and 1.15 billion shares clear of the next-heaviest June session. The first row, 2024-09-20, printed a similar 1.34x.
But it is not a law, and the table says so. 2025-03-21 traded 0.97x its month's median, slightly below an ordinary session, and finished -4.03 billion shares behind the month's heaviest day. Both signs appear in that last column: witching is a strong bet for the busiest day of its month, not a certainty. Index reconstitutions, quarter-end flows and macro releases all produce sessions that beat it.
Why June 2026's witching fell on a Thursday
The third Friday of June 2026 was June 19, Juneteenth, with US exchanges closed, so the whole quarterly stack expired on Thursday, June 18. The options tape shows where the open positions sat: contract volume traded June 1–18, grouped by the expiration date the contracts carried.
| expiry | contracts_mm |
|---|---|
| 2026-06-18 | 193.7 |
| 2026-06-12 | 113.1 |
| 2026-06-05 | 102.2 |
| 2026-07-17 | 83.8 |
| 2026-06-10 | 41.4 |
| 2026-06-26 | 37.6 |
| 2026-06-17 | 35.9 |
| 2026-06-08 | 34.9 |
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 8Contracts expiring 2026-06-18 drew 193.7 million contracts of trading in those fourteen sessions, against 113.1 million for the next-biggest expiration date, 2026-06-12. Open interest piles onto the quarterly date over months; trading volume follows it there.
Contracts or shares, what actually spikes?
Here is a distinction most witching explainers skip. Positions accumulate into the quarterly expiry, but the option contracts changing hands on the day itself are not remarkable. Below, the witching session sits next to the two ordinary Fridays before it, with each session's same-day-expiring, 0DTE, share broken out.
Witching day handled 79.2 million contracts; the ordinary Friday of 2026-06-05 handled 103.1 million, more. What shifted is the mix: 48.7% of witching-day volume sat in contracts expiring that same session, versus 43.9% and 44.7% on the ordinary Fridays. The witching signature is not "everyone trades more options", it is that the shares market gets busy. Index settlement and fund rebalancing are executed in stock, not in contracts.
Does triple witching raise volatility?
Volume and volatility are different questions, and the second rarely gets checked. This panel measures SPY's intraday high-to-low range on each witching session, as a percentage of the opening price, plus the absolute open-to-close move, each against the median of the same month's other sessions.
| witching_session | witching_range_pct | other_days_median_range_pct | witching_net_move_pct | other_days_median_net_move_pct |
|---|---|---|---|---|
| 2024-09-20 | 0.73 | 0.92 | 0.05 | 0.35 |
| 2024-12-20 | 2.55 | 0.61 | 1.56 | 0.34 |
| 2025-03-21 | 1.23 | 1.72 | 0.88 | 0.75 |
| 2025-06-20 | 1.1 | 0.73 | 0.69 | 0.4 |
| 2025-09-19 | 0.63 | 0.71 | 0.2 | 0.22 |
| 2025-12-19 | 0.68 | 0.7 | 0.59 | 0.22 |
| 2026-03-20 | 1.82 | 1.28 | 1.21 | 0.52 |
| 2026-06-18 | 0.58 | 1.12 | 0.16 | 0.55 |
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_dayThe answer is: not systematically. Witching sessions land on both sides of their month's median. 2024-12-20 ranged 2.55% against a 0.61% median, a genuinely wild session. But the most recent one, 2026-06-18, ranged 0.58% against a 1.12% median, and moved a net 0.16% open-to-close against a 0.55% median: the heaviest volume day of its month was also one of its calmest by price.
That is the honest headline of the whole subject. Witching concentrates scheduled, mechanical flow, and mechanical flow is two-sided by construction, every rolled position is closed in one contract and opened in another, every index add matched by a delete. Enormous volume with an ordinary price path is what that produces.
Inside the closing auction
The one place the day genuinely looks different is the close. This isolates the closing-cross window, the 3:59 and 4:00 p.m. ET bars, which carry the auction print, and measures the dollars that changed hands there on witching day against a typical June session.
| witching_close_dollars_b | other_june_median_close_dollars_b | times_median | witching_close_pct_of_day | other_june_median_close_pct_of_day |
|---|---|---|---|---|
| 56.1 | 36.1 | 1.56 | 4.9 | 3.7 |
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') > 0That window absorbed $56.1 billion of stock on witching day against $36.1 billion for the median June session, 1.56x, and carried 4.9% of its own session's traded dollars versus 3.7% on a typical day. Two minutes of the clock, a twentieth of the money: that is where an index fund with billions to rebalance finds the other side.
Pin risk: do prices gravitate toward big strikes?
"Pin risk," and its cousin "max pain," is the folk theory that an expiring stock gets drawn toward the strike with the largest open interest as dealers hedge those options into the close. Here is what the tape shows: SPY's June 18, 2026 expiring series, ranked by contracts traded, with each strike's distance from where SPY finished the regular session.
| strike | contracts_k | strike_minus_close | pct_from_close |
|---|---|---|---|
| $746 | 1488.3 | -0.56 | 0.08 |
| $747 | 1482.4 | 0.44 | 0.06 |
| $745 | 1096.8 | -1.56 | 0.21 |
| $748 | 858.4 | 1.44 | 0.19 |
| $744 | 613.3 | -2.56 | 0.34 |
| $750 | 568 | 3.44 | 0.46 |
| $749 | 393.1 | 2.44 | 0.33 |
| $743 | 391.3 | -3.56 | 0.48 |
| $740 | 277.1 | -6.56 | 0.88 |
| $742 | 270.4 | -4.56 | 0.61 |
| $751 | 206.3 | 4.44 | 0.59 |
| $741 | 174.4 | -5.56 | 0.74 |
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 12SPY's close landed between the two busiest expiring strikes. The heaviest, $746, took 1488.3 thousand contracts and sat -0.56 points from the close (0.08% away); the second, $747, took 1482.4 thousand and sat 0.44 points on the other side.
Resist the obvious conclusion. Traders concentrate volume at at-the-money strikes by construction, those carry the live outcome and the tightest spreads, so "the heaviest strikes bracket the close" is near-tautological on any expiration, not evidence the close was dragged anywhere. One session cannot separate a magnet from a coincidence. The folk theory does at least have arithmetic underneath it, and running the max pain calculation across a full SPY chain shows both what the number is and how far settlement actually landed from it. What the panel does show: an expiring option struck within a dollar of the money has its whole value decided in that last, crowded minute.
What to actually do differently on witching day
- Discount your relative-volume screens. Every stock screams unusual volume at once. A relative volume reading of 2x on a witching session is the calendar, not a catalyst.
- Expect depth, not calm. Liquidity is deep, which makes large orders easier to work, but the range table above puts witching sessions on both sides of a normal day's swing.
- Mind expiring positions into the close. PM-settled single-stock and ETF options are decided by the closing print; near-the-money contracts flip between worthless and in-the-money in the final minutes.
- Do not read the closing print as sentiment. A twentieth of the day's dollars trades in a two-minute window stuffed with mechanical rebalance orders.
- Know the four dates in advance. The cheapest filter in trading is a calendar.
FAQ
When is the next triple witching day?
Triple witching lands on the third Friday of March, June, September and December. The next one is Friday, September 18, 2026, then December 18, 2026, then March 19, June 18, September 17 and December 17 in 2027.
What is the difference between triple and quadruple witching?
"Quadruple" added single-stock futures to the three classic expiring families (index futures, index options, single-stock options). Those US products disappeared after the venue carrying them closed in 2020, and both terms now describe the same four quarterly dates.
Why is trading volume so high on triple witching days?
Expiration forces a decision on every open derivative position, settle, close, or roll, and index providers schedule constituent rebalances for the same sessions, which index funds execute in stock at the close. The most recent witching session traded 1.33x its month's median share volume, with the closing-cross window alone absorbing $56.1 billion.
Does triple witching make the stock market more volatile?
Not reliably. Measured on SPY, witching sessions fall on both sides of their month's median intraday range: 2024-12-20 ranged 2.55% against a 0.61% median, while 2026-06-18 ranged just 0.58% against a 1.12% median. Heavy volume and a big price move are separate phenomena.
What is pin risk on an expiration day?
Pin risk is the exposure of an option finishing very near its strike: nobody knows until after the close whether it expires worthless or in the money, and a short position can wake up assigned shares. On June 18, 2026, SPY's two busiest expiring strikes sat -0.56 and 0.44 points from the closing price.
Every panel is a stored, versioned query over the real tape, expand the SQL to audit any number, or measure the next witching session yourself on the Strasmore terminal.