Generated from the code by scripts/generate_methodology.py. Every figure on this page is read from the constants that enforce it, so it cannot drift from what the product actually does. Do not edit by hand.
This page exists because almost nobody publishes theirs. If a number here disagrees with a number somewhere else, you should be able to point at the exact line that explains why — instead of guessing.
Written for someone who met these ideas a fortnight ago. No performance claims, no hit rates, no predictions.
The one-paragraph version
An option's gamma says how fast a dealer's hedge has to change as price moves. Multiply each contract's gamma by its open interest and by the contract size, assume dealers are long the calls and short the puts, and you get the dollar amount of stock they are mechanically obliged to buy or sell for a 1% move in the underlying. Sum it across the chain and you have net gamma exposure. Where that sum crosses zero is the gamma flip.
None of that predicts anything. It describes an obligation someone else has.
Which contracts are included
every listed expiry, no delta filter, open interest at least 1.
- Expiry horizon — every expiry the exchange lists. There is no cut. This changed on 2026-08-25: the fetch was previously capped at 30 days, which on SPX covered about 18% of the book's open interest while the label said "all expiries".
- Delta or moneyness filter — None. A [0.05, 0.95] band used to be applied and has been removed. A survey of eleven published tools found none applying one, and on SPX it was removing 39% of the book's open interest — including the entire far-out-of-the-money put wing, which is where hedging pressure concentrates in a selloff.
- Open interest — a contract must carry at least 1. A contract nobody holds is not a position.
- Settled contracts are removed the moment they settle, not at the end of the day. See the settlement section below.
- Index roots are included whole. For SPX that means both the SPX monthly and the SPXW weekly root. No published tool states how it handles this split, so it is worth saying plainly: both are in.
The four scopes
The expiry chip narrows the contract set. Every number on the screen — the headline, the exposure views, the levels — follows it, together:
| Chip | Covers |
|---|---|
| 0DTE | expiring today |
| Week | to this Friday |
| Month | to monthly opex |
| All | every listed expiry |
Dealer sign convention
Dealers are assumed long calls and short puts. Call gamma counts positive, put gamma counts negative.
This is an assumption about who is on the other side of retail flow, not an observation. It is the same convention SpotGamma, the original SqueezeMetrics work, QuantData and every open-source implementation we could find use, so a figure here is comparable to a figure there — as far as the convention goes.
Cboe's own research does not make this assumption: it uses proprietary fill data to observe what market makers actually hold. Nobody outside Cboe can do that.
Units
Gamma exposure is quoted in dollars per 1% move in the underlying:
GEX = gamma x open interest x contract size x spot^2 x 0.01
with a default contract size of 100 shares. Per-1% rather than per-point is the near-universal convention among tools that publish one.
If our number looks 77x too big beside someone else's
It is the same curve in different units, and this catches people out often enough to be worth naming. A per-point figure answers "how many dollars of hedging does a ONE-POINT move force". Ours answers "how many dollars does a ONE-PERCENT move force". On SPX near 7,700 a one percent move is 77 points, so the two differ by a factor of about 77 and neither is wrong.
SpotGamma's published formula is the per-1% one, identical to the line above. Their free public SPX chart is drawn per point. Measured on 3 September 2026 across 20,992 SPX contracts and every listed expiry, our net gamma read +$66.7B per 1% move, which is +$0.87B per point on the same book. Read the same day, their free chart carried a y-axis of -1.00G to +2.00G, with the page stating the chart was last updated on 17 August. Same shape, same sign, one convention apart.
Before concluding that either platform is broken, check three things: the units, the expiry scope — every figure here states its scope and strike count beside it — and the dealer-sign assumption. Two correct implementations will still differ, because no two of them are reading the same open-interest snapshot.
Every Greek is computed here from Black-Scholes, not taken from the data provider. The provider's own vega and gamma are internally inconsistent by about 6% against the identity vega/gamma = S^2 x sigma x T; ours are verified against numerical derivatives on a 38,016-point grid. The risk-free rate used is 4.00%.
Settlement, and why it matters twelve days a year
Most options stop existing at 16:00 ET on their expiry date. The standard monthly NDX, RUT, SPX contracts do not: they are AM-settled, priced against the opening auction at 09:30 ET, and they stop trading the Thursday before.
More than half the open interest on those index chains sits on the AM-settled root. Treating it as alive for a session it does not have inverts the sign of net gamma exposure on monthly expiry day. Gamma scales as 1/sqrt(time), so the error is largest exactly when it matters most.
Time to expiry is kept to sub-day resolution. Rounding it to whole days makes every same-day Greek exactly zero.
The gamma flip
The gamma flip is the price at which total dealer gamma crosses zero — not a strike, and not a sum along the strike ladder. Every contract's gamma is recomputed at each trial price, because gamma depends on where spot is.
The rule, in order:
- Scan from 30% below spot to 30% above it and find every price where the sum changes sign. Real chains often have more than one.
- Prefer roots with open interest behind them — at least 1% of the scope's open interest within 1% of the price. A crossing in the far tail where nobody holds anything is arithmetic, not a regime boundary.
- Return the nearest one to spot. That is the price the market would actually have to cross.
- If it falls outside the range the underlying has traded in the past 52 weeks, report no flip and say why. A level at a price the market has never reached cannot be crossed or approached.
- If there is no crossing at all, report no flip. That is a real and interesting state: the book is one-signed across the whole range.
The number of roots found travels in the response, because it changes what the level means. One root is a dividing line — long gamma one side, short the other. Two roots straddling spot means dealers are short gamma *between* them and long outside, so "above the flip" no longer implies long gamma.
The other levels
- Call wall / put wall — the strike with the most call open interest above spot, and the most put open interest below it. Open interest, not gamma. The search is bounded to within 10% of spot, because an unweighted maximum over a multi-year chain lands on a round-number long-dated strike with no near-term hedging behind it.
- Vol trigger — walking down from spot, the first strike where cumulative put open interest overtakes cumulative call. If that never happens, there is no vol trigger and the product says so rather than reporting the bottom of the ladder.
- Max pain — the strike minimising total in-the-money value across the contracts in the active scope. It moves when you change the expiry chip.
- Peak GEX strike — the strike carrying the most net gamma. A different quantity from either wall, and never called one.
Any level more than 10% from spot is not shown, with a stated reason. A level that far out is not information.
What the chart shows
The server sends the 150 strikes nearest spot — every view of a full chain is a payload nobody reads — and your browser draws a window inside that, 28 strikes by default, which the strike slider moves.
The headline figure is computed over the strikes you can see. It moves when you move that slider, and the strike count is part of its label for exactly that reason — 28 strikes in view.
That is a deliberate choice and it replaced the opposite one. The headline used to be the whole chain, which is a defensible number and an unusable one here: nothing on the screen added up to it. Two things changed our mind, both measured on SPX on 2026-08-25. First, the strikes on screen do not cancel: the 28 drawn give a net that is 14.4% of their own gross, against 0.077% across the full 764, where the call and put books agree to four significant figures and the sign of the total is decided by rounding. Second, a number you can add up is a number you can check, and checking it is the right instinct.
The whole-chain total has not gone anywhere. It sits beside the headline, smaller, labelled with its own strike set and its own expiry scope — so anyone comparing against a whole-chain tool can still find the figure that tool prints. The two are different numbers and often carry different signs; on SPX's chain the near-spot strikes are net negative while the wings are net positive, so widening the window moves the total toward zero.
The cost, stated plainly: the headline moves when the slider moves. That is inherent to bounding it to what is drawn, and it is why whole-chain tools exist. We handle it by putting the strike count in the label and letting the figure travel to its new value rather than snap, so a changing number is visibly a changing scope. Every surface that publishes a number of the same name — the API, the TradingView indicator, the browser extension and the Discord bot — states the strike set it covers.
How fresh the data is
The options chain refreshes every 5 minutes for the first 30 minutes after the open and the last 30 minutes before the close, every 15 minutes through the rest of the session, and hourly outside it. Exposure is recalculated continuously against the live price between refreshes, holding implied volatility constant.
The cadence is weighted rather than uniform because positioning moves hardest in the first half hour and the last half hour of the session, and barely at all overnight. On a normal trading day that is 52 refresh cycles; on a weekend or a market holiday the chain is polled only often enough to prove the pipeline is alive.
This is not real-time and is never described as such. After two missed refreshes the data is marked stale, and clients that draw lines on a chart grey them out — two of whatever interval is in force at the time, not a fixed number of minutes, so an overnight snapshot is not called stale for keeping to the overnight rate.
Versioning
Levels carry a schema version — currently v5 — which increments whenever the *meaning* of a level changes enough that old rows stop being comparable to new ones. Historical rows are labelled, never recomputed: they record what the product actually showed on the day.
What this page will never contain
No win rates, hit rates or backtested figures. A level of this kind is approached about once every eight sessions, so an honest statistic would need a year of data, and we do not have it. No entries, stops, targets or predictions — the product describes an obligation a dealer has, and what you do with that is yours.