Skip to main content

Trust manifesto · v0.3.0

The math is public.
The data is primary.

Most options analytics platforms sit on top of vendor opinions you can’t inspect. We don’t. Every number on Gamma Flow comes from a public formula applied to a primary source. If you want to replicate it offline, this page gives you everything you need.

01

Data sources

What we read, how often, what we pay

CBOE Delayed Quotes (CDN)

Free
https://cdn.cboe.com/api/global/delayed_quotes/options/{sym}.json

Full options chain (strikes, OI, bid/ask, IV, pre-computed Greeks: delta/gamma/theta/vega/rho)

Cadence
60s polling
Delay
~15 minutes

yfinance (Yahoo Finance scraper)

Free
https://github.com/ranaroussi/yfinance

Intraday 1-minute OHLCV bars for the Hero chart, plus VIX index and 20-day momentum for the Q-Score.

Cadence
60s polling · 15s in-process cache
Delay
~15 minutes (matches CBOE)

OCC option symbology

Free (public spec)
https://www.theocc.com/

Decoding the OCC 21-char option symbol → (root, expiry, cp, strike)

Cadence
Reference
Delay

CME / FRED

Free
https://fred.stlouisfed.org/

Risk-free rate (3-mo T-bill) for closed-form Vanna/Charm. Currently a constant; FRED wire-up is queued.

Cadence
On demand
Delay

Notably absent: no SpotGamma, no SqueezeMetrics, no MenthorQ, no GEXBot, no TradingView pro feed. We do not resell anyone else’s data product.

02

Formulas

Convention: SqueezeMetrics — dealers long calls (+), short puts (−)

GEX (Gamma Exposure)

Per-contract: gex = sign × γ × OI × multiplier × spot² × 0.01
sign+1 for calls, −1 for puts
γfrom CBOE pre-computed Greeks
OIopen interest
multiplier100 for US equity options
spot²convert per-unit gamma to per-dollar
× 0.01rescale to a 1% move in spot

Ref · SqueezeMetrics white-paper · SpotGamma methodology

DEX (Delta Exposure)

Per-contract: dex = sign × δ × OI × multiplier × spot
δfrom CBOE pre-computed Greeks

Ref · Standard dealer-hedging convention

HVL — High Volume Level

HVL = argmax_K |Σ gex_K|

The strike with the largest absolute GEX across all expiries. Reads as 'the strike where dealer-hedging concentration is highest' — the spot-magnet candidate.

Gamma Flip

γ-flip = first strike K where Σ_{K' ≤ K} gex_{K'} crosses zero (linearly interpolated)

The price boundary between positive-γ (vol-suppressing) and negative-γ (vol-amplifying) regimes. Used as the divider for the green/red zone backdrop on the Net GEX Profile chart.

Call Wall / Put Support

Call Wall_i = strike with i-th largest positive Σ gex_K · Put Support_i = strike with i-th smallest (most negative) Σ gex_K

We expose the top 3 of each. Wall = resistance from dealer call gamma; Support = floor from dealer put gamma.

Max Pain (per expiry)

Max Pain = argmin_K Σ_i OI_i × max(0, S_i)
S_iITM payout at K_test for contract i — (K − K_i) for calls, (K_i − K) for puts

Strike that minimises the total ITM cash payout to option holders at expiry. Computed against the front-month chain.

Vanna · Charm (closed-form BSM)

vanna = −φ(d₁) × d₂ / σ charm = −φ(d₁) × (2(r−q)t − d₂ σ √t) / (2t σ √t)
φstandard normal PDF
d₁, d₂Black-Scholes d-terms
σimplied vol
ttime to expiry, years
rrisk-free rate (currently a constant — FRED is queued)
qdividend yield, assumed zero for index options

Ref · Hull, Options Futures and Other Derivatives — chapters 17 & 19

Q-Score · 4D Composite

Q = 0.40 · Option + 0.20 · Volatility + 0.25 · Momentum + 0.15 · Seasonality

Each component scored 0–5 with a BULLISH/BEARISH/NEUTRAL signal. Option uses gamma regime + spot-vs-HVL distance; Volatility uses IV30 percentile + skew; Momentum uses 20-day price change via yfinance; Seasonality uses long-run SPX month-of-year average.

Multi-expiry tagging

Tags assigned: FIRST (front expiry), NEXT (second expiry), HIGHEST (highest total GEX across all expiries), SECOND_HIGHEST (second-highest).

We compute per-expiry GEX breakdown so traders can see where dealer hedging concentrates. Tags are stable — same expiry can hold the same tag across refreshes until the rank changes.

Futures conversion (NQ, ES, GC, RTY)

Ratio model: F_levels ≈ underlying_levels × ratio, ratio ∈ { NQ/QQQ ≈ 42, ES/SPY ≈ 10, GC/GLD ≈ 10, RTY/IWM ≈ 1 }

Futures don't trade options-on-futures with the depth we'd want from a free source. We derive futures levels from the corresponding ETF, then convert by the empirical ratio. Each ratio was independently verified against live data — see framework/playbooks/validate-conversion-formula.md.

03

Computation cadence

When numbers change, when caches expire

Frontend refetch interval60 seconds

TanStack Query refetchInterval. Hits backend, which returns from cache 99% of the time.

Backend Hero response cache10 seconds

The compute (scipy vanna/charm) is the dominant cost — cached so warm responses return in ~15ms.

Backend CBOE chain cache30 seconds

Concurrent requests for the same symbol don't all hit CBOE.

Backend yfinance intraday cache15 seconds

1-minute bars only refresh once per minute anyway.

CBOE upstream delay~15 minutes

This is the free-tier latency. Real-time options data costs $$$. For levels (slow-moving), 15min delay is fine.

Market hours09:30 – 16:00 ET, Mon–Fri

Outside RTH, the chain doesn't change. We still serve the last snapshot.

04

Limitations · what we do not claim

Honest about the edges

  • No real-time order flow. What SpotGamma sells as "HIRO" requires paid OPRA classified-trade data (Polygon $99/mo minimum). We do not have it. Anything you see on Gamma Flow comes from open interest + delayed quotes, not live trade tape.
  • No predictions. Q-Score signal is a deterministic function of today’s data. It is not a forecast, not a trade signal, not a recommendation. Past output tells you nothing about future returns.
  • Risk-free rate is currently a constant. Vanna and Charm calculations use a placeholder r. The FRED 3-mo T-bill wire-up is on the roadmap. Sensitivity is small for short-dated options but non-zero for long-dated.
  • Futures levels are derived, not native. NQ, ES, GC, RTY levels are converted from QQQ/SPY/GLD/IWM by an empirical ratio. We document the ratio in the Method section above; if dispersion blows out, the conversion will drift.
  • No backtesting infrastructure yet. We don’t (yet) store the chain history needed to backtest Q-Score signals against forward returns. Sprint 2 will add this.
  • Not financial advice. Self-evident but legally required. The numbers here are for research and education.
05

Replicate it yourself

No paywall on the recipe

Every endpoint is documented at /apidocs (path, params, response, curl) and the raw OpenAPI is at /openapi.json. For the rigorous derivation of GEX / VEX / GEX+ see /methodology. If you want to bypass our UI entirely and call the math from your own notebook, the relevant Python is in backend/app/analytics/:gex.py,market_pulse.py,qscore.py,multi_expiry.py,vanna_charm.py. All of it is pure functions over the CBOE chain dataclass — no hidden state, no licensing tangles.