The formula, one contract at a time
Every public gamma exposure number starts from the same per-contract expression:
GEX = gamma × open interest × 100 × spot² × 0.01
Sum that across the chain, sign calls positive and puts negative, and you have net GEX. SpotGamma writes it as "Dollar GEX per 1% move = Γ × modeled dealer position × contract multiplier × spot² × 0.01," and Michael Perfiliev's widely copied walkthrough uses the same construction. The arithmetic is not the hard part. What each term is doing, and which of them is a measurement versus a guess, is.
The two factors of spot confuse people, and they fall straight out of the units. Gamma is quoted per share, per one dollar of underlying move. Multiply by open interest and by the 100-share contract multiplier and you have the change in share delta across the whole strike for a $1 move. Multiply by spot and share delta becomes dollar delta — the amount of underlying that has to be bought or sold to stay hedged. That is one factor of spot, and it is already a complete, usable number: dollars of hedging per $1 move.
The conventional quote is per 1% move instead, because a fixed $1 move means something different on a $40 stock than on a 7,700-point index. A 1% move is spot × 0.01 dollars, so multiplying the per-$1 figure by that term supplies the second factor of spot and the 0.01. Nothing in the formula is arbitrary; it is a unit conversion from gamma-per-share to dollars-of-hedging-per-percent.
The conversion factor between the two conventions is spot × 0.01. On SPX near 7,700 that is 77: the same book quoted per-$1 and per-1% differs by a factor of 77, and neither number is wrong. If a chart does not label its axis, its magnitude is uninterpretable. SquawkFlow's computed path stops at the per-$1 form — our service multiplies gamma × open interest × 100 × spot and treats the result as dollar delta per $1 move, as our free SPX GEX page states in its method note.
Where each input comes from, and what it costs
Three inputs, three very different acquisition problems.
Open interest is the only genuinely observed quantity in the formula. It is a cleared, settled count of contracts outstanding, published once per session rather than streamed — Perfiliev's walkthrough, which sources its chain from Cboe's free delayed quotes export, flags that open interest is "updated once per day," typically reflecting the prior close. Free, accurate, and a day stale by construction; everything downstream inherits that staleness. If the distinction between contracts outstanding and contracts traded is fuzzy, open interest explained is the prerequisite.
Implied volatility you either take from your vendor's chain or build yourself as a surface. It is the term that quietly decides your answer, because gamma is a function of it.
Gamma is not published by any exchange. Most chains ship a gamma column, in which case you read it off and inherit the vendor's IV and rate assumptions. Otherwise you compute it from Black-Scholes:
gamma = e^(-q × T) × N'(d1) / (S × sigma × sqrt(T))
where d1 = [ln(S/K) + (r - q + sigma²/2) × T] / (sigma × sqrt(T)), N' is the standard normal density, S is spot, K the strike, sigma the implied volatility, T the time to expiry in years, r the risk-free rate and q the dividend yield. Rates and dividends barely matter at short tenors; volatility matters a lot.
The contract multiplier is the one term you can look up and stop worrying about. Cboe's SPX contract specifications list the multiplier as 100, the same as standard US equity and ETF options.
The sign is an assumption, not a measurement
Here is the load-bearing step, and the one most tutorials rush. Open interest tells you a contract exists. It does not tell you which side of it a dealer is on. The standard resolution is a convention: assume dealers are long the calls and short the puts, so call gamma counts positive and put gamma counts negative.
SpotGamma, which sells these levels for a living, states the limit plainly: "A call-positive/put-negative public-data formula is a simplifying inventory convention — not a rule of option mathematics and not a direct observation of every dealer book," and, more bluntly, "GEX is a model output, not an exchange-published statistic." FlashAlpha's worked example puts it as "the formula is exact; the positioning interpretation is a model," and notes the assumption is usually roughly right for index products and sometimes wrong for single names around events.
Treat the sign as a hypothesis. If it is wrong at a strike, the level you drew was never real.
Aggregate to the strike, then to the total
The mechanical part. For each contract, compute its dollar gamma, then add it into a per-strike bucket: call contributions increase the strike's call GEX, put contributions decrease its put GEX, and the strike's net is the sum of the two. Our service does exactly this — one pass over the chain, one dictionary keyed by strike — then sums every strike's net for the chain-wide figure.
Two undocumented choices creep in here. The first is the strike window: our computed path keeps the nearest 30 strikes to spot, a deliberate near-the-money focus and a real filter on the answer. The second is the regime label — we call the tape neutral inside a ±$1B band rather than flipping regime the instant net GEX changes sign, because a total that small is inside the model's own error.
A worked example
Illustrative numbers, exact arithmetic. Take a $500 underlying.
- One call strike with gamma 0.008 and open interest 5,000:
0.008 × 5,000 × 100 × 500 = $2,000,000of hedging per $1 move. In per-1% terms, multiply by500 × 0.01 = 5, giving +$10,000,000. - One put strike with gamma 0.006 and open interest 6,000:
0.006 × 6,000 × 100 × 500 = $1,800,000per $1 move, or $9,000,000 per 1% — signed negative, so −$9,000,000. - Net across the two strikes: +$200,000 per $1 move, equivalently +$1,000,000 per 1% move.
Same book, same arithmetic, two numbers five times apart, purely from the units. Scale to a full chain and that per-strike series is the whole product.
How the walls and the flip fall out
Once you have a signed net GEX at every strike, the levels are selections from that series. The call wall is the strike above spot carrying the largest positive call gamma; the put wall is the strike below spot with the most negative put gamma; the max-gamma strike is whichever has the largest absolute net. Our vol trigger is the lowest positive-net-gamma strike sitting between the two walls.
The zero-gamma flip has two legitimate definitions, and they do not agree. The cheap version — ours, in the computed path — walks the strike series and takes the sign change nearest spot. The rigorous version rebuilds the profile: re-evaluate total GEX at a range of hypothetical spot prices, recomputing every option's gamma at each one, then interpolate between the bracketing prices, zeroGamma = posStrike − (posStrike − negStrike) × posGamma / (posGamma − negGamma). That is more work and a better answer, because gamma is not constant as spot moves. Two implementations differing only here will publish different flip prices from identical data. SPX gamma levels covers what each level is used for once you have it.
What we actually run for SPX
For SPX we prefer a full-chain snapshot over a live computation. It is built once each morning before the open from CBOE settlement open interest across roughly 21,000 listed SPX contracts, crossed with Schwab implied volatility, using the same formulation with calls positive and puts negative. Because the input is settled open interest, the walls are fixed for the session by construction; a refresh every 30 minutes through the cash session repoints spot, the implied range and the 0DTE magnet, not the walls. We also publish how often each wall has subsequently held, with the sample size.
Two honest limits. That snapshot publishes support and resistance strikes rather than a full per-strike curve, so the chart renders the levels it has rather than a shape the data does not support. And when the snapshot is missing or older than four days, the page falls back to a live chain — same formula, fewer expirations, no hold rates.
The fallback taught us the most useful error source here. Our primary broker feed returns SPX contracts with open interest of zero on every row. GEX is gamma times open interest, so a chain like that does not fail — it computes a confident, well-formed, entirely fictional $0. We now reject any chain carrying no open interest and force the CBOE chain instead. A GEX pipeline fails silently far more often than it errors.
Why two correct implementations disagree
None of these are bugs. All of them move the number.
- Stale open interest. Yesterday's cleared positions priced against today's spot. Where same-day expiries dominate, most of the session's real gamma is created and destroyed before it appears in the data at all.
- Timestamp mismatch between spot and IV. Live spot against a morning volatility surface means every gamma in the sum is priced off a different moment than the spot scaling it.
- Expiry and strike filters. Our own live fallback keeps two nearby expirations; the daily snapshot crosses a full ~21,000-contract chain. Those are different quantities wearing one name, and a far-dated wall exists in one and not the other.
- Per-$1 versus per-1% units. The
spot × 0.01factor again — the most common way to conclude a book is 77 times larger than it is. - Index, ETF and futures netting. SPX, SPY and ES hedge the same risk, and SPY strikes sit near a tenth of the index level, so the chains need a scale factor before they combine — get it wrong and you are off by an order of magnitude, not a rounding.
Each is a decision made while building, so the fix is documentation, not debugging: write down the convention you took at each step and a disagreement becomes a diff rather than a mystery. Why published dashboards differ is the sibling question, in SPX gamma levels; what to check on a free gamma exposure chart is the checklist for trusting any number, ours included, and gamma exposure covers what the profile means once built.
Computing GEX by hand is an afternoon's work. Knowing which assumptions you made — the sign convention above all — is what makes the output worth anything.
Educational content, not financial advice. See our risk disclosure.