Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor · · Updated 2026-09-26

Gamma Flip Level: Wetin E Mean and How to Check Am

Gamma flip level na price wey estimated dealer gamma cross zero. See how strike gamma and open interest build am, plus how to check the level.

Gamma flip level na the underlying price wey estimated aggregate dealer gamma cross zero. Above that price, the options book wey dey exist imply hedging flows wey dey push against price movement. Below am, flows dey move with the price movement. The level na model output wey dem assemble 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 underlying dey move, as wetin option gamma be explain. Desk wey dey run hedged book dey buy and sell the underlying as delta dey drift, and how delta hedging dey work cover the process. Gamma show how much that hedge need change for every point of movement. Add the gamma of every contract for one chain together, put sign and weight for each one, and you get gamma exposure, wey dem usually write as GEX. The flip na one particular reading of that total: the underlying price wey the total 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 negative, while put gamma enter positive.
  3. Weight for each contract. Published levels dey use open interest.
  4. Scaling step: 100 share contract multiplier, then spot squared times 0.01. This state the total dollars of delta for 1% move.

Make we look the sign convention again. Assume the opposite instead: dealers dey long calls and short puts. Every number for the aggregate go change sign. But the zero crossing no go move. Wetin change na which side of the level dem call positive.

First step: gamma per contract across strike ladder

Gamma per contract no dey flat across one chain. E dey peak near the money and fall away for both directions. The panel below dey use one fixed past session: the last June 2026 session wey this data carry. E average gamma per contract across the 20 to 45 day expirations for each 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 bottom strike of that window, average call gamma print 0.00523. For the top strike, e print 0.00745. The hump dey between them across 16 strikes. Call and put gamma for the same strike and expiration na the same quantity for the model. Na why the two series for the panel dey sit on top each other. Na the sign convention, no be gamma, dey separate the two sides.

Second step: signs, weights, and where the curve turn

Exposure from one contract small. Take strike wey carry 100 contracts with gamma of 0.02 while the underlying dey at $600. Multiply 0.02 by 100 contracts, by the 100 share multiplier, by 600 squared, and by 0.01. You get roughly $720,000 of delta per 1% move. Na the next panel use this unit, stated in millions.

The panel follow the same fixed session’s strike ladder across every expiration up to 45 days. Each strike contribution get sign from the convention above, weight from that session’s traded contract volume, and the running column dey accumulate from the lowest strike 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 bottom strike of the window contribute 42.4 million dollars of delta per 1% move, while the top 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 where e turn na the flip estimate. Every step na bookkeeping wey reader fit redo by hand. Na that be the point.

Wetin the level no be

Nothing for that construction 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 limit 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 cash index symbols: SPX, XSP, NDX, RUT, DJX and VIX. Na exactly these symbols practitioners dey quote flip levels on most. If level for one of them dey published, dem calculate am somewhere else, either with paid chain 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 gamma at every possible underlying price, then find zero for the resulting function. The ladder proxy above no reprice anything. E only read the balance of the book 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 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 them differently. The expiration window na the most obvious one. The panel below recalculate the same estimate on the same session from 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 dashboard wey stop at front month no dey describe the same quantity. And neither one wrong.

The other settings work the same way:

  • The weight: open interest at 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

Open interest for contracts wey expire that same day dey get created and retired inside the session. The 0 to 1 day slice na the fastest-moving part of the book, and e now carry big share of index option volume. 0DTE options and their risks cover this topic. 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, where gamma per contract dey highest. Vendors wey refresh intraday publish level wey dey walk through the day. Vendors wey take snapshot once at prior close publish one wey stay still.

Estimate dey move from day to day?

Across the 21 sessions of June 2026, the same ladder estimate dey follow 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. Na wetin statistic wey anchor to where volume concentrate suppose 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 dey go before dem truncate am.
  • Ask which weight e use and the time dem take that weight snapshot.
  • Ask whether dem calculate am on the index itself or on ETF proxy, then rescale am.
  • Rebuild the ladder for the same session and check whether your turn land for the same neighbourhood. If two honest builds land 30 points apart, dem dey tell you about the method, no be the market.
  • Check the precision. Index strike ladders dey spaced 5 points or wider, and the greeks dey daily. So level wey dem quote to the cent finer pass 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 assigning sign to each contract gamma, weighting am by open interest, scaling am with contract multiplier, and summing the chain. E come from public option data, no be from any 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. Flip na the single underlying price wey that aggregate pass through zero. GEX na the curve; flip na one point for the curve.

Why two dashboards dey show different gamma flip levels for the same index?

Dem dey use different inputs: expiration window, strike band, weight and the time dem take the snapshot, 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 build wey refresh intraday, yes. Open interest for same-day expirations dey get created and retired inside the session, and strikes nearest spot carry the heaviest gamma weight. Level wey dem snapshot once at prior close go remain 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 and watch where the turn land.

#gamma#gex#dealer hedging#options#spx