Does dealer gamma compress the range?
The claim tested on 1,066 sessions, read at 10:00 ET, in points and in sigma
One sentence appears in dealer-positioning commentary more often than any other: when dealers are long gamma the market pins and the range compresses; when they are short gamma it amplifies. It is stated as mechanism, not as measurement — hedging a long-gamma book means selling strength and buying weakness, which damps the path, and the sign flips when the book flips. The mechanism is real. Whether it shows up as a narrower day is a separate question, and it is answerable, because the archive holds a gamma reading and a realised range for every session.
So: read the state once, early, and let the rest of the day settle it. The answer depends entirely on the unit. In index points the claim holds and holds cleanly. In units of volatility it is not there at all.
How the state is read
State is taken at exactly 10:00 ET — the row is located by its clock label, never by position, so a session that is missing it is excluded and counted rather than shifted. The gamma reading is the net-gamma percentile the terminal publishes: the pool is every finite net-gamma-at-spot value from the prior 20 sessions — all 390 minutes of each of them, never the current session — and the percentile is the share of that pool below today's 10:00 value. There is no lookahead anywhere in it.
The outcome is the high-minus-low range from 10:00 to the close, inclusive of the 10:00
print, on minute closes. It is reported twice. Once in index points. Once divided by
σ = rv30 × √(minutes left), where rv30 is
the trailing 30-minute realised move per minute in points — the volatility the tape was
already making at the moment the gamma was read. That is the same scaler the published
touch-probability surface uses, so
"one sigma" means here exactly what it means there.
The unit of observation is the session: one day, one number. Pooling 390 correlated minutes per day would shrink every standard error below what the evidence supports.
The headline table
Sessions split into ten equal groups by the 10:00 gamma percentile — decile 1 is the shortest-gamma tenth, decile 10 the longest — with the range averaged inside each group in both units, and the volatility already on the tape at 10:00 in the last column.
| gamma decile at 10:00 | sessions | mean gpct | range, points | range, sigma | rv30 at 10:00, pts/min |
|---|---|---|---|---|---|
| 1 — shortest gamma | 107 | 4.4 | 71.8 | 1.405 | 3.18 |
| 2 | 107 | 10.2 | 57.8 | 1.121 | 2.74 |
| 3 | 106 | 15.0 | 51.0 | 1.129 | 2.65 |
| 4 | 107 | 19.2 | 46.9 | 1.254 | 2.10 |
| 5 | 106 | 23.8 | 50.3 | 1.158 | 2.50 |
| 6 | 107 | 29.2 | 41.8 | 1.122 | 2.07 |
| 7 | 106 | 36.1 | 47.0 | 1.155 | 2.31 |
| 8 | 107 | 43.8 | 48.2 | 1.192 | 2.32 |
| 9 | 106 | 54.1 | 43.9 | 1.126 | 2.24 |
| 10 — longest gamma | 107 | 72.2 | 46.3 | 1.110 | 2.32 |
Sample mean range 50.5 points, 1.177 sigma; mean rv30 at 10:00 is 2.44 points per minute and mean sigma 46.2 points.
Read the points column and the folklore is vindicated. The shortest-gamma tenth ranges 71.8 points, the longest-gamma tenth 46.3, and the column runs downhill between them — bumpily, but in one direction. Read the sigma column immediately to its right and the gradient is gone: 1.405 at the bottom, 1.110 at the top, with 1.254 sitting in decile 4 and 1.192 in decile 8. Rank correlation with the range in points is −0.151; with the range in sigma it is −0.028, against a standard error of about 0.031 — indistinguishable from nothing.
| bottom vs top gamma decile | bottom (gpct 4.4) | top (gpct 72.2) | difference | t |
|---|---|---|---|---|
| range, points | 71.8 | 46.3 | −25.4 ± 6.1 | −4.16 |
| range, sigma | 1.405 | 1.110 | −0.295 ± 0.114 | −2.58 |
| |close − 10:00|, points | 38.3 | 25.0 | −13.3 ± 4.9 | −2.74 |
| |close − 10:00|, sigma | 0.794 | 0.623 | −0.171 ± 0.111 | −1.54 |
| rv30 at 10:00, pts/min | 3.18 | 2.32 | −0.859 ± 0.208 | −4.13 |
107 sessions in each decile. Standard errors on the difference are the two group standard errors added in quadrature.
The confound, stated plainly
The last row of that table is the whole post. The shortest-gamma tenth of sessions did not merely go on to range wider — it arrived at 10:00 already ranging wider. Its trailing 30-minute realised move was 3.18 points per minute against 2.32 in the longest-gamma tenth, about 37% more, a gap of −0.859 ± 0.208 with t = −4.13. Across the whole sample the rank correlation between the 10:00 gamma percentile and rv30 is −0.125, and between rv30 and the day's range in points +0.581 — by far the largest number anywhere in this study.
That is the mechanism of the points result. Volatility is the dominant driver of how many points a session covers; low gamma readings cluster on high-volatility sessions; so low gamma readings cluster on wide sessions. Dividing by the volatility already on the tape removes the shared cause, and what remains — a rank correlation of −0.028 — is not a range effect. Low gamma and high volatility are largely the same state observed twice.
Does gamma add anything on top of volatility?
The direct test: regress the log of the day's range in points on the log of the sigma scaler alone, then add the standardised gamma reading (the z-score of the 10:00 value against the same 20-session pool, reported alongside the percentile so the finding cannot be an artefact of the percentile squash) and see what it buys.
| model, n = 1,066 | R² | b on log σ | t | b on gamma z | t |
|---|---|---|---|---|---|
| A — volatility only | 0.3602 | +0.675 | 24.48 | — | — |
| B — volatility + gamma z | 0.3630 | +0.670 | 24.26 | −0.0637 ± 0.0296 | −2.15 |
ΔR² = +0.0028. No observation was dropped for a non-finite log.
The honest reading of that row: the gamma coefficient is negative, in the direction the claim predicts, and over 1,066 sessions it is statistically visible at t = −2.15. It is also worth about 6% of range per standard deviation of net gamma, and it raises the explained variance by a quarter of one percent on top of an R² that volatility already owns outright. Both things are true. Which one matters depends on whether you are writing a paper or sizing a trade.
The test that decides whether it is usable
Everything above shares a defect: the 10:00 gamma and the 10:00-to-close range come from the same session. Nobody standing at 10:00 with a gamma reading is choosing between two states of the world; the day is already what it is. The usable version of the claim is the lagged one — yesterday's gamma against today's range — and it is a different result.
| previous session's gamma, n = 1,065 | bottom decile | top decile | difference | t |
|---|---|---|---|---|
| range, points | 59.0 | 48.4 | −10.6 ± 4.8 | −2.19 |
| range, sigma | 1.103 | 1.127 | +0.024 ± 0.064 | +0.37 |
| rv30 at 10:00, pts/min | 2.94 | 2.39 | −0.553 ± 0.180 | −3.06 |
107 sessions in each decile; one session drops for having no prior session inside the used sample.
In sigma terms it is +0.024 ± 0.064 — the sign has flipped and the magnitude is a third of its own standard error. Rank correlation between yesterday's gamma percentile and today's range in sigma is +0.011. The point-range difference that survives, −10.6, comes with a −0.553 difference in today's 10:00 volatility (rank correlation −0.095): a low-gamma yesterday predicts a volatile today, and a volatile today covers more points. That is volatility persistence, which needs no gamma to explain and no options data to trade.
A different book reproduces it exactly
If the effect belonged to our signing of the tape, a book built a completely different way should not show it. The convention book — call-minus-put open interest times gamma, the textbook construction that assumes every call is dealer-long and every put dealer-short — shares only +0.176 rank correlation with the measured book's percentile. The two disagree about the state of dealer positioning most days.
Split the same 1,066 sessions on the convention book's percentile instead and the same pattern appears: range in points 51.0 in the bottom decile against 40.0 in the top, a difference of −11.1 ± 3.0, t = −3.71. Range in sigma: 1.088 against 1.066, a difference of −0.023 ± 0.065, t = −0.35. Rank correlations with the range in points −0.126, with the range in sigma −0.006, with rv30 −0.136.
Two books that agree with each other only weakly produce the same points result and the same sigma non-result. The effect therefore does not belong to either construction. It belongs to the one thing both share — a mild negative correlation with the prevailing volatility level — and that is exactly what a confound looks like when you check it against an independent proxy.
What it does not say
It does not say dealer gamma is meaningless. This measures one outcome, the realised range from 10:00 to the close, and finds that the range claim is a volatility claim wearing a gamma label. It says nothing about where price goes, about the behaviour of the book's own levels — the hold-rate study measures those separately, and finds the band's upper edge holding a few points more often than distance alone predicts — or about anything measured on a horizon other than this one.
Four limits bound the numbers above.
The top decile is not an extreme long-gamma tail. The gamma percentile at 10:00 averages 30.8 across the sample, not 50, because the comparison pool is all 390 minutes of the prior 20 sessions and the 10:00 reading sits low in that distribution by construction. "Top decile" here means a percentile of 60.6 or above, not a rare deeply-long-gamma regime. A test of the genuine tail would need a different pool and is not this test.
Ranges are measured on minute closes. An intra-minute spike that widened the true range is invisible, so every range here is a lower bound. The bias is the same in every decile, so the comparisons stand even where a single number is optimistic.
Half-day sessions are kept. Nothing is excluded for a short calendar; the only length filter drops a session with fewer than 200 minute rows, which no half day hits. Their shorter horizon is carried by the sigma scaler, which uses the actual minutes remaining.
The sample is 1,066 of the 1,086 contiguous archived sessions. Two isolated pre-archive seeds fall outside the contiguous window, and 20 sessions at its start lack a full 20 prior sessions for the pool. Every exclusion is counted; none is silent. It is one regime-spanning window, 2022 through 2026, and a statement about those sessions rather than a law.
Nothing on this page is investment advice; see the Terms.
Reproduce it
This one needs no licensed data. The measured dealer book behind the percentile is
built from the SPXW trade and NBBO tick feed (ThetaData),
which you would have to subscribe to in order to rebuild the book itself — but you do not
need to, because the percentile is published per minute alongside the price. Every
finished session's JSON at https://gex.live/snapshots/YYYY-MM-DD.json carries
minutes, spot and gpct as aligned 390-element
arrays, gpct being the net-gamma percentile against the trailing 20 sessions.
The dates are the ones listed at /sessions. Two arrays and the
clock rebuild the headline:
import json, urllib.request, numpy as np, pandas as pd def session(day): # about 7 MB per day -- fetch sequentially u = "https://gex.live/snapshots/" + day + ".json" return json.load(urllib.request.urlopen(u)) d = session("2026-08-11") s = np.array(d["spot"], float) # one-minute index prints, 09:30 .. 15:59 ET g = np.array(d["gpct"], float) # net-gamma percentile vs the prior 20 sessions i = d["minutes"].index("10:00") # the read row, found by clock, never by position r = np.diff(np.log(s), prepend=np.nan) rv = pd.Series(r).rolling(30).std().values * s # trailing move, points per minute left = len(s) - 1 - i # minutes from 10:00 to the close sig = rv[i] * np.sqrt(left) # the touch-surface scaler, in points fwd = s[i:] # 10:00 -> close, minute closes only row = dict(gpct=g[i], rv30=rv[i], range_pt=fwd.max() - fwd.min(), range_sig=(fwd.max() - fwd.min()) / sig) # 2026-08-11 -> gpct 53.78, rv30 2.153, range 44.79 points, 1.098 sigma # Repeat over every date at /sessions, then split the sessions into ten equal # groups by gpct and average both range columns inside each group: # bottom decile 71.8 points 1.405 sigma # top decile 46.3 points 1.110 sigma # The convention book's net gamma is published in the same file as "ngv_conv" # if you want to repeat the split against a book built the textbook way.
Session pages at /sessions state each day's levels in prose and the MCP server returns the same summaries, which is enough to spot-check any session you remember against the table above.
Part of gex.live research. Measured on the free session archive; every session is free to replay.