How much of the SPX options tape is dealer-to-dealer?
A free daily floor from OCC's capacity data — 505 trading days of SPXW
Every dealer book rebuilt from the tape — this site's included — rests on one assumption: each print is a customer on one side and a dealer on the other, so the dealer's inventory moves by the size of every trade. Some prints are not like that. When two market makers trade with each other, or two customers do, the dealers' net position does not change at all — and a tape-based book still records a full position change. Those trades are not an approximation in such a book; they are noise. The question is how much of the tape they are, and OCC publishes enough every day to put a floor under the answer.
The algebra
OCC's daily volume query reports, per series and per day, how many sides were
traded by each account type: customer (C), firm (F) and market maker (M). Sides, not
trades — every trade contributes two. Call the market-maker share of all sides
m. Among T trades, let x be the number with a
market maker on both sides and y the number with exactly one. Then
2mT = 2x + y and x + y ≤ T, so 2mT ≤ x + T and
x / T ≥ 2m − 1.
Whenever market makers hold more than half of the day's sides, the excess can only come from prints with a dealer on both ends. The bound is exact and needs nothing but the published totals; it is a floor, not an estimate, because the trades with exactly one market maker could be fewer than the algebra allows.
What 505 days of SPXW say
| min | 25th pct | median | 75th pct | 90th pct | max | |
|---|---|---|---|---|---|---|
| market-maker share of sides (m) | 46.7% | 51.4% | 52.7% | 53.8% | 54.5% | 57.9% |
| dealer-to-dealer floor (2m − 1, clipped at 0) | 0 | 2.8% | 5.3% | 7.5% | 9.2% | 15.8% |
The floor is positive on 95.0% of days. The median split of sides is market maker 52.7%, customer 44.7%, firm 2.4%. The worst day in the window is 2026-06-17, when at least 15.8% of SPXW trades had no customer on either side.
| year | days | median m | median floor | floor > 0 |
|---|---|---|---|---|
| 2024 (from Aug 19) | 94 | 51.6% | 3.1% | 94.7% |
| 2025 | 251 | 52.5% | 5.1% | 92.4% |
| 2026 (to Aug 21) | 160 | 53.2% | 6.4% | 99.4% |
It is a weekly-series phenomenon. The monthly SPX series over the same
505 days has a median market-maker share of 50.1%, a positive floor on only 51% of days
and a median floor of 0.2% — and a firm share of 19%, against 2.4% in the weeklys. The
0DTE tape is where dealers trade with dealers.
Checked against exchange truth, once
The floor can be tested on any day for which trade-level data with account capacities exists. Cboe's free trade-by-trade sample for 2025-03-28 is such a day. The OCC bound for that date is 8.6% (m = 54.3%); pairing the sample's trades by execution id gives 9.7% of trades with a market maker on both sides — above the floor, as it must be — plus 5.6% customer-against-customer, which the bound cannot see at all. About 15% of that day's trades had no customer-versus-dealer structure. (Measured 2026-08-17 on the free sample from Cboe DataShop.)
What it is for
A per-session lower bound on how much of a measured dealer book is structurally noise — a confidence weight for the one book nobody can validate intraday, available every evening for free. On a day with a 10% floor, at least one trade in ten moved the book by an amount the dealers never actually absorbed. It bounds the damage; it does not repair it, and it says nothing about the sign of the remaining 90%.
What it does not say
Customer-to-customer prints are invisible to the bound, so the true share of trades with no dealer on exactly one side is higher than the floor — on the one day we could check, by half again. A day with m below 50% gets a floor of zero, not a clean bill. Firms (F) are treated as neither customer nor dealer here; they are 2.4% of SPXW sides. And OCC's window rolls — about two years are available at any time, so the 2024 tail of this sample will not be retrievable for long.
Reproduce it
OCC's volume query is a public URL (no account; curl -g because of the
brackets-free but ampersand-heavy query). One call per date range, one symbol; the
response is CSV with columns quantity, underlying, symbol, actype, porc, exchange,
actdate, where actype is C/F/M and quantity counts
sides. Pull the window in quarter-sized chunks:
curl -g "https://marketdata.theocc.com/volume-query?format=csv&volumeQueryType=O&reportType=C&symbolType=U&symbol=SPX&fromDate=20250101&toDate=20250331" -o spx_2025q1.csv import pandas as pd d = pd.concat(pd.read_csv(f, usecols=range(7)) for f in files).drop_duplicates() d = d[d.symbol == "SPXW"] # the weekly / 0DTE series x = d.groupby(["actdate", "actype"]).quantity.sum().unstack(fill_value=0) m = x["M"] / x.sum(axis=1) # market-maker share of sides floor = (2 * m - 1).clip(lower=0) # dealer-to-dealer lower bound print(m.median(), (floor > 0).mean(), floor.median()) # 0.527, 0.950, 0.053
The SPX dealer books this floor applies to — measured from the tape, minute by minute — are what the session archive holds; the hold-rate study is what their levels did.
Part of gex.live research. Measured on the free session archive; every session is free to replay.