How much of the SPX options book is new each day?
Open-interest change per contract, 1,081 sessions, every SPX expiry within about a month
Most published dealer-gamma numbers are built from open interest: yesterday's outstanding contracts, multiplied by a convention about who holds which side. Whether the convention is right is a separate question (and not this post's). The prior question is simpler: how much of what trades today was already in that book this morning — and how much of tomorrow's book is being created today? Open interest and volume are enough to answer it, and the answer needs no assumption about who bought.
Definitions
For every contract (expiry, strike, right) and every session D: OI(D) is
open interest at the start of D, OI(D+1) at the start of the next session,
ΔOI = OI(D+1) − OI(D), and vol is the day's volume in that
contract. A day's volume can open positions (ΔOI > 0), close them (ΔOI < 0) or do
both; |ΔOI| / vol is therefore a lower bound on how one-sided the
day's trading in that contract was — 1.0 means every lot opened (or every lot closed), 0
means the opens and closes cancelled. Contracts expiring on D have no next-day OI and drop
out of the ΔOI statistics; 4.1% of rows (3.8% of volume) show |ΔOI| > vol, which is
impossible and reflects OI snapshot timing — they are excluded.
The book grows by 40% of what trades, every day
| days to expiry on D | net ΔOI / volume | |ΔOI| / volume (lower bound on one-sidedness) | share of volume in contracts whose OI rose | contract-days |
|---|---|---|---|---|
| 1–5 | 37.8% | 41.8% | 90.3% | 813,013 |
| 6–21 | 42.7% | 53.3% | 81.1% | 2,206,446 |
| 22+ | 42.8% | 57.6% | 76.5% | 831,896 |
Across the whole book, net ΔOI is 39.9% of the day's volume on the median session (interquartile 36.2–44.0%), and it is positive in every year and every expiry bucket: the SPX book is always being built faster than it is unwound, until expiry does the unwinding. Far expiries are open-and-hold — a day's trading in a 22+ DTE contract is at least 58% one-sided — while the nearest expiries churn: 42% at 1–5 DTE. Per contract-day the median lower bound is 0.50, and 22% of contract-days are above 0.9. The numbers move little by year (1–5 DTE: 0.41 in 2022, 0.43 in 2026).
Tomorrow's 0DTE book is made today
Take the contracts that are at 1 DTE today; their OI(D+1) is tomorrow's
opening 0DTE book. On the median session, 44% of that book did not exist
this morning — it was opened today — and the share rises through the sample: 40% in
2024, 50% in 2025, 52% in 2026. Today's volume in those contracts is about equal to
tomorrow's opening OI in them (median ratio 1.06).
On its own day, 0DTE trades six times its opening book
| year | 2022 | 2023 | 2024 | 2025 | 2026 (to Aug) | all |
|---|---|---|---|---|---|---|
| 0DTE volume ÷ 0DTE opening OI, median session | 4.5× | 5.1× | 5.5× | 7.7× | 7.8× | 5.9× |
This is the number an OI-based 0DTE book is up against. On the median 2026 session the contracts expiring that day trade nearly eight times the open interest they started with; most 0DTE positions are opened and closed inside the session and never appear in any OI print. Whatever convention is applied to the morning's open interest, it is being applied to roughly an eighth of the day's 0DTE activity. That is a statement about coverage, not about the convention's sign — and it is why this site measures the intraday book from the tape rather than inferring it from OI, while still showing the OI book beside it.
What it does not say
Nothing here signs a trade. ΔOI tells you positions were opened or closed, not who opened them; the direction of the opening flow is a separate measurement that this post does not make. The one-sidedness numbers are lower bounds — a contract can open 300 and close 300 in a day and show ΔOI = 0. And the sample is one archive: 1,081 sessions from one vendor's end-of-day chain, with the known 3.8% of volume in impossible rows excluded.
Reproduce it
Any end-of-day option-chain feed that carries open interest and volume per contract reproduces every number above — two consecutive days' OI and one day's volume per contract is the whole input. We used ThetaData's SPX/SPXW chain; Cboe, OPRA-derived vendors and most brokers' historical chains carry the same fields. The computation:
d["d_oi"] = d["oi_next"] - d["oi"] # per (expiry, strike, right, date) d = d[d.vol > 0] d = d[d.d_oi.abs() <= d.vol] # drop impossible rows (snapshot timing) d["dte"] = (d.expiration - d.date).dt.days net = d.groupby("dte_bucket").apply(lambda g: g.d_oi.sum() / g.vol.sum()) # table 1 one_sided = d.groupby("dte_bucket").apply(lambda g: g.d_oi.abs().sum() / g.vol.sum()) t1 = d[d.dte == 1].groupby("date").agg(oi_next=("oi_next","sum"), created=("d_oi", lambda x: x.clip(lower=0).sum())) (t1.created / t1.oi_next).median() # tomorrow's 0DTE book made today t0 = d0[d0.dte == 0].groupby("date").agg(oi=("oi","sum"), vol=("vol","sum")) # expiring rows, (t0.vol / t0.oi).median() # before the vol>0 / ΔOI filters
The dealer book this site measures from the tape, minute by minute, is in every archived session; how often its levels held is in the hold-rate study.
Part of gex.live research. Measured on the free session archive; every session is free to replay.