Almost every gamma-exposure chart you have seen is built the same way: take yesterday's end-of-day open interest, assume dealers are short calls and long puts, multiply, plot. It renders instantly and it is wrong in a specific, knowable way — the sign is an assumption, not a measurement, and the data is a day stale before the opening bell.
I spent a while building the other version: sign every option print as it happens and rebuild the dealer's book from the tape. This is a writeup of how that works, what broke along the way, and the uncomfortable result at the end.
The convention is doing the heavy lifting
When a chart says "dealer gamma", it means someone decided which side of every open contract the dealer is on. The standard convention says customers buy calls and buy puts, so dealers are short both, except the sign is flipped for puts to make the arithmetic come out. Reasonable as a prior. Completely untested per strike, per day.
The conventional book is still worth drawing — a lot of people trade off it, so it moves markets whether or not it is right. But it should not be the only book on screen.
Signing prints instead of assuming
The measured book starts from the 0DTE tape and asks, for every print: did this trade at the bid or the ask? Buyer-initiated at the ask, seller-initiated at the bid, dealer takes the other side.
That is the Lee-Ready quote rule, and it has a known failure mode: prints that land exactly at the midpoint are unclassifiable. The textbook fix is a tick rule fallback. The fix that actually mattered here was different.
SPXW quotes sit on a 0.05/0.10 grid. On an odd-tick spread, a print at the exact arithmetic mid is mechanically impossible — the price simply cannot land there. A strict at-mid test therefore under-produces at-mid volume compared to the published benchmarks, not because the market behaves differently but because of the tick grid. So the exact-mid test becomes a band:
MID_BAND_F = 0.20 # unclassified if |px - mid| < f * half_spread
TICK_EPS = 0.01
mid = 0.5 * (ask + bid)
half = 0.5 * (ask - bid)
dev = abs(price - mid)
in_band = dev < MID_BAND_F * half # too close to call
at_ask = ~in_band & (price >= ask - TICK_EPS)
at_bid = ~in_band & (price <= bid + TICK_EPS)
A fifth of the half-spread. Prints inside the band are marked unclassifiable rather than guessed at, which matters more than it sounds — a wrong sign is worse than a missing one, because it moves the number in the opposite direction.
The part that quietly ruins everything: multi-leg orders
Sign prints one at a time and you will get spreads catastrophically wrong.
A trader sells a call spread. Two legs hit the tape. One leg prints at the ask, the other at the bid. Signed independently, you record a customer buy and a customer sell, and the dealer's net position barely moves. In reality the customer put on a single directional structure and the dealer took the whole thing.
So prints get grouped into packages before anything is signed. A condition is treated as multi-leg when at least 80% of its prints share an exchange sequence number:
ML_SHARE_THRESH = 0.80 # multi-leg if >=80% of a condition's prints
# share an exchange sequence with another leg
PKG_KEEP_STATUS = ("ok",) # only packages that reconcile cleanly are kept
The package is signed as one order, and its customer quantity is only kept when the package reconciles. Packages that do not reconcile are dropped rather than half-counted. Again: a hole beats a lie.
Three books, side by side
The result is three different views of the same expiry, and the honest way to present them is next to each other instead of picking a winner.
VOLUME is cumulative session volume by strike under the conventional sign. It shows where today's activity concentrated.
OI is open interest under the usual dealer-short-calls convention — the chart everyone else draws.
MEASURED is net dealer position signed print by print from the tape as described above.
When the three agree, the level is probably real. When they diverge, that divergence is itself the information, and hiding it behind a single blended number would be the least useful thing to do with it.
What gets drawn on top
Once there is a book, the derived levels follow: the zero-gamma flip where net dealer gamma crosses zero, the call wall and put wall at the largest concentrations, a dealer hold band, and the session's net-gamma percentile against every prior session. Then delta and vega exposure profiles, and vanna, charm and 25-delta skew overlays.
All of it recomputes every second while the market is open.
The uncomfortable part
Here is where the writeup stops being a victory lap.
I built a backtesting harness over the full archive and tested whether these levels predict direction — three separate formulations, all of them out of sample. None survived. Not one directional edge cleared an honest bar.
That result shipped. The product has no buy or sell signals, no price targets, no arrows, and the site says why: there is nothing honest to put in them. The levels describe where hedging pressure plausibly sits. They do not tell you what happens next, and a tool that always says yes would just be selling you your own confirmation bias.
This is, commercially, a stupid thing to publish. It is also the only version I would use myself.
Engineering notes
A few decisions that turned out to matter more than expected:
The terminal is the homepage. No marketing splash, no "see how it works" funnel. You land on / and the product is already running. There is a second door at /about for people who want to read first, but the root is the tool.
The server has zero dependencies. One Node file, no framework, the same file locally and in the container. A finished session snapshot is about 5.7 MB of JSON, almost all of it 23,400-long arrays, which gzips roughly 7.7x. So publish writes a pre-compressed twin next to the plain file and the server hands it over whenever the client accepts gzip. Nothing is compressed per request — that cost is paid once, at publish time.
The archive is public on purpose. Every finished session since April 2022 replays in full, with no account and no card. That is 1,083 sessions as of writing. Only the current day is behind the paywall. It sounds like giving away the product; it is actually the only honest way to sell a measurement tool — every level the terminal draws can be checked against a thousand days of history before anyone pays anything.
There is an MCP server, so the same sessions and levels can be queried from an AI assistant conversationally instead of through the UI.
Try it, or don't
The archive is at gex.live — open it, pick any past session, and watch the three books argue with each other. No signup wall. If the measured book and the conventional book agree on a day you remember, that is mildly interesting. If they don't, that is the whole reason the thing exists.
And if you build market-data tooling: the two things I would do differently from the start are grouping packages before signing anything, and being willing to mark data unclassifiable. Both cost you coverage. Both are worth it.



Top comments (0)