Full options quote history: clean NBBO bid/ask snapshots for any US option contract at the interval you choose, by SQL API, $79 a month.See the options quotes plan
Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor · · Updated 2026-09-26

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:

  1. Gamma per contract for every strike and expiration, from Black-Scholes calculation.
  2. 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.
  3. Weight for every contract. Published levels dey use open interest.
  4. 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.

QueryAverage gamma per contract by strike, SPY, one pinned June 2026 session
strikecall gammaput gamma
7050.005230.00512
7100.005750.00589
7150.006530.00678
7200.007660.00776
7250.008440.00888
7300.009460.01002
7350.01070.01137
7400.011980.01239
7450.012680.01344
7500.013770.0142
7550.013790.01446
7600.013640.01404
7650.012530.01204
7700.011180.0112
7750.009290.00957
7800.007450.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_price
Run am yourself

For 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.

QuerySigned net gamma by strike and e running total, $mm of delta per 1% move
strikestrike gamma musdrunning gamma musd
70542.442.4
710130.8173.2
71541214.2
72099.8314
725200.1514.1
730253.4767.5
735442.21209.7
7401162.12371.8
7451536.83908.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_num
Run am yourself

The 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.

QueryLadder flip estimate by expiration window, one pinned June 2026 session
DTE bucketspot closeflip estimate
0 to 1 days746.3745
2 to 7 days746.3744
8 to 30 days746.3746
31 to 90 days746.3745
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_order
Run am yourself

The 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.

QueryDaily ladder flip estimate against the close, SPY, June 2026
21 rows (showing 20)
datesession labelspot closeflip estimate
2026-06-01Jun 1756.58757
2026-06-02Jun 2759.63759
2026-06-03Jun 3750.55753
2026-06-04Jun 4754.56756
2026-06-05Jun 5735.36742.5
2026-06-08Jun 8738.72742.5
2026-06-09Jun 9735.7735
2026-06-10Jun 10722.88729
2026-06-11Jun 11739.48730
2026-06-12Jun 12742.45740
2026-06-15Jun 15753.91754
2026-06-16Jun 16750.75751
2026-06-17Jun 17745.6744
2026-06-18Jun 18746.94746
2026-06-22Jun 22743.67745
2026-06-23Jun 23735.02734
2026-06-24Jun 24737.2732
2026-06-25Jun 25732.7735
2026-06-26Jun 26731.2733
2026-06-29Jun 29740.76739
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 d
Run am yourself

On 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.

#gamma#gex#dealer hedging#options#spx