What gamma flip level mean for options
Gamma flip level na the price wey estimated dealer gamma cross zero. See how strike gamma and open interest build am, plus how to check one.
The gamma flip level na the underlying price wey estimated aggregate dealer gamma cross zero. Above that price, the options book wey dey there imply hedging flows wey dey move against price movement. Below am, the flows dey move with the price movement. The level na model output wey dem build from public option data plus one big assumption about who dey hold wetin. So, the useful thing na to understand how dem build am.
Wetin gamma flip level dey made of
Gamma na the rate wey option delta dey change as the underlying moves, as wetin option gamma be explain. Desk wey dey run hedged book dey buy and sell the underlying as delta dey shift, na the process wey how delta hedging dey work cover. Gamma set how much that hedge need change for every point wey price move. Add the gamma of every contract for one chain together, put sign and weight for each one, and you get gamma exposure, usually written GEX. The flip na one specific reading of that total: the underlying price wey e pass through zero.
Four inputs dey enter the calculation:
- Gamma per contract for every strike and expiration, from Black-Scholes calculation.
- Sign convention. The usual method assume say dealers dey short calls and long puts. So call gamma enter the sum as negative, while put gamma enter positive.
- Weight for every contract. Published levels dey use open interest.
- Scaling step: the 100 share contract multiplier, then spot squared times 0.01. This show the total dollar value of delta for 1% move.
The sign convention need another look. If we assume the opposite — dealers long calls and short puts — every number for the aggregate go change sign. But the zero crossing no go move. Wetin go change na which side of the level dem call positive.
Step one: gamma per contract across the strike ladder
Gamma per contract no flat across one chain. E dey peak near the money and fall away for both directions. The panel below dey fixed to one past session: the last June 2026 session wey this data carry. E average gamma per contract across 20 to 45 day expirations for every strike within 6% of the close.
| strike | call gamma | put gamma |
|---|---|---|
| 705 | 0.00523 | 0.00512 |
| 710 | 0.00575 | 0.00589 |
| 715 | 0.00653 | 0.00678 |
| 720 | 0.00766 | 0.00776 |
| 725 | 0.00844 | 0.00888 |
| 730 | 0.00946 | 0.01002 |
| 735 | 0.0107 | 0.01137 |
| 740 | 0.01198 | 0.01239 |
| 745 | 0.01268 | 0.01344 |
| 750 | 0.01377 | 0.0142 |
| 755 | 0.01379 | 0.01446 |
| 760 | 0.01364 | 0.01404 |
| 765 | 0.01253 | 0.01204 |
| 770 | 0.01118 | 0.0112 |
| 775 | 0.00929 | 0.00957 |
| 780 | 0.00745 | 0.00814 |
The exact SQL behind every number
SELECT
toString(toInt32(strike_price)) AS strike,
round(avgIf(toFloat64(gamma), lower(substring(option_type, 1, 1)) = 'c'), 5) AS call_gamma,
round(avgIf(toFloat64(gamma), lower(substring(option_type, 1, 1)) = 'p'), 5) AS put_gamma
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND date = (
SELECT max(date)
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND date <= '2026-06-30'
)
AND iv_converged = 1
AND volume > 0
AND days_to_expiry BETWEEN 20 AND 45
AND modulo(toInt32(strike_price), 5) = 0
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.06
GROUP BY strike_price
HAVING countIf(lower(substring(option_type, 1, 1)) = 'c') > 0
AND countIf(lower(substring(option_type, 1, 1)) = 'p') > 0
ORDER BY strike_priceFor the lowest strike inside that window, average call gamma na 0.00523. For the highest strike, na 0.00745. The hump dey between them across 16 strikes. Call and put gamma for the same strike and expiration na the same quantity inside the model. Na why the two series for the panel dey sit on top each other. The sign convention, no be gamma, na wetin separate the two sides.
Step two: signs, weights, and where the curve dey turn
Exposure from one contract small. Take strike wey carry 100 contracts with gamma of 0.02, while the underlying dey $600. Multiply 0.02 by 100 contracts, by the 100 share multiplier, by 600 squared, and by 0.01. You go get roughly $720,000 of delta per 1% move. Na the next panel use this unit, stated in millions.
The panel dey go through the same fixed session’s strike ladder across every expiration up to 45 days. The convention above give sign to each strike’s contribution. The session’s traded contract volume give the weight. The running column dey accumulate from the lowest strike go upward.
| strike | strike gamma musd | running gamma musd |
|---|---|---|
| 705 | 42.4 | 42.4 |
| 710 | 130.8 | 173.2 |
| 715 | 41 | 214.2 |
| 720 | 99.8 | 314 |
| 725 | 200.1 | 514.1 |
| 730 | 253.4 | 767.5 |
| 735 | 442.2 | 1209.7 |
| 740 | 1162.1 | 2371.8 |
| 745 | 1536.8 | 3908.6 |
| 750 | -4878.8 | -970.2 |
| 755 | -881.6 | -1851.8 |
| 760 | -395.7 | -2247.5 |
| 765 | -115.3 | -2362.8 |
| 770 | -43.8 | -2406.6 |
| 775 | -26.8 | -2433.4 |
| 780 | -14 | -2447.4 |
| 785 | -5.6 | -2453 |
| 790 | -2.5 | -2455.5 |
The exact SQL behind every number
SELECT
strike,
strike_gamma_musd,
round(sum(strike_gamma_musd) OVER (ORDER BY strike_num), 1) AS running_gamma_musd
FROM
(
SELECT
toInt32(strike_price) AS strike_num,
toString(toInt32(strike_price)) AS strike,
round(sum(multiIf(lower(substring(option_type, 1, 1)) = 'c', -1.0, 1.0)
* toFloat64(gamma) * volume * 100
* pow(toFloat64(underlying_close), 2) * 0.01) / 1e6, 1) AS strike_gamma_musd
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND date = (
SELECT max(date)
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND date <= '2026-06-30'
)
AND iv_converged = 1
AND volume > 0
AND days_to_expiry <= 45
AND modulo(toInt32(strike_price), 5) = 0
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.06
GROUP BY strike_price
)
ORDER BY strike_numThe lowest strike inside the window contribute 42.4 million dollars of delta per 1% move. The highest strike contribute -2.5 million. Across the full 12% band, the ladder net to -2455.5 million. Read the running line from left to right: e dey climb while put-weighted strikes dominate, then e turn when call-weighted strikes take control. The price wey e turn na the flip estimate. Every part of the calculation na bookkeeping wey reader fit repeat by hand. Na the main point.
Wetin the level no be
Nothing for that calculation directly observe any dealer. Open interest show say contract dey exist. E no show which side of the contract market maker dey hold. The project behind the open source GEX dashboard state this limitation for its README. E describe the output as Black-Scholes approximation wey dem calculate from open interest and
no be measure of actual market-maker positions
(project README, as of September 2026)
Coverage na the second gap. The free data source behind that dashboard no expose option chain endpoint for the cash index symbols SPX, XSP, NDX, RUT, DJX and VIX. Na exactly these symbols practitioners dey quote flip levels on most. If dem publish level for one of them, dem calculate am somewhere else, either with paid chain data or ETF proxy. SPX and SPY options track the same index at roughly ten-to-one notional ratio. So, level wey dem build on one need rescale before e fit describe the other.
The curve itself na the third issue. Proper flip calculation go revalue every contract’s gamma at every possible underlying price, then find the zero of the resulting function. The ladder proxy above no reprice anything. E only read the book balance as e be at one close. The panels here also use traded volume as weight instead of open interest, because volume na the per-contract weight wey this daily greeks data carry. Same shape, different weight.
Why two vendors dey publish different levels for the same index
Every input above na a choice, and vendors dey set dem differently. The expiration window na the most obvious one. The panel below calculate the same estimate again for the same session, using four parts of the expiration calendar.
| DTE bucket | spot close | flip estimate |
|---|---|---|
| 0 to 1 days | 746.3 | 745 |
| 2 to 7 days | 746.3 | 744 |
| 8 to 30 days | 746.3 | 746 |
| 31 to 90 days | 746.3 | 745 |
The exact SQL behind every number
SELECT
dte_bucket,
round(any(spot), 2) AS spot_close,
round(argMax(strike, running), 2) AS flip_estimate
FROM
(
SELECT
dte_bucket,
bucket_order,
spot,
strike,
sum(net_gamma) OVER (PARTITION BY dte_bucket ORDER BY strike) AS running
FROM
(
SELECT
multiIf(days_to_expiry <= 1, '0 to 1 days',
days_to_expiry <= 7, '2 to 7 days',
days_to_expiry <= 30, '8 to 30 days',
'31 to 90 days') AS dte_bucket,
multiIf(days_to_expiry <= 1, 1,
days_to_expiry <= 7, 2,
days_to_expiry <= 30, 3, 4) AS bucket_order,
toFloat64(strike_price) AS strike,
any(toFloat64(underlying_close)) AS spot,
sum(multiIf(lower(substring(option_type, 1, 1)) = 'c', -1.0, 1.0)
* toFloat64(gamma) * volume * 100) AS net_gamma
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND date = (
SELECT max(date)
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND date <= '2026-06-30'
)
AND iv_converged = 1
AND volume > 0
AND days_to_expiry <= 90
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.15
GROUP BY dte_bucket, bucket_order, strike
)
)
GROUP BY dte_bucket, bucket_order
ORDER BY bucket_orderThe 0 to 1 day slice put the estimate at 745 against close of 746.3. The 31 to 90 day slice put am at 745. One book, one session, one formula, four answers. Dashboard wey sum every listed expiration and another one wey stop at the front month no dey describe the same quantity. And neither one wrong.
The other settings work the same way:
- The weight: open interest at the prior settle, open interest refreshed intraday, or traded volume.
- The strike band: how far out of the money the sum go before dem truncate am.
- The sign convention, wey relabel the sides but no move the crossing.
- The snapshot time.
- Whether the level come directly from index options or from rescaled ETF proxy.
Why the level dey move during the session
Dem fit create and retire open interest for contracts wey expire the same day inside that session. The 0 to 1 day slice na the fastest-moving part of the book. E now carry large share of index option volume, as 0DTE options and their risks explain. Level wey dem calculate at 9:45 a.m. ET and the same level wey dem calculate at 2:00 p.m. ET dey rely on different open interest for strikes nearest spot. Na there gamma per contract dey highest. Vendors wey refresh intraday publish level wey dey move through the day. Vendors wey take one snapshot at the prior close publish level wey remain still.
Estimate dey move from day to day?
Across the 21 sessions of June 2026, the same ladder estimate dey track the close, but the distance dey change every day.
| date | session label | spot close | flip estimate |
|---|---|---|---|
| 2026-06-01 | Jun 1 | 756.58 | 757 |
| 2026-06-02 | Jun 2 | 759.63 | 759 |
| 2026-06-03 | Jun 3 | 750.55 | 753 |
| 2026-06-04 | Jun 4 | 754.56 | 756 |
| 2026-06-05 | Jun 5 | 735.36 | 742.5 |
| 2026-06-08 | Jun 8 | 738.72 | 742.5 |
| 2026-06-09 | Jun 9 | 735.7 | 735 |
| 2026-06-10 | Jun 10 | 722.88 | 729 |
| 2026-06-11 | Jun 11 | 739.48 | 730 |
| 2026-06-12 | Jun 12 | 742.45 | 740 |
| 2026-06-15 | Jun 15 | 753.91 | 754 |
| 2026-06-16 | Jun 16 | 750.75 | 751 |
| 2026-06-17 | Jun 17 | 745.6 | 744 |
| 2026-06-18 | Jun 18 | 746.94 | 746 |
| 2026-06-22 | Jun 22 | 743.67 | 745 |
| 2026-06-23 | Jun 23 | 735.02 | 734 |
| 2026-06-24 | Jun 24 | 737.2 | 732 |
| 2026-06-25 | Jun 25 | 732.7 | 735 |
| 2026-06-26 | Jun 26 | 731.2 | 733 |
| 2026-06-29 | Jun 29 | 740.76 | 739 |
The exact SQL behind every number
SELECT
toString(d) AS date,
formatDateTime(d, '%b %e') AS session_label,
round(any(spot), 2) AS spot_close,
round(argMax(strike, running), 2) AS flip_estimate
FROM
(
SELECT
d,
spot,
strike,
sum(net_gamma) OVER (PARTITION BY d ORDER BY strike) AS running
FROM
(
SELECT
date AS d,
toFloat64(strike_price) AS strike,
any(toFloat64(underlying_close)) AS spot,
sum(multiIf(lower(substring(option_type, 1, 1)) = 'c', -1.0, 1.0)
* toFloat64(gamma) * volume * 100) AS net_gamma
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND date BETWEEN '2026-06-01' AND '2026-06-30'
AND iv_converged = 1
AND volume > 0
AND days_to_expiry <= 45
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.15
GROUP BY d, strike
)
)
GROUP BY d
ORDER BY dOn Jun 1, the estimate land at 757 against close of 756.58. On Jun 30, e land at 746 against 746.3. The two series dey move together, as statistic wey anchor to where volume concentrate normally go do. The gap between them na the part wey people really dey read.
How to sanity-check published flip level
- Ask which expirations e include and how far out of the money the sum go before truncation.
- Ask which weight e use and the time dem take the snapshot.
- Ask whether dem calculate am on the index itself or on ETF proxy and rescale am.
- Rebuild the ladder for the same session and check whether your turn land for the same area. If two honest builds land 30 points apart, dem dey tell you about the method, no be the market.
- Look at the precision. Index strike ladders dey spaced 5 points or wider, and the greeks na daily. So, level wey dem quote to the cent get more precision than anything underneath am.
FAQ
Wetin gamma flip level mean for options?
Na the underlying price wey estimate of total dealer gamma cross zero. Dem build the estimate by giving every contract’s gamma a sign, weighting am with open interest, scaling am with the contract multiplier, and summing the chain. E come from public option data, no be from any direct view of dealer inventory.
Gamma flip na the same thing as GEX?
No. GEX na the aggregate gamma number itself, usually stated as dollars of delta per 1% move. The flip na the one underlying price wey that aggregate pass through zero. GEX na the curve; flip na one point on the curve.
Why two dashboards dey show different gamma flip levels for the same index?
Dem use different inputs: expiration window, strike band, weight and snapshot time, sign convention, plus whether the level come from index options or rescaled ETF proxy. The expiration panel above produce four different estimates from one session by changing only one input.
Gamma flip level dey change during trading day?
For any calculation wey refresh intraday, yes. Dem create and retire open interest for same-day expirations inside the session. Strikes nearest spot carry the heaviest gamma weight. Level wey dem snapshot once at the prior close go remain unchanged until the next snapshot.
Every panel for this page carry the exact SQL underneath am. Rebuild the ladder for another symbol or another session on the Strasmore terminal, then watch where the turn land.