Live GEX vs Settled GEX: Why the Same Symbol Can Have Two Correct Gamma Numbers
One question can be answered by the morning OPRA tape. The other can only be answered by today’s flow. Conflating them is the single most…
Live GEX vs Settled GEX: Why the Same Symbol Can Have Two Correct Gamma Numbers
One question can be answered by the morning OPRA tape. The other can only be answered by today’s flow. Conflating them is the single most common modeling mistake in dealer-positioning analytics.
The question lands in my inbox roughly every week: “Your dashboard says SPY net GEX is 12.5 billion, but the morning print said 11.7 billion. Which one is right?”
Both. They answer different questions, they’re computed against different open interest numbers, and they share no mutable state. This piece is the explainer I now send whenever the question comes in.
Two questions, two numbers
Dealer-positioning analytics rests on exactly one input that matters: how many option contracts are open at each strike, and on which side the dealers sit. The moment you pick which open interest figure to feed the gamma math, you have implicitly chosen which question you are answering.
There are two clean answers:
“What is dealer positioning right now according to the books?” — answered against the settled open interest broadcast every morning by the OPRA tape. Stable all session by construction.
“What would dealer positioning look like if today’s flow really did open and close the positions the model thinks it did?” — answered against an effective open interest, which is the settled value plus an intraday estimate of how today’s flow has moved positions.
A backtest that has to match what was knowable at the open uses the settled answer. A live dashboard that wants to react to today’s order flow before tomorrow’s OI print uses the effective answer. The mistake is assuming there should only be one canonical number.
Settled OI: stable by design
The settled open interest is the official figure computed overnight by the clearing process and broadcast on the morning tape. It is identical to what OPRA reports per contract. The /v1/exposure/* endpoints compute gamma, delta, vanna, and charm exposure directly against this value, which means the settled GEX at 9:45 AM is mathematically the same settled GEX at 3:30 PM.
That stability is the whole point. End-of-day reconciliation, backtest parity, and any analysis that has to agree with the official tape depend on the OI not drifting intraday. When a developer complains that “the morning gamma print looks stale by noon”, what they mean is “I expected it to react to today’s flow.” It doesn’t — and shouldn’t. That is what the second surface is for.
Effective OI: settled plus an intraday flow estimate
The flow surface starts from the same settled OI, then adds an intraday simulator estimate of how many contracts today’s order flow has opened or closed. The simulator classifies each trade as a buy or a sell, then applies a confidence weight — currently 0.43 — to estimate how many contracts genuinely opened new positions versus simply traded between existing holders.
Per contract, the simulator tracks a small chain of fields:
official_oi— last OPRA settled value, identical to what the exposure surface uses, stable all session.intraday_oi_delta— signed estimate of contracts opened (positive) or closed (negative) today.oi_delta_confidence— the 0.43 weight, a model constant.simulated_oi—official_oi + intraday_oi_delta. Unclamped, can go negative if the model overshoots on a heavy-close contract. Diagnostic only.effective_oi—max(0, simulated_oi). The analytics-safe input that actually feeds the gamma math on the flow surface.
The clamp is deliberate. Negative position counts are unphysical, and the gamma math should never see one. Exposing simulated_oi separately means a careful developer can still see when the simulator overshoots — which is a useful signal in its own right.
The property worth tattooing on a forearm
Nothing under /v1/flow/* changes anything under /v1/exposure/*. The OPRA OI value is never modified, overwritten, or "corrected" by the flow simulator. The settled surface is computed from official_oi and is mathematically untouched by everything the flow simulator does. You can hit the flow endpoints all day and your exposure numbers will not move because of it.
The field names are deliberately disambiguated so they cannot be mixed in client code:
Settled (/v1/exposure/*) Flow (/v1/flow/*) gex live_gex net_gex live_net_gex Computed from official_oi Computed from effective_oi
If a payload has live_gex, you're looking at the flow surface. If it has gex or net_gex, you're looking at the settled surface. Two field-name conventions, no shared mutable state. The most common bug I see in client code is developers subtracting live_gex from yesterday's net_gex and calling the difference an "intraday move." It isn't. The two numbers are computed against different OI bases — the difference is noise, not signal. If you want "how much has today's flow shifted the regime", read flow_gex_pct_shift from the flow surface.
Diffing the two in practice
The fastest way to internalize this is to hit both endpoints for the same symbol and watch the gap:
import requests
BASE = "https://lab.flashalpha.com"
HEADERS = {"X-Api-Key": "YOUR_KEY"}
settled = requests.get(f"{BASE}/v1/exposure/gex/SPY", headers=HEADERS).json()
flow = requests.get(f"{BASE}/v1/flow/summary/SPY", headers=HEADERS).json()
print(f"Settled net GEX: {settled['net_gex']:,}")
print(f"Live (flow) net GEX: {flow['live_gex']:,}")
print(f"Flow direction: {flow['flow_direction']}")
print(f"Intraday OI delta: {flow['intraday_oi_delta']:+,}")
The settled number does not move because you called flow. Different field names, different surfaces, no cross-contamination.
Reading the flow regime
The flow surface returns a flow_direction classification that summarizes what today's order flow is doing to dealer gamma. Five values, each with a distinct meaning:
**no_flow** — literally nothing to simulate; every contract is dead.**neutral** — flow exists, but the resulting net GEX shift is under the 5% threshold. Movement present, but immaterial.**amplifying** — net GEX kept the same sign and grew in magnitude. Today's flow is making dealers more exposed in the existing regime.**dampening** — net GEX kept the same sign but shrank. Positions are resolving and the regime is weakening.**regime_flip** — net GEX changed sign, or a regime was created from a zero baseline.
The distinction between no_flow and neutral matters in code. no_flow means the simulator had no input at all; neutral means it ran but the effect was below threshold. Different alerts.
One edge case worth handling explicitly: flow_gex_pct_shift is null when settled GEX is zero but live GEX is nonzero — the simulator built a regime from a zero baseline, so there's no denominator. That pairs with flow_direction: "regime_flip" and is exactly the scenario you don't want to silently coerce to zero, because it's the most interesting one.
Take-away
Two surfaces, two questions, two field-name conventions:
/v1/exposure/*for the settled OPRA OI view, stable all session, names likegexandnet_gex./v1/flow/*for the intraday flow-adjusted view, names likelive_gexandlive_net_gex.
Independence is the property. Calling one does not move the other. If your client code is unambiguous about which field name it reads, you cannot accidentally cross the streams. If you find yourself doing arithmetic across surfaces, you’ve already made the mistake — there’s a purpose-built field on the flow surface for whatever you were trying to compute.
Tomasz Dobrowolski — building FlashAlpha, an options analytics API. Originally published on the FlashAlpha research blog.
메타데이터
- post_id
- 4e3a131160d3
- slug
- live-gex-vs-settled-gex-why-the-same-symbol-can-have-two-correct-gamma-numbers-4e3a131160d3
- url
- https://medium.com/@diseasex/live-gex-vs-settled-gex-why-the-same-symbol-can-have-two-correct-gamma-numbers-4e3a131160d3
- canonical_url
- https://medium.com/@diseasex/live-gex-vs-settled-gex-why-the-same-symbol-can-have-two-correct-gamma-numbers-4e3a131160d3
- author_url
- https://medium.com/@diseasex
- status
- ok
- fetched_at
- 2026-06-13 12:55:53