<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: tomasz dobrowolski</title>
    <description>The latest articles on DEV Community by tomasz dobrowolski (@tomasz_dobrowolski_35d32c).</description>
    <link>https://dev.to/tomasz_dobrowolski_35d32c</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3827438%2F3874bebe-b7b5-43b5-a0e5-53b9c79dbe7b.png</url>
      <title>DEV Community: tomasz dobrowolski</title>
      <link>https://dev.to/tomasz_dobrowolski_35d32c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tomasz_dobrowolski_35d32c"/>
    <language>en</language>
    <item>
      <title>Trading ES &amp; NQ Futures with FlashAlpha: The Complete GEX, Flow &amp; Levels Handbook</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Tue, 16 Jun 2026 20:04:07 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/trading-es-nq-futures-with-flashalpha-the-complete-gex-flow-levels-handbook-52ml</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/trading-es-nq-futures-with-flashalpha-the-complete-gex-flow-levels-handbook-52ml</guid>
      <description>&lt;p&gt;Most "futures gamma" you find online is SPY or SPX equity gamma with the label swapped. FlashAlpha computes dealer positioning &lt;strong&gt;directly on the ES and NQ options-on-futures chains&lt;/strong&gt;, priced with Black-76 on the live forward, with dollar exposure scaled by the real CME contract multiplier ($50/point for ES, $20/point for NQ). That distinction is the whole point of this handbook: the levels you trade should come from the book that actually hedges the contract you're trading.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;Discretionary ES/NQ day traders, premium sellers and 0DTE traders on the index futures, systematic desks building an automated futures dealer-flow monitor, and anyone currently proxying ES off SPX gamma who wants the futures-native read. It assumes you already know what gamma exposure is. If you don't, start with &lt;a href="https://flashalpha.com/articles/what-is-gamma-exposure-gex-explained" rel="noopener noreferrer"&gt;what gamma exposure measures&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What FlashAlpha computes on ES &amp;amp; NQ
&lt;/h2&gt;

&lt;p&gt;Everything that works for an equity works for the futures by swapping the symbol to &lt;code&gt;ES=F&lt;/code&gt; or &lt;code&gt;NQ=F&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gamma exposure (GEX).&lt;/strong&gt; Net dealer gamma, by strike and full-chain, with the gamma flip, call wall and put wall. See it on &lt;a href="https://flashalpha.com/futures/es/gamma" rel="noopener noreferrer"&gt;/futures/es/gamma&lt;/a&gt; and &lt;a href="https://flashalpha.com/futures/nq/gamma" rel="noopener noreferrer"&gt;/futures/nq/gamma&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DEX, VEX, CHEX.&lt;/strong&gt; Delta, vanna and charm exposure, on the same dollar conventions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Key levels.&lt;/strong&gt; Gamma flip (the regime boundary), call and put walls (resistance and support), &lt;a href="https://flashalpha.com/futures/es/max-pain" rel="noopener noreferrer"&gt;max pain&lt;/a&gt;, and the highest-OI strike.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expected move.&lt;/strong&gt; The options-implied 1-day, 1-week and 1-month range from live ATM IV.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Volatility.&lt;/strong&gt; ATM IV, the &lt;a href="https://flashalpha.com/futures/es/skew" rel="noopener noreferrer"&gt;25-delta skew&lt;/a&gt;, term structure, realized vol, VRP, and the SVI &lt;a href="https://flashalpha.com/futures/es/vol-surface" rel="noopener noreferrer"&gt;volatility surface&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flow analytics.&lt;/strong&gt; The same exposures recomputed on intraday &lt;em&gt;effective&lt;/em&gt; open interest, so the dealer book updates through the session (the &lt;a href="https://flashalpha.com/articles/flow-gex-on-futures-live-dealer-flow-es-nq" rel="noopener noreferrer"&gt;flow GEX&lt;/a&gt; read).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0DTE.&lt;/strong&gt; Pin risk, expected move, gamma acceleration and theta decay for same-day ES/NQ expiries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Basis.&lt;/strong&gt; The live ES−SPX and NQ−NDX carry basis, i.e. futures "fair value."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rendered live views are &lt;a href="https://flashalpha.com/futures/es" rel="noopener noreferrer"&gt;/futures/es&lt;/a&gt; and &lt;a href="https://flashalpha.com/futures/nq" rel="noopener noreferrer"&gt;/futures/nq&lt;/a&gt;; the &lt;a href="https://flashalpha.com/futures" rel="noopener noreferrer"&gt;futures hub&lt;/a&gt; shows both side by side.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Symbology &amp;amp; access
&lt;/h2&gt;

&lt;p&gt;Futures are served under the familiar &lt;code&gt;=F&lt;/code&gt; convention so they never collide with same-named equities: &lt;code&gt;ES=F&lt;/code&gt; (E-mini S&amp;amp;P 500) and &lt;code&gt;NQ=F&lt;/code&gt; (E-mini Nasdaq-100), each resolving to the continuous front-month contract. In REST paths, URL-encode the &lt;code&gt;=&lt;/code&gt; as &lt;code&gt;%3D&lt;/code&gt;, for example &lt;code&gt;/v1/exposure/gex/ES%3DF&lt;/code&gt;. The SDKs take the raw &lt;code&gt;ES=F&lt;/code&gt;. CME index futures and the flow analytics are &lt;a href="https://flashalpha.com/pricing" rel="noopener noreferrer"&gt;Growth-tier&lt;/a&gt; features.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Why the numbers are right: Black-76 &amp;amp; the multiplier
&lt;/h2&gt;

&lt;p&gt;An option on a future is priced on the &lt;strong&gt;forward&lt;/strong&gt;, not a drifting spot. FlashAlpha uses Black-76, which is Black-Scholes-Merton evaluated on the forward (S = F) with carry q = r, so delta, gamma, vega, theta, vanna and charm all come out correct for the futures contract. Dollar exposure then carries the real multiplier: &lt;strong&gt;$50 per index point for ES, $20 for NQ&lt;/strong&gt;, not the 100x equity-option multiplier. Get the model or the multiplier wrong and every exposure number is off by a constant. Full detail in the &lt;a href="https://flashalpha.com/methodology/futures" rel="noopener noreferrer"&gt;futures and index methodology&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The four levels every futures trader reads
&lt;/h2&gt;

&lt;p&gt;These are the actionable outputs. On any &lt;a href="https://flashalpha.com/futures/es" rel="noopener noreferrer"&gt;futures page&lt;/a&gt; they render in the Quick-Stats and on the GEX chart:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gamma flip.&lt;/strong&gt; The price where net GEX crosses zero. Above it, dealers are long gamma and &lt;em&gt;dampen&lt;/em&gt; moves: they buy dips and sell rips, so price tends to mean-revert. Below it, they're short gamma and &lt;em&gt;amplify&lt;/em&gt; them: trends run and ranges widen. This is the single most important regime read.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Call wall.&lt;/strong&gt; The strike of greatest call gamma above price. It acts as resistance as dealer hedging caps advances.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Put wall.&lt;/strong&gt; The strike of greatest put gamma below price. It acts as support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Max pain.&lt;/strong&gt; The OI-weighted settlement strike that minimizes total option-holder payout, a soft magnet into expiry. See &lt;a href="https://flashalpha.com/futures/es/max-pain" rel="noopener noreferrer"&gt;ES max pain&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alongside them, the &lt;strong&gt;expected move&lt;/strong&gt; (&lt;code&gt;price × ATM IV × √(days/252)&lt;/code&gt;) frames the day's plausible range, and the &lt;strong&gt;basis&lt;/strong&gt; tells you how the futures levels sit relative to the cash index.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Settled vs flow GEX: the intraday read
&lt;/h2&gt;

&lt;p&gt;Settled GEX is built on the exchange's once-daily settlement open interest. It's accurate, but it's stamped to the prior close and sits static all session. &lt;strong&gt;Flow GEX&lt;/strong&gt; recomputes the same dealer book on intraday &lt;em&gt;effective&lt;/em&gt; OI (settled OI plus a flow-classified estimate of today's net opening trades), so the regime, the flip and the walls move &lt;em&gt;during&lt;/em&gt; the session. On a contract that trades nearly 24 hours, that's the difference between a stale snapshot and a live read. Full mechanics in &lt;a href="https://flashalpha.com/articles/flow-gex-on-futures-live-dealer-flow-es-nq" rel="noopener noreferrer"&gt;flow GEX on futures&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. The daily playbook (session by session)
&lt;/h2&gt;

&lt;p&gt;ES and NQ trade almost around the clock on CME Globex, so the workflow spans four windows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pre-market.&lt;/strong&gt; Check the overnight &lt;a href="https://flashalpha.com/articles/flow-gex-on-futures-live-dealer-flow-es-nq" rel="noopener noreferrer"&gt;flow gamma regime&lt;/a&gt; (did a flip form overnight?), the &lt;strong&gt;basis&lt;/strong&gt; to cash (the "fair value" gap), the gamma flip, and the call and put walls bracketing the overnight range. Note the expected move for the session.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cash open (09:30 ET).&lt;/strong&gt; Confirm whether price is above or below the gamma flip. That sets your bias toward mean reversion (long gamma) or trend (short gamma). Watch the put wall as support and the call wall as resistance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Midday into the close.&lt;/strong&gt; 0DTE gamma and charm take over. Use &lt;a href="https://flashalpha.com/docs/lab-api-zero-dte" rel="noopener noreferrer"&gt;0DTE analytics&lt;/a&gt; for pin risk around the magnet strike and the remaining-session expected move; max pain becomes a stronger draw as OI decays.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overnight (Globex).&lt;/strong&gt; Flow GEX keeps updating on Asia and Europe trade, so a regime shift on an overnight headline is visible hours before the US open.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. The basis &amp;amp; the roll ("fair value")
&lt;/h2&gt;

&lt;p&gt;Futures and cash are bound by cost of carry:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;F&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;S&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;⋅&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mopen mtight"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;r&lt;/span&gt;&lt;span class="mbin mtight"&gt;−&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;q&lt;/span&gt;&lt;span class="mclose mtight"&gt;)&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Basis&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;F&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;S&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;The basis (future minus cash index) is what desks call "fair value." A positive basis (contango) is the normal, financing-positive state, and it drifts toward zero into each quarterly roll (Mar/Jun/Sep/Dec). Because ES strikes and walls live on the &lt;em&gt;futures&lt;/em&gt; price, they're offset from the equivalent SPX cash levels by the basis. FlashAlpha shows the live ES−SPX and NQ−NDX basis on the futures pages, and surfaces a per-expiry forward basis in the advanced-volatility analytics.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. ES vs SPY/SPX: why trade the futures-native read
&lt;/h2&gt;

&lt;p&gt;If you trade ES, the ES options book is what hedges ES, not the SPY or SPX book. Three reasons the futures-native read matters: (1) &lt;strong&gt;levels are basis-offset&lt;/strong&gt; from cash, so SPX walls are in the wrong place for an ES stop; (2) &lt;strong&gt;dollar gamma uses the $50 multiplier&lt;/strong&gt;, not 100x, so magnitudes differ; (3) &lt;strong&gt;ES hedges overnight&lt;/strong&gt; on Globex when SPY is closed, so the gamma regime can shift outside US hours. Use the cash read as context, but trade the contract's own book.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Automate it: the API
&lt;/h2&gt;

&lt;p&gt;Every endpoint takes the futures symbol directly (encode the &lt;code&gt;=&lt;/code&gt; as &lt;code&gt;%3D&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Full-chain gamma exposure by strike on ES futures&lt;/span&gt;
curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://lab.flashalpha.com/v1/exposure/gex/ES%3DF"&lt;/span&gt;

&lt;span class="c"&gt;# Key levels (gamma flip, call/put wall, max pain) on NQ&lt;/span&gt;
curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://lab.flashalpha.com/v1/exposure/levels/NQ%3DF"&lt;/span&gt;

&lt;span class="c"&gt;# Intraday flow-adjusted GEX on ES&lt;/span&gt;
curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://lab.flashalpha.com/v1/flow/gex/ES%3DF"&lt;/span&gt;

&lt;span class="c"&gt;# The whole summary (price, IV, exposure, basis context) for ES&lt;/span&gt;
curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://lab.flashalpha.com/v1/stock/ES%3DF/summary"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response schema is identical to the equity endpoints, so existing code works by swapping the symbol. See the &lt;a href="https://flashalpha.com/docs/lab-api-gex" rel="noopener noreferrer"&gt;GEX&lt;/a&gt;, &lt;a href="https://flashalpha.com/docs/lab-api-flow" rel="noopener noreferrer"&gt;flow&lt;/a&gt; and &lt;a href="https://flashalpha.com/docs/lab-api-zero-dte" rel="noopener noreferrer"&gt;0DTE&lt;/a&gt; docs, and the &lt;a href="https://flashalpha.com/docs" rel="noopener noreferrer"&gt;full reference&lt;/a&gt;. Official SDKs cover Python, JavaScript, .NET, Go and Java.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. What to keep in mind
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dealer positioning is an assumption&lt;/strong&gt; (calls dealer-long gamma, puts dealer-short), not observed inventory. The metrics are a structural lens on hedging pressure, not a measurement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Levels are heuristics, not forecasts.&lt;/strong&gt; Walls, flip and max pain describe where hedging concentrates, not where price has to go.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Liquidity matters.&lt;/strong&gt; The analytics are strongest where the options-on-futures chains are liquid (ES and NQ). Thin overnight books make levels noisier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not investment advice.&lt;/strong&gt; Futures trading carries substantial risk of loss.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does FlashAlpha compute gamma on ES/NQ futures, or proxy it from SPY/SPX?&lt;/strong&gt;&lt;br&gt;
Directly on the ES and NQ options-on-futures chains. Options are priced with Black-76 on the live futures forward, and dollar exposure uses the real CME multiplier ($50/point ES, $20/point NQ). It isn't SPY/SPX gamma relabeled; it's the dealer book that actually hedges the futures contract.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which futures can I trade with this, and how do I access them?&lt;/strong&gt;&lt;br&gt;
Full options analytics cover the liquid equity-index futures: ES (E-mini S&amp;amp;P 500, symbol &lt;code&gt;ES=F&lt;/code&gt;) and NQ (E-mini Nasdaq-100, &lt;code&gt;NQ=F&lt;/code&gt;). Use the &lt;a href="https://flashalpha.com/futures/es" rel="noopener noreferrer"&gt;/futures/es&lt;/a&gt; and &lt;a href="https://flashalpha.com/futures/nq" rel="noopener noreferrer"&gt;/futures/nq&lt;/a&gt; pages, or call any endpoint with the symbol (encode &lt;code&gt;=&lt;/code&gt; as &lt;code&gt;%3D&lt;/code&gt;). CME index futures and flow analytics are Growth-tier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I use the gamma flip and walls to trade ES intraday?&lt;/strong&gt;&lt;br&gt;
Read the gamma flip first: above it dealers dampen moves (favor fading extremes back toward the mean), below it they amplify them (favor trend continuation and wider stops). The call wall is resistance, the put wall is support. These are structural pressure levels, not guarantees, so combine them with your own execution and risk rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why do ES gamma levels differ from SPX, and what is the basis?&lt;/strong&gt;&lt;br&gt;
ES levels are quoted on the futures price, which sits above cash SPX by the basis (F − S, the cost-of-carry "fair value," positive in normal contango and drifting to zero into the quarterly roll). So an ES wall is offset from the equivalent SPX strike by that basis. Trade the ES book for ES, and use SPX as context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I automate an ES/NQ dealer-flow monitor with the API?&lt;/strong&gt;&lt;br&gt;
Yes. Poll &lt;code&gt;/v1/exposure/gex/ES%3DF&lt;/code&gt;, &lt;code&gt;/v1/exposure/levels/ES%3DF&lt;/code&gt;, &lt;code&gt;/v1/flow/gex/ES%3DF&lt;/code&gt; and &lt;code&gt;/v1/stock/ES%3DF/summary&lt;/code&gt; on your cadence; the schema matches the equity endpoints. Official SDKs cover Python, JS, .NET, Go and Java. See the API docs for fields and rate limits.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Live ES &amp;amp; NQ dealer positioning: &lt;a href="https://flashalpha.com/futures" rel="noopener noreferrer"&gt;flashalpha.com/futures&lt;/a&gt;. API docs: &lt;a href="https://flashalpha.com/docs" rel="noopener noreferrer"&gt;flashalpha.com/docs&lt;/a&gt;. Originally published on the &lt;a href="https://flashalpha.com/articles/trading-es-nq-futures-with-flashalpha-handbook" rel="noopener noreferrer"&gt;FlashAlpha blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>futures</category>
      <category>trading</category>
      <category>options</category>
      <category>api</category>
    </item>
    <item>
      <title>GEX on ES &amp; NQ Futures: Live Gamma Exposure for E-mini S&amp;P and Nasdaq</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Tue, 16 Jun 2026 19:02:23 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/gex-on-es-nq-futures-live-gamma-exposure-for-e-mini-sp-and-nasdaq-2h39</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/gex-on-es-nq-futures-live-gamma-exposure-for-e-mini-sp-and-nasdaq-2h39</guid>
      <description>&lt;p&gt;Gamma exposure on index futures has been a blind spot for almost every analytics vendor. Most "futures GEX" you'll see is really SPY or SPX gamma with the label swapped: the same equity chain, plotted on a futures chart. That isn't what we compute.&lt;/p&gt;

&lt;p&gt;We compute it directly on the &lt;strong&gt;options-on-futures chains&lt;/strong&gt; for the E-mini S&amp;amp;P 500 (ES) and E-mini Nasdaq-100 (NQ), priced against the live futures forward, with the right contract economics applied at every step.&lt;/p&gt;

&lt;p&gt;This is the futures-specific companion to the general explainer, so it won't re-derive what GEX is. If you need that, start with &lt;a href="https://flashalpha.com/articles/what-is-gamma-exposure-gex-explained" rel="noopener noreferrer"&gt;What Is Gamma Exposure (GEX) Explained&lt;/a&gt;. What this covers is everything that changes once the underlying is a cash-settled index future instead of an equity or ETF: the pricing model, the multiplier, the basis, the symbology, and why ES dealer-gamma has to be read differently from SPY.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;New:&lt;/strong&gt; GEX, DEX, VEX and CHEX are now live for &lt;code&gt;ES=F&lt;/code&gt; and &lt;code&gt;NQ=F&lt;/code&gt;. They run through the same exposure endpoints you already use for equities, plus dedicated &lt;a href="https://flashalpha.com/futures/es" rel="noopener noreferrer"&gt;ES&lt;/a&gt; and &lt;a href="https://flashalpha.com/futures/nq" rel="noopener noreferrer"&gt;NQ&lt;/a&gt; futures pages.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What Is Different About Futures GEX?
&lt;/h2&gt;

&lt;p&gt;The mechanics of dealer hedging are identical to equities: long gamma dampens moves, short gamma amplifies them, the gamma flip marks the regime boundary, and call/put walls act as resistance and support. What changes on futures is the &lt;em&gt;plumbing underneath the gamma number&lt;/em&gt;. Three things differ, and each one matters if you want the dollar figures to come out right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The underlying is a futures price, not a spot price.&lt;/strong&gt; ES and NQ are cash-settled index futures. The options are written on the futures contract itself, a live exchange quote off CME Globex, and that contract trades at a basis to the underlying cash index (SPX for ES, NDX for NQ). It isn't SPY, it isn't QQQ, and it isn't the cash index.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The options are priced with Black-76, not Black-Scholes on spot.&lt;/strong&gt; Options on futures are forward-settled, so the right model is Black-76. It prices off the forward &lt;em&gt;F&lt;/em&gt; rather than a spot that drifts at the risk-free rate. Run spot Black-Scholes on them and you mis-price every Greek that feeds GEX.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The contract multiplier is not ×100.&lt;/strong&gt; Equity options control 100 shares. Index futures options carry the futures multiplier: &lt;strong&gt;$50 per index point for ES, $20 per point for NQ&lt;/strong&gt;. Dollar gamma has to scale by that multiplier, or your GEX comes out wrong by a constant factor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Black-76: Pricing Options on the Forward
&lt;/h2&gt;

&lt;p&gt;For a futures option, the underlying the option references is the futures price &lt;em&gt;F&lt;/em&gt;, which already embeds carry to expiry. Black-76 is the standard model for this. The European call price is:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;C&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;e&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;−&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;r&lt;/span&gt;&lt;span class="mord mathnormal mtight"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="minner"&gt;&lt;span class="mopen delimcenter"&gt;[&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;F&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;N&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;d&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;K&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;N&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;d&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mclose delimcenter"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;with&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;d&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;span class="mord sqrt"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span class="svg-align"&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="hide-tail"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mop"&gt;ln&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord mathnormal"&gt;F&lt;/span&gt;&lt;span class="mord"&gt;/&lt;/span&gt;&lt;span class="mord mathnormal"&gt;K&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;d&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;d&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;σ&lt;/span&gt;&lt;span class="mord sqrt"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span class="svg-align"&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;T&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="hide-tail"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;where &lt;em&gt;F&lt;/em&gt; is the futures forward, &lt;em&gt;K&lt;/em&gt; the strike, &lt;em&gt;T&lt;/em&gt; the time to expiry, &lt;em&gt;σ&lt;/em&gt; the implied volatility, &lt;em&gt;r&lt;/em&gt; the risk-free rate, and &lt;em&gt;N&lt;/em&gt; the standard normal CDF. The single discount factor &lt;code&gt;e^(−rT)&lt;/code&gt; out front is what marks this as a forward model: the forward already carries the cost of carry, so there's no separate drift term inside.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The clean identity.&lt;/strong&gt; Black-76 is just Black-Scholes with the substitution &lt;strong&gt;S = F&lt;/strong&gt; and dividend yield &lt;strong&gt;q = r&lt;/strong&gt;. Price, delta, gamma, vega, theta, vanna and charm all carry straight over; only rho differs. So the gamma feeding futures GEX runs on the same pricing core as our equity gamma. There's no separate, riskier re-derivation to get wrong.&lt;/p&gt;

&lt;p&gt;Because a future's forward is just the future's own price, we pull the per-expiry forward from the chain by put-call parity, and where there's no pair to use, the fallback collapses to the futures price itself. Nothing applies an equity-style &lt;code&gt;S·e^(rT)&lt;/code&gt; forward. What drops out is the real sensitivity of an options-on-futures position, not an approximation of one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Multiplier: Why ES Dollar-Gamma Scales by $50
&lt;/h2&gt;

&lt;p&gt;Gamma per contract is a count of "deltas per point." To get &lt;strong&gt;dollar gamma exposure&lt;/strong&gt;, the quantity GEX actually aggregates, you multiply that by open interest, by the underlying price (twice, for the dollar-per-1%-move convention), and by the contract multiplier. For equities the multiplier is 100. For index futures it's the contract's point value:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Contract&lt;/th&gt;
&lt;th&gt;Point value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ES (E-mini S&amp;amp;P)&lt;/td&gt;
&lt;td&gt;$50 / pt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NQ (E-mini NDX)&lt;/td&gt;
&lt;td&gt;$20 / pt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Equity option&lt;/td&gt;
&lt;td&gt;$100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The conceptual form of dollar gamma exposure at a strike is:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;GEX&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;Γ&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;O&lt;/span&gt;&lt;span class="mord mathnormal"&gt;I&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Multiplier&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;F&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0.01&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;(dealer&amp;nbsp;sign)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;The multiplier isn't cosmetic. A $50 ES point value looks small next to the $100 of share exposure on an equity option, but the index sits at several thousand points and open interest piles into the front quarterly, so the &lt;em&gt;dollar&lt;/em&gt; gamma on a single ES strike ends up large. Get the multiplier wrong and the whole dollar-GEX surface is mis-scaled by a constant. Flips and walls still land at the right &lt;em&gt;strikes&lt;/em&gt;, but every notional and every dealer-hedging estimate is off. We thread the right multiplier through every aggregator (GEX, DEX, VEX, CHEX, max pain, dealer notional), so the dollar numbers are correct and not just the shape.&lt;/p&gt;

&lt;p&gt;The same discipline applies to the micros, but the public futures pages cover the full-size &lt;code&gt;ES=F&lt;/code&gt; and &lt;code&gt;NQ=F&lt;/code&gt; contracts, which carry the deepest, most liquid options-on-futures chains.&lt;/p&gt;

&lt;h2&gt;
  
  
  Basis: Why ES Dealer-Gamma Reads Differently From SPY
&lt;/h2&gt;

&lt;p&gt;SPY tracks the S&amp;amp;P 500 at roughly 1/10th the index, fully funded, with a continuous dividend yield. ES is a leveraged, financed exposure to the same index, and it trades at a &lt;strong&gt;basis&lt;/strong&gt; to cash:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Basis&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;F&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;S&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;Basis&amp;nbsp;%&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;S&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;F&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;S&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;where &lt;em&gt;F&lt;/em&gt; is the ES future and &lt;em&gt;S&lt;/em&gt; is the SPX cash index. A positive basis (contango) means the future trades above cash; a negative basis (backwardation) means below. The basis reflects financing minus dividends to the contract's expiry, and it drifts as the contract approaches its quarterly roll.&lt;/p&gt;

&lt;p&gt;Which is why you can't just read ES gamma off a SPY chart:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The strikes live on the futures price.&lt;/strong&gt; An ES call wall sits at an ES futures level, offset from the equivalent SPX level by the basis. Plot it against cash and you've put the wall in the wrong place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The chains aren't the same product.&lt;/strong&gt; ES options-on-futures, SPX index options, and SPY ETF options each have their own open interest, their own 0DTE behavior, and their own dealer positioning. They correlate, but the book that hedges ES is the ES options book.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The session is nearly 24 hours.&lt;/strong&gt; ES trades CME Globex hours, so its gamma regime is live overnight and through the European session, when SPY is closed. The flip can get tested at 3 a.m. ET.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ES / NQ futures GEX vs SPY / QQQ ETF GEX
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;ES / NQ futures&lt;/th&gt;
&lt;th&gt;SPY / QQQ ETF&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chain&lt;/td&gt;
&lt;td&gt;Options-on-futures&lt;/td&gt;
&lt;td&gt;Equity options&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing&lt;/td&gt;
&lt;td&gt;Black-76 on the futures forward&lt;/td&gt;
&lt;td&gt;Black-Scholes on spot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiplier&lt;/td&gt;
&lt;td&gt;$50 (ES) / $20 (NQ) per point&lt;/td&gt;
&lt;td&gt;$100 per contract&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strikes&lt;/td&gt;
&lt;td&gt;On the futures price&lt;/td&gt;
&lt;td&gt;On the ETF price&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session&lt;/td&gt;
&lt;td&gt;~23h Globex&lt;/td&gt;
&lt;td&gt;RTH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Settlement&lt;/td&gt;
&lt;td&gt;Cash index&lt;/td&gt;
&lt;td&gt;Physically settled shares + dividend yield&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Symbology: ES=F and NQ=F
&lt;/h2&gt;

&lt;p&gt;We serve the equity-index futures under the &lt;code&gt;=F&lt;/code&gt; suffix, the same convention you already know from Yahoo Finance and most data tools:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Contract&lt;/th&gt;
&lt;th&gt;Symbol&lt;/th&gt;
&lt;th&gt;Cash index&lt;/th&gt;
&lt;th&gt;Multiplier&lt;/th&gt;
&lt;th&gt;Page&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;E-mini S&amp;amp;P 500&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ES=F&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SPX&lt;/td&gt;
&lt;td&gt;$50 / pt&lt;/td&gt;
&lt;td&gt;/futures/es&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E-mini Nasdaq-100&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NQ=F&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;NDX&lt;/td&gt;
&lt;td&gt;$20 / pt&lt;/td&gt;
&lt;td&gt;/futures/nq&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both resolve to the continuous front-month contract, so you always get the active, most-liquid expiry without having to track the quarterly roll yourself. The chain, quotes, open interest and exposure all flow through the same endpoints you'd use for any ticker. The only thing that changes is the symbol.&lt;/p&gt;

&lt;h2&gt;
  
  
  How To Get It: Endpoints and Pages
&lt;/h2&gt;

&lt;p&gt;The fastest way to see it is the dedicated futures pages, which render the live GEX, key levels, basis, expected move and contract specs server-side:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://flashalpha.com/futures/es" rel="noopener noreferrer"&gt;/futures/es&lt;/a&gt;: live ES gamma exposure, levels, basis to SPX, and contract specs.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://flashalpha.com/futures/nq" rel="noopener noreferrer"&gt;/futures/nq&lt;/a&gt;: live NQ gamma exposure, levels, basis to NDX, and contract specs.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://flashalpha.com/futures" rel="noopener noreferrer"&gt;/futures&lt;/a&gt;: the futures hub, both contracts side by side.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For programmatic access, the exposure endpoints take the futures symbol directly. The one thing to remember is to &lt;strong&gt;URL-encode the &lt;code&gt;=&lt;/code&gt; as &lt;code&gt;%3D&lt;/code&gt;&lt;/strong&gt;, since a raw &lt;code&gt;=&lt;/code&gt; can break path-segment routing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Live GEX on ES futures (note %3D for the '=')&lt;/span&gt;
curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://lab.flashalpha.com/v1/exposure/gex/ES%3DF"&lt;/span&gt;

&lt;span class="c"&gt;# And NQ&lt;/span&gt;
curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://lab.flashalpha.com/v1/exposure/gex/NQ%3DF"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The higher-order dealer-positioning surface is there for futures too. Delta, vanna and charm exposure use the same path pattern:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;What it returns for ES/NQ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/v1/exposure/gex/ES%3DF&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Per-strike gamma exposure, net GEX, gamma flip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/v1/exposure/dex/ES%3DF&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Per-strike delta exposure (DEX)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/v1/exposure/vex/ES%3DF&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Per-strike vanna exposure (VEX)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/v1/exposure/chex/ES%3DF&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Per-strike charm exposure (CHEX)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/v1/exposure/levels/ES%3DF&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gamma flip, call wall, put wall, max-gamma strikes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The response schema is identical to the equity exposure endpoints, so any code or dashboard you already built against &lt;code&gt;/v1/exposure/gex/SPY&lt;/code&gt; works against &lt;code&gt;ES%3DF&lt;/code&gt; by swapping the symbol. See the &lt;a href="https://flashalpha.com/docs" rel="noopener noreferrer"&gt;API documentation&lt;/a&gt; for the full field reference.&lt;/p&gt;

&lt;p&gt;If a request comes back with a 404 or an empty body, the usual culprit is an un-encoded &lt;code&gt;=&lt;/code&gt;. Always send &lt;code&gt;ES%3DF&lt;/code&gt; / &lt;code&gt;NQ%3DF&lt;/code&gt; in the path. Most HTTP clients and SDKs handle this for you with standard URL-encoding.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It's Computed
&lt;/h2&gt;

&lt;p&gt;The pipeline that produces ES and NQ gamma exposure is the equity pipeline with futures-correct economics threaded through it, not a parallel approximation.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ingest the options-on-futures chain.&lt;/strong&gt; CME equity-index futures and their option chains land in the same option store under the futures root (ES, NQ), so the API serves them like any other ticker. Chain, quotes and open interest all resolve through the standard endpoints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resolve the live forward.&lt;/strong&gt; The underlying is the futures price from the exchange feed. A per-expiry forward is derived from the chain by put-call parity; the no-pair fallback collapses to the futures price itself (a future's forward is its own price).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price with Black-76.&lt;/strong&gt; Every option's implied volatility and Greeks are computed on the forward using Black-76 (Black-Scholes with &lt;em&gt;S = F, q = r&lt;/em&gt;). Gamma, delta, vanna and charm all come out of this single pricing core.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stamp the contract multiplier.&lt;/strong&gt; Each Greeks snapshot carries the contract's multiplier ($50 for ES, $20 for NQ) instead of the equity default of 100. The multiplier flows with the data into every aggregator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aggregate dollar exposure with the dealer convention.&lt;/strong&gt; Per-strike gamma is signed for the standard dealer book (short the options customers bought), scaled by OI and the multiplier, then summed into net GEX, the gamma flip and the call/put walls. DEX, VEX and CHEX come out of the same machinery.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Because the futures path reuses the proven equity core under one clean substitution, the gamma is computed exactly the way it always has been. Only the forward, the model variant and the multiplier change. What you get is real options-on-futures dealer gamma scaled in actual dollars, not equity gamma wearing a futures label.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading ES and NQ Gamma in Practice
&lt;/h2&gt;

&lt;p&gt;The interpretation rules carry over from the &lt;a href="https://flashalpha.com/articles/what-is-gamma-exposure-gex-explained" rel="noopener noreferrer"&gt;general GEX explainer&lt;/a&gt;, but a few futures-specific habits pay off:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Watch the flip overnight.&lt;/strong&gt; ES gamma is live through the Globex session. A negative-gamma regime that gets tested at 4 a.m. ET on a macro headline behaves just like an intraday test, with the same amplified, trendy moves, hours before SPY opens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Translate walls through the basis.&lt;/strong&gt; If you trade ES off a SPX-quoted level, add the current basis to put the level on the futures price. The futures pages show the live basis so you don't have to do it by hand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare ES and NQ regimes.&lt;/strong&gt; The two contracts can sit in different gamma regimes (NQ short-gamma while ES is pinned, say). That divergence is itself a signal about where dealer hedging will add stress.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use the cash cross-links.&lt;/strong&gt; The futures pages cross-link to the &lt;a href="https://flashalpha.com/stock/spx" rel="noopener noreferrer"&gt;SPX&lt;/a&gt; and &lt;a href="https://flashalpha.com/stock/ndx" rel="noopener noreferrer"&gt;NDX&lt;/a&gt; cash pages, so you can see the futures dealer book and the index dealer book together.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does FlashAlpha compute GEX on ES and NQ, or approximate it from SPY/QQQ?&lt;/strong&gt;&lt;br&gt;
It computes GEX directly on the ES and NQ options-on-futures chains. Options are priced with Black-76 on the live futures forward, and dollar gamma is scaled by the real contract multiplier ($50/pt ES, $20/pt NQ). It isn't SPY or QQQ equity gamma relabeled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Black-76 instead of Black-Scholes?&lt;/strong&gt;&lt;br&gt;
Options on futures are written on the futures price, which already embeds carry to expiry, so the right model prices off the forward rather than a drifting spot. Black-76 is equivalent to Black-Scholes with S = F and q = r, so price, delta, gamma, vega, theta, vanna and charm all carry over; only rho differs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does the contract multiplier affect dollar GEX?&lt;/strong&gt;&lt;br&gt;
Dollar gamma exposure scales by the multiplier. Equity options use ×100; ES uses $50/pt and NQ $20/pt. Using ×100 on a futures chain overstates the dollar exposure by a constant factor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the futures basis?&lt;/strong&gt;&lt;br&gt;
The basis is F − S, the difference between the futures price and the cash index (SPX for ES, NDX for NQ). It reflects financing minus dividends to expiry and drifts toward zero into the quarterly roll. Because ES strikes and walls live on the futures price, they're offset from the equivalent cash levels by the basis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I get live GEX for ES and NQ?&lt;/strong&gt;&lt;br&gt;
Use the &lt;a href="https://flashalpha.com/futures/es" rel="noopener noreferrer"&gt;/futures/es&lt;/a&gt; and &lt;a href="https://flashalpha.com/futures/nq" rel="noopener noreferrer"&gt;/futures/nq&lt;/a&gt; pages, or call &lt;code&gt;GET https://lab.flashalpha.com/v1/exposure/gex/ES%3DF&lt;/code&gt; (URL-encode the &lt;code&gt;=&lt;/code&gt; as &lt;code&gt;%3D&lt;/code&gt;). DEX, VEX, CHEX and key levels use the same path pattern.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Live ES &amp;amp; NQ gamma exposure: &lt;a href="https://flashalpha.com/futures" rel="noopener noreferrer"&gt;flashalpha.com/futures&lt;/a&gt;. API docs: &lt;a href="https://flashalpha.com/docs" rel="noopener noreferrer"&gt;flashalpha.com/docs&lt;/a&gt;. Originally published on the &lt;a href="https://flashalpha.com/articles/gex-on-futures-es-nq-gamma-exposure" rel="noopener noreferrer"&gt;FlashAlpha blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>options</category>
      <category>trading</category>
      <category>quant</category>
      <category>api</category>
    </item>
    <item>
      <title>The 0DTE Gamma Heatmap API: Strike-by-Time GEX, a HIRO and Heatseeker Alternative</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Sun, 14 Jun 2026 19:15:39 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/the-0dte-gamma-heatmap-api-strike-by-time-gex-a-hiro-and-heatseeker-alternative-3lcc</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/the-0dte-gamma-heatmap-api-strike-by-time-gex-a-hiro-and-heatseeker-alternative-3lcc</guid>
      <description>&lt;p&gt;A strike-by-time gamma heatmap is the chart SpotGamma TRACE and Skylit Heatseeker are known for. &lt;code&gt;GET /v1/flow/zero-dte/heatmap/{symbol}&lt;/code&gt; returns that same strike × time matrix for today's 0DTE chain as plain JSON — so you render it in your own stack or feed it to a model instead of staring at someone else's dashboard. It's the per-strike layer of the broader live 0DTE flow family.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Read this first.&lt;/strong&gt; The heatmap is built on FlashAlpha's flow model — effective open interest plus aggressor-classified trades — not a dealer's actual book. The values are &lt;em&gt;estimates&lt;/em&gt;. Read the bands, shifts, and signs as a relative map of where positioning sits, not exact dealer inventory.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What a strike-by-time heatmap shows
&lt;/h2&gt;

&lt;p&gt;A single GEX snapshot tells you where dealer gamma sits &lt;em&gt;right now&lt;/em&gt;. A heatmap adds the dimension every 0DTE trader wants: how that profile moves through the session. Strikes down one axis, time across the other, color encodes the metric. Read across a row to see one strike build or bleed; read down a column for the whole profile at one instant; watch the bright bands migrate to see the magnet and walls shift.&lt;/p&gt;

&lt;p&gt;That migration is the signal. A bright positive-gamma band that locks onto a strike and stays is pinning. A band bracketing price that thins out means the walls are weakening and a breakout gets easier. On a 0DTE chain this happens within hours — a static morning chart misses it, a live matrix doesn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The endpoint
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;GET /v1/flow/zero-dte/heatmap/{symbol}?bar=1m&amp;amp;metric=gex&amp;amp;mode=raw&amp;amp;minutes=60&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Strikes are pulled out into a top-level &lt;code&gt;strikes_grid&lt;/code&gt;, and each bar's &lt;code&gt;values&lt;/code&gt; array is parallel by index — so you index it as &lt;code&gt;values[bar][strike]&lt;/code&gt;, exactly the shape a heatmap library wants. Roughly 30% smaller on the wire than per-cell objects.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"symbol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SPX"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"underlying_price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;6012.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expiration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-12"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metric"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gex"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"raw"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bar_size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1m"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"as_of"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-12T18:45:12Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"market_open"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"strikes_grid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5995&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6005&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6010&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6015&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6020&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bars"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"t"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-12T18:43:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"spot"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;6011.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"values"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;-1.1e9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-3.8e8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.9e8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;9.0e8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.7e9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2.8e8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"t"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-12T18:44:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"spot"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;6012.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"values"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;-1.2e9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-4.0e8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2.1e8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;9.5e8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.8e9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;3.0e8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"gap_intervals"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Six metrics, one grid
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;metric&lt;/code&gt; parameter swaps what the color channel represents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gex&lt;/code&gt; — gamma exposure per strike (default). Bright positive = pin zones, deep negative = accelerant zones.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dex&lt;/code&gt; — delta exposure, directional dealer positioning.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vex&lt;/code&gt; — vega exposure, vol sensitivity by strike.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;chex&lt;/code&gt; — charm exposure, where decay forces the fastest re-hedging into the close.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;oi&lt;/code&gt; — effective open interest, the raw positioning mass.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;signed_flow&lt;/code&gt; — net signed aggressor flow, where customers are buying (+) or selling (−) right now.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Raw vs delta mode
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mode=raw&lt;/code&gt; shows the &lt;em&gt;level&lt;/em&gt; at each cell — where the walls and magnet sit.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mode=delta&lt;/code&gt; shows the &lt;em&gt;bar-over-bar change&lt;/em&gt; — where positioning is &lt;em&gt;landing&lt;/em&gt; this minute. The closest analog to a HIRO-style "what just changed" read; a strike lighting up in delta often flags fresh flow before it shows in the raw level.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Common workflow: raw as the background field, delta as the overlay flagging active strikes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pull it and plot it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flashalpha&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FlashAlpha&lt;/span&gt;

&lt;span class="n"&gt;fa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FlashAlpha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flow_zero_dte_heatmap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPX&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metric&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gex&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;raw&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1m&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;minutes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;strikes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strikes_grid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;times&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bars&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;span class="n"&gt;spot&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;spot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bars&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;span class="n"&gt;grid&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;values&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bars&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]).&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;  &lt;span class="c1"&gt;# -&amp;gt; [strike][bar]
&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;imshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;aspect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auto&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lower&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RdBu_r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;extent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;times&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;strikes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;times&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;black&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# spot overlay
&lt;/span&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;colorbar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;metric&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;mode&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;symbol&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; 0DTE &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;metric&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; heatmap&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JavaScript / Plotly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;FlashAlpha&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;flashalpha&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FlashAlpha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_KEY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flowZeroDteHeatmap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SPX&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;metric&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gex&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;delta&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1m&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;minutes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;strikes_grid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;  &lt;span class="c1"&gt;// transpose&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;heatmap&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;colorscale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;RdBu&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;reversescale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;strikes_grid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nx"&gt;Plotly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;newPlot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;chart&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;trace&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 0DTE &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metric&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  vs SpotGamma TRACE and Skylit Heatseeker
&lt;/h2&gt;

&lt;p&gt;Both popularized the intraday strike-by-time heatmap, and both are excellent dashboards. The gap they leave is programmatic access — you watch their chart, you don't pull their matrix. FlashAlpha returns the matrix as JSON: render it in your own stack, alert on a band crossing a strike, or feed it straight into a model. The point isn't that it looks better — it's that it's &lt;em&gt;callable&lt;/em&gt;. It also pairs with FlashAlpha's numeric pin score and trade-setup classifier. The data is FlashAlpha's own, not resold from either product.&lt;/p&gt;

&lt;p&gt;When you want the signed aggressor detail underneath — net delta-dollars, gamma-dollars, and contract counts per strike per bar — the companion &lt;code&gt;GET /v1/flow/zero-dte/strike-flow/{symbol}&lt;/code&gt; returns three parallel arrays against the same grid.&lt;/p&gt;

&lt;p&gt;Both the heatmap and strike-flow endpoints are on the &lt;strong&gt;Alpha plan&lt;/strong&gt; (from $1,199/mo, unlimited requests) — the model-input granularity of the 0DTE flow family. Calling below Alpha returns &lt;code&gt;403 tier_restricted&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Full reference and an interactive playground: &lt;a href="https://flashalpha.com/articles/0dte-gamma-heatmap-api-strike-time-gex-hiro-heatseeker-alternative" rel="noopener noreferrer"&gt;flashalpha.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>python</category>
      <category>trading</category>
      <category>datascience</category>
    </item>
    <item>
      <title>The Live 0DTE Flow API: Hedge-Flow, Heatmaps and Trade Setups</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Sun, 14 Jun 2026 19:15:11 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/the-live-0dte-flow-api-hedge-flow-heatmaps-and-trade-setups-4d0h</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/the-live-0dte-flow-api-hedge-flow-heatmaps-and-trade-setups-4d0h</guid>
      <description>&lt;p&gt;If you're searching for a 0DTE options flow API, a same-day dealer-hedging feed, an intraday gamma heatmap you can pull from code, or a SpotGamma HIRO / Skylit Heatseeker alternative with a real REST surface, this is the reference. Everything lives under one base path — &lt;code&gt;GET /v1/flow/zero-dte/&lt;/code&gt; on &lt;code&gt;https://lab.flashalpha.com&lt;/code&gt; — behind a single &lt;code&gt;X-Api-Key&lt;/code&gt; header.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Read this first.&lt;/strong&gt; The flow family is built on a &lt;em&gt;model&lt;/em&gt;. Dealer hedge-flow, the live GEX shift, and the setup/probability layers are &lt;em&gt;estimates&lt;/em&gt; derived from effective open interest and aggressor-classified trades — not a window into any dealer's actual book. The JSON below uses placeholder numbers. Read the signs, trends, and probabilities as a relative, decision-grade read, not exact order flow.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why a live 0DTE flow family exists
&lt;/h2&gt;

&lt;p&gt;Classic same-day analytics are computed from &lt;strong&gt;settled open interest&lt;/strong&gt; — the prior session's end-of-day OPRA book. For a contract expiring in two weeks that's fine; one day of flow barely moves the aggregate. For a contract expiring &lt;em&gt;today&lt;/em&gt; it's the wrong input. 0DTE traders open and close all day, and that flow concentrates OI and gamma at strikes that didn't look special at 9:30. A settled-OI snapshot is anchored to yesterday's book and tends to go stale by ~10:30 ET — right when the session gets interesting.&lt;/p&gt;

&lt;p&gt;The fix is a simulation-aware &lt;strong&gt;effective open interest&lt;/strong&gt;: settled OPRA OI plus an intraday simulator delta (model confidence 0.43). The &lt;code&gt;/v1/flow/*&lt;/code&gt; family is computed independently of the settled &lt;code&gt;/v1/exposure/*&lt;/code&gt; family, so it shows the regime, the pin, and the dealer hedge shift moving &lt;em&gt;before&lt;/em&gt; the next settled print exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  The family at a glance
&lt;/h2&gt;

&lt;p&gt;Six endpoints, one base path. The first three are decision-ready signals on &lt;strong&gt;Growth&lt;/strong&gt;; the last three are model-input granularity on &lt;strong&gt;Alpha&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;What it answers&lt;/th&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;snapshot/{symbol}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Live 0DTE regime, favored setup, pin &amp;amp; range odds&lt;/td&gt;
&lt;td&gt;Growth+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;series/{symbol}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;How that regime moved through the session&lt;/td&gt;
&lt;td&gt;Growth+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hedge-flow/{symbol}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Are dealers buying or selling to stay hedged, bar by bar?&lt;/td&gt;
&lt;td&gt;Growth+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;heatmap/{symbol}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Where is gamma/delta/flow concentrating, strike by strike, over time?&lt;/td&gt;
&lt;td&gt;Alpha+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;strike-flow/{symbol}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Which strikes see signed aggressor delta-dollars right now?&lt;/td&gt;
&lt;td&gt;Alpha+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;leaderboard&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Which symbols have the hottest 0DTE flow across the market?&lt;/td&gt;
&lt;td&gt;Alpha+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Supported symbols: any name with a same-day expiry — the daily majors &lt;strong&gt;SPY, SPX, QQQ, IWM&lt;/strong&gt;, plus weekly Mon/Wed/Fri OPEX names on their expiry days. Outside a 0DTE session every endpoint degrades gracefully, so your poller never special-cases the weekend.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Snapshot — the decision layer
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;GET /v1/flow/zero-dte/snapshot/{symbol}&lt;/code&gt; (Growth+) is the one most traders start and end with. It recomputes the full regime on effective OI and adds four decision-grade blocks on top of the raw &lt;code&gt;body&lt;/code&gt;: &lt;code&gt;flow_direction&lt;/code&gt;, &lt;code&gt;headline&lt;/code&gt;, &lt;code&gt;setup&lt;/code&gt;, &lt;code&gt;probabilities&lt;/code&gt;. Pass &lt;code&gt;?expiry=YYYY-MM-DD&lt;/code&gt; to point at a 1DTE/2DTE expiry.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"symbol"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SPY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"underlying_price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;600.42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"market_open"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"flow_direction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"label"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"amplifying"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"live_net_gex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.42e9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"flow_gex_pct_shift"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.753&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Today's flow reinforced dealers' long-gamma position — the pin toward 600 is strengthening."&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"headline"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"narrative"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pinning toward 600.00 (positive_gamma). Pin score 71/100. 64% pin prob."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"trade_angle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pin_trade"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"watch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"promoted"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"magnet"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;600.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"pin_score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;71&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"pin_probability_pct"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"regime"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"positive_gamma"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"setup"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"primary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"display_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Iron Fly"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"conditions_met"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"spot within 0.3% of magnet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"regime = positive_gamma"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pin_score &amp;gt; 65"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"strikes_hint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"short_call_strike"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;601&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"short_put_strike"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"long_call_strike"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;603&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"long_put_strike"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;598&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"anti_setups"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"display_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Long Premium / Lotto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"thesis"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Avoid — positive gamma + tight walls = unlikely &amp;gt;1σ move into close"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"probabilities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"calibration_method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"heuristic_v1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"range_1sigma"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.6827&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"low"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;598.38&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;602.46&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read each block:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;flow_direction&lt;/code&gt; — has today's flow &lt;strong&gt;reinforced&lt;/strong&gt; or &lt;strong&gt;weakened&lt;/strong&gt; the dealer regime vs settled? &lt;code&gt;amplifying&lt;/code&gt; / &lt;code&gt;dampening&lt;/code&gt; / &lt;code&gt;neutral&lt;/code&gt; / &lt;code&gt;no_flow&lt;/code&gt; / &lt;code&gt;regime_flip&lt;/code&gt; (the one to watch — net GEX changed sign).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;headline&lt;/code&gt; — the one-line dashboard pill. &lt;code&gt;trade_angle&lt;/code&gt; is pin / range / breakout / low-signal; &lt;code&gt;severity&lt;/code&gt; escalates info → watch → alert.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;setup&lt;/code&gt; — a rules-engine read of the textbook 0DTE plays the state supports: &lt;code&gt;primary&lt;/code&gt; + &lt;code&gt;alternatives&lt;/code&gt; + explicit &lt;code&gt;anti_setups&lt;/code&gt;. Every verdict ships its &lt;code&gt;conditions_met&lt;/code&gt; / &lt;code&gt;conditions_failed&lt;/code&gt; so you can audit it.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;probabilities&lt;/code&gt; — calibrated odds, not raw scores. &lt;code&gt;pin.value&lt;/code&gt; is the probability price closes near the magnet; range_1σ/2σ are the odds of closing in band. Each tags its &lt;code&gt;calibration_method&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Outside a session the rich body is replaced by a small degraded envelope (&lt;code&gt;body: null&lt;/code&gt;, &lt;code&gt;session_closed: true&lt;/code&gt;), so always guard before reading &lt;code&gt;body&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flashalpha&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FlashAlpha&lt;/span&gt;
&lt;span class="n"&gt;fa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FlashAlpha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;snap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flow_zero_dte_snapshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;snap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;no 0DTE session&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;snap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;headline&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;snap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;setup&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;primary&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;narrative&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  setup=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;display_name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;confidence&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)  angle=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;trade_angle&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;  pin prob=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;snap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;probabilities&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pin&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  flow=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;snap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;flow_direction&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;label&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Series — chart the session
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;GET .../series/{symbol}?bar=30s|1m|5m|15m&amp;amp;minutes=1-390&lt;/code&gt; (Growth+) returns the same regime metrics as a time series, one row per bar: spot, net GEX/DEX, gamma flip, walls, magnet, pin score &amp;amp; probability, regime, ATM IV, charm-dollars-per-hour, and cumulative dealer hedge-flow split into calls/puts/combined. This is the endpoint behind an intraday "0DTE positioning" chart.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Hedge-flow — dealer pressure, bar by bar
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;GET .../hedge-flow/{symbol}?side=all|calls|puts&lt;/code&gt; (Growth+) is the signed delta-dollars dealers are inferred to be transacting each bar to stay hedged, plus a running cumulative. A run of same-signed, accelerating bars alongside a same-signed price move is the fingerprint of a gamma squeeze building. Split legs with &lt;code&gt;side=calls&lt;/code&gt; vs &lt;code&gt;side=puts&lt;/code&gt; to separate upside call-chasing from downside protection-driven hedging.&lt;/p&gt;

&lt;h2&gt;
  
  
  4–5. Heatmap &amp;amp; strike-flow — the per-strike picture
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;heatmap/{symbol}&lt;/code&gt; (Alpha+) is the strike-by-time value matrix — the grid SpotGamma TRACE and Skylit Heatseeker render — returned as JSON. &lt;code&gt;strikes_grid&lt;/code&gt; is the y-axis; each bar's &lt;code&gt;values&lt;/code&gt; is parallel by index, so you get &lt;code&gt;values[bar][strike]&lt;/code&gt;. Pick the lens with &lt;code&gt;metric&lt;/code&gt; (gex/dex/vex/chex/oi/signed_flow) and &lt;code&gt;mode=raw&lt;/code&gt; (level) or &lt;code&gt;mode=delta&lt;/code&gt; (where new positioning is landing).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;strike-flow/{symbol}&lt;/code&gt; (Alpha+) gives the signed aggressor flow underneath: per bar, three parallel arrays — &lt;code&gt;signed_delta_dollars&lt;/code&gt;, &lt;code&gt;signed_gamma_dollars&lt;/code&gt;, &lt;code&gt;contracts&lt;/code&gt; — against the same &lt;code&gt;strikes_grid&lt;/code&gt;. This is the model input the hedge-flow and heatmap layers aggregate from.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Leaderboard — the hottest names
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;GET .../leaderboard?metric=heat|pin_risk|abs_flow|charm_intensity&amp;amp;n=1-100&lt;/code&gt; (Alpha+) ranks the whole 0DTE landscape by one metric, so you scan the market for names worth a snapshot call. &lt;code&gt;heat&lt;/code&gt; = hedge-flow normalized by net GEX (the "something's happening here" sort).&lt;/p&gt;

&lt;h2&gt;
  
  
  One session, end to end
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open (9:30–10:00 ET)&lt;/strong&gt; — &lt;code&gt;leaderboard&lt;/code&gt; with &lt;code&gt;metric=heat&lt;/code&gt; to find where flow is concentrated, then &lt;code&gt;snapshot&lt;/code&gt; the top names. &lt;code&gt;headline.trade_angle&lt;/code&gt; says pin / range / breakout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup (10:00–12:00)&lt;/strong&gt; — when &lt;code&gt;setup.primary&lt;/code&gt; hits &lt;code&gt;high&lt;/code&gt; confidence with no &lt;code&gt;conditions_failed&lt;/code&gt;, &lt;code&gt;strikes_hint&lt;/code&gt; hands you the legs. If your idea is in &lt;code&gt;anti_setups&lt;/code&gt;, the model is telling you conditions are against it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Midday (12:00–14:30)&lt;/strong&gt; — poll &lt;code&gt;hedge-flow&lt;/code&gt; and &lt;code&gt;flow_direction&lt;/code&gt;. &lt;code&gt;amplifying&lt;/code&gt; + rising cumulative = dealers chasing, fade-the-range gets riskier. &lt;code&gt;dampening&lt;/code&gt; supports the condor/fly thesis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Power hour (14:30–16:00)&lt;/strong&gt; — &lt;code&gt;severity&lt;/code&gt; hits &lt;code&gt;alert&lt;/code&gt; as a pin tightens or spot tests the flip. Tighten the poll interval; &lt;code&gt;pin.value&lt;/code&gt; and &lt;code&gt;charm_intensity&lt;/code&gt; are most informative in the final hour.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  vs HIRO, Heatseeker, Unusual Whales
&lt;/h2&gt;

&lt;p&gt;The space is dominated by dashboards. FlashAlpha ships the same class of signal as a developer-first API and adds a trader-product layer (headline / setup / probabilities) the raw feeds don't: signed dealer hedge-flow time series (HIRO's read), the strike-by-time heatmap as JSON (TRACE/Heatseeker's grid), a numeric pin score + calibrated odds, a rules-engine setup classifier, a cross-symbol leaderboard, and SDKs in Python/JS/C#/Go/Java. The data is FlashAlpha's own — not resold from any of those vendors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Snapshot / Series / Hedge-Flow&lt;/th&gt;
&lt;th&gt;Heatmap / Strike-Flow / Leaderboard&lt;/th&gt;
&lt;th&gt;Rate limit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;5/day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;from $63/mo&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;100/day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Growth&lt;/td&gt;
&lt;td&gt;from $239/mo&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;2,500/day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;td&gt;from $1,199/mo&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Below the required plan returns &lt;code&gt;403 tier_restricted&lt;/code&gt; with current and required plan names. Try any endpoint in the playground before writing code:&lt;br&gt;
&lt;a href="https://flashalpha.com/articles/live-0dte-flow-api-complete-guide-hedge-flow-heatmap-setups" rel="noopener noreferrer"&gt;flashalpha.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>python</category>
      <category>trading</category>
      <category>datascience</category>
    </item>
    <item>
      <title>The Options Flow &amp; Dealer Positioning API: A Complete Map of Every Endpoint</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Sat, 13 Jun 2026 18:17:31 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/the-options-flow-dealer-positioning-api-a-complete-map-of-every-endpoint-31o</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/the-options-flow-dealer-positioning-api-a-complete-map-of-every-endpoint-31o</guid>
      <description>&lt;p&gt;If you are looking for an options flow API, a dealer positioning API, a GEX/DEX/VEX/CHEX exposure suite, an unusual options activity feed, a 0DTE analytics endpoint, or a plain-English read on the options market, they all live behind one key, one base URL (&lt;code&gt;https://lab.flashalpha.com&lt;/code&gt;), and one auth header (&lt;code&gt;X-Api-Key&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;This post is the index. Each endpoint links to its own deep-dive guide.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;flashalpha&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flashalpha&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FlashAlpha&lt;/span&gt;
&lt;span class="n"&gt;fa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FlashAlpha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;gex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Gamma flip: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;gex&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;gamma_flip&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  First, the one distinction that matters: settled vs live
&lt;/h2&gt;

&lt;p&gt;Everything in the dealer-positioning surface falls into one of two families, and picking the right one is the single most important decision you will make.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Exposure (settled)&lt;/th&gt;
&lt;th&gt;Flow Analytics (live)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Route prefix&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/exposure/*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/flow/*&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Based on&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Settled open interest snapshots&lt;/td&gt;
&lt;td&gt;Settled OI plus an intraday flow simulator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Use when&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You want the official, stable picture&lt;/td&gt;
&lt;td&gt;You want the flow-adjusted picture before OI re-settles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Goes stale&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;After the intraday OI re-snapshot (~10:30 ET)&lt;/td&gt;
&lt;td&gt;Updates continuously with flow&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The two are paired. Most exposure concepts (GEX, levels, pin risk, 0DTE) exist in both a settled and a live form. Pick settled for stability, flow for freshness. With that in hand, here is the full map.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Exposure &amp;amp; Greeks (settled positioning)
&lt;/h2&gt;

&lt;p&gt;Per-strike Greeks, key levels, and term structure, computed from official open interest.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Where is dealer gamma by strike?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/exposure/gex&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Basic+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is dealer directional bias?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/exposure/dex&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Basic+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How does hedging react to vol &amp;amp; time?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/v1/exposure/vex&lt;/code&gt;, &lt;code&gt;/chex&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Basic+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where are the call/put walls &amp;amp; flip?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/exposure/levels&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Growth+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where is the pinning strike?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/maxpain&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Basic+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One unified per-strike Greek sheet?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/exposure/sheet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Growth+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Which expiry drives the regime?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/exposure/term-structure&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Growth+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What positioning changed overnight?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/exposure/oi-diff&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Growth+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is a sector or my book short gamma?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/exposure/basket&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Growth+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Give me the read in plain English&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/exposure/narrative&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Growth+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  2. Live Flow Analytics (flow-adjusted positioning)
&lt;/h2&gt;

&lt;p&gt;The same concepts, recomputed intraday against the flow-driven OI simulator. Fresher than settled exposure during the session.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;What's the headline flow shift &amp;amp; direction?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/flow/summary&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Growth+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where are the live walls &amp;amp; flip?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/flow/levels&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Growth+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What's the live pin risk?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/flow/pin-risk&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Growth+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;How has dealer risk shifted on flow?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/flow/dealer-risk&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Alpha+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full live GEX/DEX surface &amp;amp; OI state?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/v1/flow/gex&lt;/code&gt;, &lt;code&gt;/dex&lt;/code&gt;, &lt;code&gt;/oi&lt;/code&gt;, &lt;code&gt;/live&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Alpha+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  3. The raw flow tape &amp;amp; cross-symbol scans
&lt;/h2&gt;

&lt;p&gt;Trade-level flow and market-wide ranking. The "what is actually printing, and where" layer. Alpha plan.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Recent prints, blocks, cumulative net flow?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/flow/options/{symbol}/...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where's the unusual activity, ranked?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/v1/flow/options/outliers&lt;/code&gt;, &lt;code&gt;/leaderboard&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scored unusual options activity?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/flow/signals&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Are dealers net long or short premium?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/flow/options/{symbol}/dealer-premium&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Equity (stock) flow tape &amp;amp; bars?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/flow/stocks/{symbol}/...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  4. 0DTE (same-day expiry)
&lt;/h2&gt;

&lt;p&gt;Same-day options drive a disproportionate share of intraday price action. These endpoints are scoped to today's expiry.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Live 0DTE regime snapshot?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/flow/zero-dte/snapshot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Growth+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0DTE regime over time (chartable)?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/flow/zero-dte/series&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Growth+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is a gamma squeeze building right now?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/flow/zero-dte/hedge-flow&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Growth+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0DTE analytics (settled)?&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v1/exposure/zero-dte&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Growth+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Newest additions
&lt;/h2&gt;

&lt;p&gt;Four endpoints that round out the surface:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio &amp;amp; Sector GEX Basket&lt;/strong&gt; - aggregate GEX/DEX/VEX/CHEX across up to 50 symbols in one call. The question no single-ticker tool answers: is the &lt;em&gt;whole basket&lt;/em&gt; short gamma?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Net Dealer Premium&lt;/strong&gt; - one signed number for whether dealers are net long or short premium right now, off the full VWAP-weighted tape.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Gamma Squeeze Detection&lt;/strong&gt; - per-bar dealer hedge delta-dollars on today's 0DTE chain that turns "squeeze" from a vibe into a measurement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plain-English GEX Narrative&lt;/strong&gt; - the exposure read as grounded sentences, built for LLM agents and automated alerts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tiers at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;What unlocks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;Sampling only (5 req/day)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;from $63/mo&lt;/td&gt;
&lt;td&gt;Per-strike Greeks (GEX/DEX/VEX/CHEX), max pain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Growth&lt;/td&gt;
&lt;td&gt;from $239/mo&lt;/td&gt;
&lt;td&gt;Levels, summary/sheet/basket/narrative, term structure, OI diff, Flow Analytics levels/pin/summary, 0DTE flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;td&gt;from $1,199/mo&lt;/td&gt;
&lt;td&gt;Full flow analytics, the raw flow tape, flow signals, dealer premium, cross-symbol scans&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Prices shown are annual billing. Month-to-month is 20% higher. Free key, no credit card: &lt;a href="https://flashalpha.com/pricing" rel="noopener noreferrer"&gt;https://flashalpha.com/pricing&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's the difference between exposure and flow endpoints?&lt;/strong&gt; &lt;code&gt;/v1/exposure/*&lt;/code&gt; computes positioning from settled open interest, the stable picture that goes stale after the intraday OI re-snapshot. &lt;code&gt;/v1/flow/*&lt;/code&gt; recomputes the same concepts intraday against a flow-driven simulator, so they stay current through the session.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which endpoints do I need for dealer positioning?&lt;/strong&gt; Start with &lt;code&gt;/v1/exposure/gex&lt;/code&gt; and &lt;code&gt;/v1/exposure/levels&lt;/code&gt; for the gamma map and key strikes, add &lt;code&gt;/v1/exposure/narrative&lt;/code&gt; for a plain-English read, and use &lt;code&gt;/v1/exposure/basket&lt;/code&gt; to aggregate across a book. For intraday freshness, add the Flow Analytics equivalents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is the whole surface on one plan?&lt;/strong&gt; No. Settled Greeks and max pain start on Basic. Levels, the summary/sheet/basket/narrative, term structure, OI diff, Growth-tier Flow Analytics and 0DTE flow are on Growth. The full live flow analytics, the raw tape, signals, dealer premium and cross-symbol scans are on Alpha.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://flashalpha.com/articles/options-flow-dealer-positioning-api-complete-guide" rel="noopener noreferrer"&gt;flashalpha.com&lt;/a&gt;. The historical host mirrors every live endpoint with a &lt;code&gt;?at=YYYY-MM-DDTHH:mm:ss&lt;/code&gt; parameter, identical response shapes, SPY from 2018 onward at minute resolution. Same SDK code, base-URL swap.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>options</category>
      <category>api</category>
      <category>trading</category>
      <category>python</category>
    </item>
    <item>
      <title>Quant Options Backtesting on Point-in-Time Data: The Complete Guide</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Mon, 08 Jun 2026 18:45:07 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/quant-options-backtesting-on-point-in-time-data-the-complete-guide-3cea</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/quant-options-backtesting-on-point-in-time-data-the-complete-guide-3cea</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published on the &lt;a href="https://flashalpha.com/articles/complete-guide-quant-options-backtesting" rel="noopener noreferrer"&gt;FlashAlpha Research blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Backtesting options strategies is structurally harder than backtesting equity momentum or fixed-income carry. The payoff is path-dependent. The instrument set re-generates every week. Fills are wide and asymmetric. And the data problem (point-in-time chains, computed dealer exposure, arbitrage-free surfaces) is usually bigger than the signal problem.&lt;/p&gt;

&lt;p&gt;This guide is written for a quant or systematic developer who wants to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Research a dealer-positioning, VRP, or dispersion signal on real historical data.&lt;/li&gt;
&lt;li&gt;Build a candidate set across the options universe, not just one ticker.&lt;/li&gt;
&lt;li&gt;Run a fill model that reflects what you would have actually paid.&lt;/li&gt;
&lt;li&gt;Avoid the ten systematic mistakes that inflate backtested Sharpe before live trading erases the edge.&lt;/li&gt;
&lt;li&gt;Connect the same code to a live production signal without rewriting the data layer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The historical endpoint set covers: GEX/DEX/VEX/CHEX exposure replay (&lt;code&gt;/v1/exposure/*?date=&lt;/code&gt;), VRP time-series and percentiles (&lt;code&gt;/v1/vrp/{t}/history&lt;/code&gt;), full option chains with greeks and IV at minute resolution (&lt;code&gt;/v1/options/{t}?date=&lt;/code&gt;), IV surfaces and SVI parameters (&lt;code&gt;/v1/adv_volatility&lt;/code&gt;), and the universe screener (&lt;code&gt;POST /v1/screener&lt;/code&gt;). Everything replays since 2018. The response shape is identical to the live endpoints: add or remove the &lt;code&gt;date&lt;/code&gt; parameter to switch modes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What systematic options research actually needs
&lt;/h2&gt;

&lt;p&gt;Three requirements separate a backtest you can trust from a backtest that lies to you.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Point-in-time data
&lt;/h3&gt;

&lt;p&gt;A request for &lt;code&gt;/v1/exposure/gex/SPY?date=2020-03-16T14:30:00Z&lt;/code&gt; must return the state of the book exactly as it existed at that minute. Open interest, greeks, and computed gamma exposure as of 14:30:00, not end-of-day OI stamped back, not a forward fill from the prior session.&lt;/p&gt;

&lt;p&gt;This matters for two concrete reasons. First, dealer-positioning signals use OI to compute GEX, and end-of-day OI is not known at 14:30. Second, option greeks depend on implied vol, which moves continuously, so a 15:30 vol observation is not the same as a 14:30 vol observation on a volatile day. Any historical dataset that stamps a single daily value and calls it "intraday" is baking lookahead bias into every signal that uses it.&lt;/p&gt;

&lt;p&gt;Gamma exposure is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GEX(t) = Σ_k OI_k(t) · Γ_k(S_t, σ_k(t), T_k − t)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each term depends on spot S_t, the per-strike IV σ_k(t), and time to expiry at exactly time t. Substituting end-of-day values for any of these introduces forward-looking information.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. No lookahead bias
&lt;/h3&gt;

&lt;p&gt;Lookahead is not only about timestamps. It also lives in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OI revision.&lt;/strong&gt; Exchanges publish preliminary OI and revise it the next morning. A historical dataset assembled from the revised numbers makes yesterday's GEX look different from what any live system would have computed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Methodology drift.&lt;/strong&gt; If the analytics vendor updates the GEX formula, historical replays under the new formula produce different numbers than a live system running the old formula would have produced. Archive raw responses if you need bit-exact reproducibility.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Surface parameterization.&lt;/strong&gt; SVI calibration parameters (a, b, ρ, m, σ) are an end-of-day fit in this dataset. An intraday request returns the most recent prior EOD SVI fit. If your signal uses the SVI latent at minute resolution, you have one observation per trading day, not per minute. Use the minute-level surface grid for intraday surface features, and SVI params for daily cross-sectional work.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Same schema, research to production
&lt;/h3&gt;

&lt;p&gt;The single most underrated property of a historical API: research and production should call the same function. If your backtest calls &lt;code&gt;hx.exposure_summary("SPY", at="2022-06-15T14:30:00")&lt;/code&gt; and your live signal calls &lt;code&gt;fa.exposure_summary("SPY")&lt;/code&gt; and the response shapes differ, you will discover the discrepancy the first time the live system hits a field the backtest parser never saw. Every undocumented difference between historical and live response shapes is a production incident waiting to happen.&lt;/p&gt;

&lt;p&gt;The FlashAlpha API uses the same JSON schema for both modes. The &lt;code&gt;date&lt;/code&gt; parameter controls replay; omit it for live. One exception: the historical option-quote endpoint returns a flat array with renamed fields (&lt;code&gt;implied_vol&lt;/code&gt; instead of &lt;code&gt;iv&lt;/code&gt;, &lt;code&gt;open_interest&lt;/code&gt; instead of &lt;code&gt;oi&lt;/code&gt;) and historical-only fields (&lt;code&gt;iv_bid&lt;/code&gt;, &lt;code&gt;iv_ask&lt;/code&gt;, &lt;code&gt;vanna&lt;/code&gt;, &lt;code&gt;charm&lt;/code&gt;, &lt;code&gt;rho&lt;/code&gt;). Write a thin adapter and test it against both modes before you backtest at scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  The data: what the historical API covers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Dealer exposure replay (GEX/DEX/VEX/CHEX)
&lt;/h3&gt;

&lt;p&gt;All four exposures replay at minute resolution from 2018, available via their own endpoints and via the unified exposure summary.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Historical exposure summary, the one-call option&lt;/span&gt;
curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://lab.flashalpha.com/v1/exposure/summary/SPY?date=2020-03-16T14:30:00Z"&lt;/span&gt;

&lt;span class="c"&gt;# Or per-metric:&lt;/span&gt;
curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://lab.flashalpha.com/v1/exposure/gex/SPY?date=2020-03-16T14:30:00Z"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flashalpha_historical&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FlashAlphaHistorical&lt;/span&gt;

&lt;span class="n"&gt;hx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FlashAlphaHistorical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;snap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exposure_summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2020-03-16T14:30:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Regime: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;snap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;regime&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;label&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Net GEX: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;snap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;net_gex&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;,.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Gamma flip: $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;snap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;regime&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;gamma_flip&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Call wall: $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;snap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;levels&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;call_wall&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Put wall:  $&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;snap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;levels&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;put_wall&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response includes &lt;code&gt;as_of&lt;/code&gt;, so you can confirm the timestamp is what you asked for. On March 16 2020 the net GEX was deeply negative; the COVID-crash dealer-positioning replay is the canonical stress-test for any strategy that conditions on GEX regime.&lt;/p&gt;

&lt;h3&gt;
  
  
  VRP time series and percentiles
&lt;/h3&gt;

&lt;p&gt;The volatility risk premium (VRP) measures implied minus realized vol. The history endpoint returns a daily time series of VRP, z-score, and percentile rank against the trailing window, all point-in-time: the percentile for day T is computed using only data through day T.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://lab.flashalpha.com/v1/vrp/SPY/history?lookback=252"&lt;/span&gt;

curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://lab.flashalpha.com/v1/vrp/SPY?date=2022-10-14"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;vrp_percentile&lt;/code&gt; field is the fraction of days in the trailing window where VRP was below the current reading, computed with only prior observations. This is the operative number for a premium-selling trigger: if it is 85 or above, implied vol has been richer than this 85% of the time in the lookback window, conditioning only on past data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Full option chains at minute resolution
&lt;/h3&gt;

&lt;p&gt;The full chain endpoint returns every listed contract (bid, ask, IV, delta, gamma, theta, vega, vanna, charm, rho, OI) for a symbol at any minute since 2018.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://lab.flashalpha.com/v1/options/SPY?date=2020-03-16T14:30:00Z"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Honest resolution table for the chain endpoint:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Resolution in history&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bid, ask, IV, delta, gamma, theta, vega&lt;/td&gt;
&lt;td&gt;Minute-level (9:30 to 16:00 ET)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vanna, charm, rho (historical-only)&lt;/td&gt;
&lt;td&gt;Minute-level&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open interest&lt;/td&gt;
&lt;td&gt;EOD-stamped (one value per trading day)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Volume&lt;/td&gt;
&lt;td&gt;Always 0; use OI for liquidity proxy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SVI-smoothed vol (&lt;code&gt;svi_vol&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Always null (&lt;code&gt;svi_vol_gated: "backtest_mode"&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If your GEX calculation uses OI and you replay at minute resolution, you are using that day's opening OI for every minute of the session. That is what any live system would have done, since OI is published once per morning. So the EOD stamp is correct for intraday GEX replay, not a limitation.&lt;/p&gt;

&lt;h3&gt;
  
  
  IV surface and SVI parameters
&lt;/h3&gt;

&lt;p&gt;The 50x50 implied vol surface grid (moneyness by maturity) evolves at minute resolution, driven by per-contract quotes. The SVI calibration parameters are EOD-stamped.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;surface&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;surface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2022-06-15T14:30:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;adv&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;adv_volatility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2022-06-15T14:30:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# surface: minute-level 50x50 grid
# adv: EOD-stamped SVI params {a, b, rho, m, sigma} +
#      arbitrage-free flags + variance-swap strike
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The universe screener: building a candidate set
&lt;/h3&gt;

&lt;p&gt;Every cross-sectional strategy starts with a candidate set. The screener endpoint ranks and filters across the full symbol universe on GEX, VRP, IV rank, 0DTE contribution, and custom score formulas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://lab.flashalpha.com/v1/screener"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "filters": [
      {"field": "vrp_percentile", "op": "gte", "value": 75},
      {"field": "iv_rank",        "op": "gte", "value": 50},
      {"field": "regime",         "op": "eq",  "value": "positive_gamma"}
    ],
    "sort": {"field": "vrp_zscore", "direction": "desc"},
    "limit": 30
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In a backtest, run the screener at the decision timestamp on each rebalance date, then pull per-name history for those candidates only. This is both computationally efficient and methodologically correct: you only see names the screener would have surfaced on that date, not names that survived to the end of your sample.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a backtest: the full stack
&lt;/h2&gt;

&lt;p&gt;The canonical loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Signal(t) → [screener] → Candidates(t) → [history] → Per-name data(t)
          → [fill model] → Fills(t) → [accum] → Metrics
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Signal design
&lt;/h3&gt;

&lt;p&gt;A signal is a function from the point-in-time state of one or more endpoints to a trade decision. Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dealer-positioning (GEX):&lt;/strong&gt; Enter a momentum position when net GEX is negative and the 5-day average delta of net GEX is declining.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VRP premium-selling:&lt;/strong&gt; Sell a put credit spread when VRP percentile is at least 80 and IV rank is at least 50, exit when VRP z-score reverts below its median.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dispersion:&lt;/strong&gt; Long single-name straddle, short index straddle, when the ratio of single-name IV to index IV is below its 6-month median.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Signals must be computable from endpoint fields available point-in-time. GEX is available at minute resolution. SVI parameters in a time series are EOD, so your signal updates once per day. OI trajectory is EOD, so the "trajectory" is one observation per day.&lt;/p&gt;

&lt;h3&gt;
  
  
  Candidate set via screener
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://lab.flashalpha.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;HEADERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Api-Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;screener_candidates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date_str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vrp_pctile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Run the screener point-in-time on a rebalance date.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;date_str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;filters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;op&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;conditions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;field&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vrp_percentile&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;operator&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gte&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;vrp_pctile&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;field&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;iv_rank&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;operator&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gte&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;field&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;operator&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;in&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                 &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;positive_gamma&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;neutral&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
            &lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sort&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;field&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vrp_zscore&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;direction&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;desc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;limit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/screener&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HEADERS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;symbol&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;

&lt;span class="n"&gt;candidates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;screener_candidates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2022-10-03&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Per-name history retrieval
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flashalpha_historical&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FlashAlphaHistorical&lt;/span&gt;

&lt;span class="n"&gt;hx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FlashAlphaHistorical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_signal_state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Fetch point-in-time VRP + exposure for a candidate.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;vrp&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;vrp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;summ&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exposure_summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;vol&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;volatility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;symbol&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;as_of&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;      &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vrp_pctile&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;vrp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vrp_percentile&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vrp_zscore&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;vrp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vrp_zscore&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vrp_regime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;vrp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gex_regime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;summ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;label&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gamma_flip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;summ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gamma_flip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;net_gex&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;summ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;net_gex&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;iv_rank&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;vol&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;iv_rank&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;iv_atm_30d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;vol&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;atm_iv_30d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The fill model is the edge
&lt;/h3&gt;

&lt;p&gt;This is where most backtests lie. The naive fill model uses the midpoint price at decision time. That model is wrong in every direction that matters for premium sellers and spread traders:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You sell at the bid, not the mid.&lt;/strong&gt; For a short put spread with a mid of $1.20 and a $0.10 wide bid-ask, your actual fill is closer to $1.10 than $1.20. At 250 trades per year, that $0.10 slip compounds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The bid-ask widens before earnings and into events.&lt;/strong&gt; Exactly when VRP looks richest, spreads are widest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Volume is zero in historical chains.&lt;/strong&gt; Use OI as a liquidity proxy and apply a conservative fill model for low-OI strikes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A tractable fill model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fill_sell = Mid(t) − α · (Ask(t) − Bid(t)) / 2
Fill_buy  = Mid(t) + α · (Ask(t) − Bid(t)) / 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where α in [0.3, 0.7] is a market-impact parameter. Use α = 0.5 as a baseline; test sensitivity before claiming edge.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fill_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;side&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bid&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="n"&gt;half_spread&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ask&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;bid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;side&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sell&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;half_spread&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;half_spread&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fill_spread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;leg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;leg1_side&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;leg2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;leg2_side&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;f1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fill_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;leg1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;leg1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ask&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;leg1_side&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;f2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fill_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;leg2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;leg2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ask&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;leg2_side&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;f1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;f2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Metrics
&lt;/h3&gt;

&lt;p&gt;Sharpe assumes normal returns; options premium-selling has negative skewness and excess kurtosis. Report Sharpe as a directional indicator, but lean on Sortino, Calmar, and maximum drawdown for sizing. A 70% win rate with a 3:1 loss-to-win payoff is a losing strategy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example strategies
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Dealer-positioning momentum
&lt;/h3&gt;

&lt;p&gt;When dealers are net short gamma, they buy into rallies and sell into drops to stay delta-neutral, amplifying directional moves. A momentum signal conditioned on negative-gamma regime should outperform an unconditional one.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;At 9:45 ET, pull &lt;code&gt;/v1/exposure/summary/{t}&lt;/code&gt; to determine the regime.&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;net_gex &amp;lt; 0&lt;/code&gt; and the 5-day EMA of &lt;code&gt;net_gex&lt;/code&gt; is declining, the regime is "amplifying."&lt;/li&gt;
&lt;li&gt;Compute the opening 15-minute return. If positive in an amplifying regime, go long a 1-week ATM call debit spread; if negative, a 1-week ATM put debit spread.&lt;/li&gt;
&lt;li&gt;Exit at 14:30 or 2x the initial mid, whichever comes first.&lt;/li&gt;
&lt;li&gt;Flat when regime is positive gamma or undefined.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  VRP premium-selling
&lt;/h3&gt;

&lt;p&gt;Implied vol systematically overstates realized vol on average. When VRP is in the upper tercile, selling premium has historically had positive expected value.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Daily, gate on &lt;code&gt;vrp_percentile ≥ 75&lt;/code&gt; and &lt;code&gt;vrp_regime == "rich"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sell a 30-delta put credit spread 21 DTE, short put at the put wall, long put $5 further OTM.&lt;/li&gt;
&lt;li&gt;Exit at 50% of initial credit or 7 DTE.&lt;/li&gt;
&lt;li&gt;Apply the fill model with α = 0.5, cap at 2% notional per trade.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Realized-vol dispersion
&lt;/h3&gt;

&lt;p&gt;The implied vol of an index exceeds the weighted implied vol of its constituents; the excess is the correlation risk premium. Long single-name straddles, short index straddle, vega-neutral. Pull &lt;code&gt;/v1/adv_volatility/{name}&lt;/code&gt; per constituent and for the index on the same timestamp.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validation and pitfalls
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Walk-forward, not in-sample optimization.&lt;/strong&gt; Fit on a training window, evaluate on the next held-out window, roll forward.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Out-of-sample periods must include stress events.&lt;/strong&gt; A backtest that excludes March 2020, August 2024, and Q4 2018 is an in-sample fit on calm markets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Costs must be large enough to matter.&lt;/strong&gt; If removing slippage changes Sharpe by more than 0.3, the edge is in the cost model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regime sensitivity test.&lt;/strong&gt; Split by VIX tercile. If it only works in one regime, say so.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The kinks and common mistakes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Kink 1: Survivorship bias.&lt;/strong&gt; A fixed ticker list (today's S&amp;amp;P 500) excludes names delisted or merged before today but present at the time. Construct the universe from point-in-time index membership.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kink 2: Lookahead in computed analytics.&lt;/strong&gt; VRP percentile computed over the full sample ranks a 2019 reading against observations that had not happened yet. Verify the window is trailing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kink 3: Restatement and non-determinism.&lt;/strong&gt; Recomputed analytics change if methodology updates. Archive raw responses for bit-exact reproducibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kink 4: Ignoring fills and slippage.&lt;/strong&gt; A 1-DTE short straddle mid-priced at $3.20 with a $0.25 spread costs $0.50 round-trip, 15.6% of premium. Apply the fill model and vary α from 0.3 to 0.7.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kink 5: Overfitting strike, expiry, and threshold.&lt;/strong&gt; Many free parameters. Treat threshold as a hyper-parameter, fit on training only, test out-of-sample with it locked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kink 6: Regime dependence without disclosure.&lt;/strong&gt; VRP selling wins slowly in calm markets, loses quickly in spikes. Report Calmar, worst drawdown, and drawdown duration. Backtest any drawdown breaker as a system parameter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kink 7: Point-in-time OI vs revised OI.&lt;/strong&gt; Using finalized OI for a 14:30 signal is lookahead. Verify you use the preliminary morning publication.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kink 8: Train/test leakage via shared normalization.&lt;/strong&gt; Fit all preprocessors on training data only, then transform both train and test with frozen parameters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kink 9: Research vs production data mismatch.&lt;/strong&gt; The historical option-quote shape differs from live (flat array, renamed fields). Write one parser that handles both, test against both before deploying.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kink 10: Assignment and pin risk near expiry.&lt;/strong&gt; A short put ITM within 2 to 3 DTE carries early-assignment risk. For credit spreads, pin risk leaves a naked overnight position with gap risk. Flag any position at 1 DTE with the short strike within 1% of spot, and apply a conservative exit fill.&lt;/p&gt;

&lt;h2&gt;
  
  
  Worked example: a VRP backtest sketch
&lt;/h2&gt;

&lt;p&gt;A condensed but complete sketch of a 30-delta put credit spread backtest on SPY using the VRP signal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flashalpha_historical&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FlashAlphaHistorical&lt;/span&gt;

&lt;span class="n"&gt;API_BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://lab.flashalpha.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;API_KEY&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;hx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FlashAlphaHistorical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;SIGNAL_OPEN_HOUR&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;15:30:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;VRP_PCTILE_THRESH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;75&lt;/span&gt;
&lt;span class="n"&gt;IV_RANK_THRESH&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;
&lt;span class="n"&gt;ALPHA_FILL&lt;/span&gt;        &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;
&lt;span class="n"&gt;DTE_OPEN&lt;/span&gt;          &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;

&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cal_days&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bdate_range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;freq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;B&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rebalance_dates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cal_days&lt;/span&gt;&lt;span class="p"&gt;[::&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# weekly
&lt;/span&gt;
&lt;span class="n"&gt;trades&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;rd&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rebalance_dates&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;T&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;SIGNAL_OPEN_HOUR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;vrp_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;vrp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;vol_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;volatility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;exp_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exposure_summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;

    &lt;span class="nf"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vrp_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vrp_percentile&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;VRP_PCTILE_THRESH&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt;
            &lt;span class="n"&gt;vol_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;iv_rank&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;IV_RANK_THRESH&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt;
            &lt;span class="n"&gt;exp_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;label&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;positive_gamma&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;neutral&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;

    &lt;span class="n"&gt;put_wall&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;exp_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;levels&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;put_wall&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;chain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API_BASE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/options/SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Api-Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;short_put&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;chain&lt;/span&gt;
         &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;option_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;P&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
         &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strike&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;put_wall&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mf"&gt;2.5&lt;/span&gt;
         &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;DTE_OPEN&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;days_to_expiry&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;DTE_OPEN&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;short_put&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="n"&gt;long_put&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;chain&lt;/span&gt;
         &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;option_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;P&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
         &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strike&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;short_put&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strike&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
         &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;days_to_expiry&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;short_put&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;days_to_expiry&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;long_put&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;

    &lt;span class="n"&gt;short_fill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fill_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;short_put&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;short_put&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ask&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sell&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ALPHA_FILL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;long_fill&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fill_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;long_put&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;  &lt;span class="n"&gt;long_put&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ask&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;buy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="n"&gt;ALPHA_FILL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;net_credit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;short_fill&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;long_fill&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;net_credit&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;

    &lt;span class="n"&gt;trades&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;open_date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;rd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;short_strike&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;short_put&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strike&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;long_strike&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;short_put&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;strike&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;net_credit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;net_credit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vrp_pctile&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;vrp_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vrp_percentile&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;trades&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Trades: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What this sketch leaves out, deliberately, as kink-avoidance exercises: the exit loop, the assignment model, the drawdown breaker, and walk-forward parameter selection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tooling: endpoints and the MCP connector
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Use&lt;/th&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET /v1/exposure/gex/{t}?date=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Net GEX by strike, gamma flip, walls&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET /v1/exposure/summary/{t}?date=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full dealer-positioning state&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET /v1/options/{t}?date=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full option chain: IV, greeks, OI, bid/ask&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET /v1/vrp/{t}/history&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;VRP series, z-score, percentile&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET /v1/volatility/{t}?date=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;IV, realized vol, skew, term structure&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET /v1/surface/{t}?date=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;50x50 IV surface grid (minute-level)&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET /v1/adv_volatility/{t}?date=&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SVI params (EOD), variance surface, arb flags&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST /v1/screener&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Universe filter on GEX, VRP, IV rank, regime&lt;/td&gt;
&lt;td&gt;Growth&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Historical replay
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flashalpha_historical&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FlashAlphaHistorical&lt;/span&gt;
&lt;span class="n"&gt;hx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FlashAlphaHistorical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;snap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exposure_summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2022-06-15T14:30:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Live production, same method names, no at=
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flashalpha&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FlashAlpha&lt;/span&gt;
&lt;span class="n"&gt;fa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FlashAlpha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;snap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exposure_summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For LLM-augmented research, the quant MCP connector exposes the full Historical API as callable tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"flashalpha-quant"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://lab.flashalpha.com/mcp-oauth/quant"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The systematic options research pipeline has three honest bottlenecks: point-in-time data, a realistic fill model, and discipline against the ten kinks that inflate backtested Sharpe before live trading reveals the truth.&lt;/p&gt;

&lt;p&gt;Once the backtest is validated, the production migration is a one-parameter change: remove &lt;code&gt;at=&lt;/code&gt; from each call and the same code runs live. That is the architectural reason to use a pre-computed analytics layer rather than building a raw-chain pipeline from scratch.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This post was originally published on &lt;a href="https://flashalpha.com/articles/complete-guide-quant-options-backtesting" rel="noopener noreferrer"&gt;FlashAlpha&lt;/a&gt;. FlashAlpha provides pre-computed options analytics (GEX, DEX, VEX, CHEX, SVI surfaces, VRP) for 6,000+ US equities and ETFs via &lt;a href="https://flashalpha.com/docs/lab-api-overview" rel="noopener noreferrer"&gt;API&lt;/a&gt;. &lt;a href="https://flashalpha.com/pricing" rel="noopener noreferrer"&gt;Free API key, no credit card&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>quant</category>
      <category>python</category>
      <category>trading</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Volatility Relative-Value Trading: The Complete Guide</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Mon, 08 Jun 2026 07:40:35 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/volatility-relative-value-trading-the-complete-guide-421g</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/volatility-relative-value-trading-the-complete-guide-421g</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally published on the &lt;a href="https://flashalpha.com/articles/complete-guide-volatility-relative-value-trading" rel="noopener noreferrer"&gt;FlashAlpha Research blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What relative-value volatility trading is
&lt;/h2&gt;

&lt;p&gt;A directional equity trader has a view on &lt;em&gt;where&lt;/em&gt; the stock goes. A volatility relative-value trader has a view on &lt;em&gt;how much&lt;/em&gt; it should cost to insure it, and on whether that cost is mispriced relative to history, relative to a model, or relative to another asset. The underlying price is not the primary variable: implied volatility is.&lt;/p&gt;

&lt;p&gt;Relative-value vol trading exploits dislocations in the implied volatility surface: one tenor trading too rich versus another (calendar trades), the put wing too expensive versus fair value (skew trades), index implied correlation diverging from single-name vols (dispersion), or the market pricing future variance above what realised variance will deliver (variance or volatility risk premium). The common thread is that every trade is structural and model-referenced, not a directional bet on the S&amp;amp;P going up or down.&lt;/p&gt;

&lt;p&gt;This matters because the risk profile is different. A well-constructed vol-arb trade is delta-hedged and, when also vega-hedged across legs, is primarily exposed to the &lt;em&gt;shape&lt;/em&gt; of the surface rather than its level. That shape exposure (the relative cheapness or richness of one part of the surface versus another) is more persistent and mean-reverting than the level of implied vol itself. That is the edge.&lt;/p&gt;

&lt;h2&gt;
  
  
  The toolkit
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SVI surfaces and arbitrage-free constraints
&lt;/h3&gt;

&lt;p&gt;The Stochastic Volatility Inspired (SVI) parameterisation, due to Gatheral (2004), maps log-moneyness k to total implied variance w for a single expiry slice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;w(k) = a + b·[ ρ(k − m) + sqrt((k − m)² + σ²) ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where k = ln(K/F) is log-moneyness relative to the forward F, and the five parameters carry clear economic content:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;a&lt;/strong&gt; is the overall level of variance (vertical shift)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;b&lt;/strong&gt; is the angle of the smile wings (controls vol-of-vol)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ρ&lt;/strong&gt; is put/call asymmetry (negative in equity markets due to the leverage effect)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;m&lt;/strong&gt; is the moneyness at which the smile is most symmetric&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;σ&lt;/strong&gt; is the curvature of the ATM region&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Five parameters describe a liquid equity smile. The real difficulty is not the fitting; it is ensuring the fitted surface is arbitrage-free. Two static arbitrage conditions must hold. No butterfly arbitrage means the risk-neutral density must be non-negative at every strike, which translates to a non-negative second derivative of total variance in log-moneyness. No calendar arbitrage means total variance must be non-decreasing across expiries at every moneyness. If either fails, you have a surface that implies free money, and any trade priced off it is wrong in an unbounded way. Arbitrage detection is the first deliverable to check, not an afterthought.&lt;/p&gt;

&lt;h3&gt;
  
  
  Variance swap replication and the var-swap strike
&lt;/h3&gt;

&lt;p&gt;A variance swap pays the difference between realised variance and a fixed strike agreed at inception. The fair strike is the replication-theoretic value (Demeterfi et al. 1999):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;K_var = (2/T) · [ ∫₀ᶠ P(K)/K² dK + ∫ᶠ^∞ C(K)/K² dK ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because the integrand spans all strikes, you need a complete smile, which is exactly what the SVI fit provides. The numerical integral over the smile gives a clean, arb-consistent fair value for realised variance that goes beyond ATM implied vol. The convexity adjustment (fair vol minus ATM IV) measures how much the wings contribute; when the put wing is rich, the fair var-swap vol sits above ATM IV, and selling vol via variance swaps captures that richness.&lt;/p&gt;

&lt;h3&gt;
  
  
  Variance risk premium versus volatility risk premium
&lt;/h3&gt;

&lt;p&gt;This is one of the most conflated concepts in practice. The variance risk premium (VaRP) is the expected profit from selling a variance swap and delta-hedging: it operates on &lt;em&gt;squared&lt;/em&gt; vol. The volatility risk premium (VolRP) is the P&amp;amp;L from selling a vega-neutral straddle and continuously delta-hedging: it operates on &lt;em&gt;vol itself&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VaRP = K_var − E[σ_R²]      VolRP = σ_IV,ATM − E[σ_R]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These diverge because of the nonlinear relationship between variance and vol. In the tails, variance grows quadratically while vol grows linearly, so fat-tail regimes inflate VaRP far more than VolRP. A strategy that looks like it is selling VaRP may actually be mostly selling VolRP with a highly convex residual tail exposure, and vice versa. Knowing which you are trading, and sizing accordingly, is critical.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skew and term structure
&lt;/h3&gt;

&lt;p&gt;The surface has two primary shape dimensions beyond the ATM level. Skew is the slope of implied vol across strikes at a fixed expiry; in equity markets the put wing is systematically richer than the call wing. Term structure is the slope of ATM implied vol across expiries: contango (front below back) is normal, backwardation occurs around events that concentrate near-term uncertainty. Calendar trades buy cheap tenors and sell rich ones.&lt;/p&gt;

&lt;p&gt;Spot-vol correlation is a further shape measure. When spot falls, vol typically rises (negative spot-vol correlation in equities). A surface with very steep downside skew reflects a high-magnitude negative spot-vol correlation priced into the smile.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dispersion and implied correlation
&lt;/h3&gt;

&lt;p&gt;Implied correlation is extracted by comparing index implied vol to single-name implied vols:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ρ_implied = (σ_index² − Σ wᵢ²σᵢ²) / (2 Σ_{i&amp;lt;j} wᵢ wⱼ σᵢ σⱼ)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Implied correlation is typically higher than realised because the index put skew is structurally bid: investors pay up to hedge the index as a unit rather than buying individual-name puts. A dispersion trade sells index vol and buys single-name vols (or vice versa), monetising the spread. When implied correlation exceeds realised, the index is rich relative to constituents: sell the index, buy the names.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading the data
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SVI parameters: what the numbers tell you
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://lab.flashalpha.com/v1/adv_volatility/SPX&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Api-Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;svi_parameters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;expiry&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;days_to_expiry&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;d): &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  b=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rho=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;rho&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  m=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;m&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  sigma=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sigma&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ATM IV=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;atm_iv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%  arb_free=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;arb_free&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Interpretation per parameter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;rho more negative than −0.7:&lt;/strong&gt; extremely steep put skew. Often indicates event risk or structural demand for downside protection. Check whether it is a single-name earnings effect or a broad index regime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;b above 0.15:&lt;/strong&gt; wide wings, large moves priced at both extremes. High b with a normal rho means symmetric wing richness, which is unusual and may indicate a vol-of-vol dislocation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;sigma near zero:&lt;/strong&gt; a nearly V-shaped smile with minimal ATM curvature. Numerically fragile; arb violations are more likely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cross-slice rho flattening:&lt;/strong&gt; near-term slices are usually steeper than long-dated ones. If the long end suddenly steepens to match, the long end is pricing a structural change.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Arbitrage flags: non-negotiable checks
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;flags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arbitrage_flags&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;] &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;expiry&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; moneyness=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;moneyness&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;n/a&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Surface is arbitrage-free&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A butterfly violation means the risk-neutral density goes negative at that moneyness, so any price referencing that region is undefined. A calendar violation means a calendar spread there is a free lunch. Do not trade off a surface with active flags.&lt;/p&gt;

&lt;h3&gt;
  
  
  Variance surface and var-swap strikes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;vs&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;variance_swap_fair_values&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;K_var&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;K_var&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;            &lt;span class="c1"&gt;# fair variance strike (annualised)
&lt;/span&gt;    &lt;span class="n"&gt;fair_vol&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fair_vol&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;         &lt;span class="c1"&gt;# sqrt(K_var), vol units
&lt;/span&gt;    &lt;span class="n"&gt;convexity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fair_vol&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;vs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;atm_iv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;vs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;expiry&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: fair_vol=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fair_vol&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%  &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ATM=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;vs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;atm_iv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%  convexity_adj=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;convexity&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;pp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The convexity adjustment directly measures how much the wings cost relative to ATM. Above +1.5pp for SPX is historically elevated, indicating the market is paying a premium for tail coverage beyond what ATM vol implies. Track the time series and you have a clean signal for when variance swaps are cheap or rich relative to straddles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dispersion and spot-vol correlation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;disp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://lab.flashalpha.com/v1/dispersion&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;index&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPX&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;symbols&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL,MSFT,NVDA,AMZN,GOOGL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weights&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0.07,0.07,0.06,0.05,0.05&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;horizon_days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Api-Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Implied correlation:  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;disp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;implied_correlation&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Realised correlation: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;disp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;realized_correlation&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Corr premium:         &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;disp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;correlation_premium&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The trades
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Calendar / term-structure trades
&lt;/h3&gt;

&lt;p&gt;A calendar spread buys total variance at one expiry and sells it at another. Compute the ATM IV ratio between front and back via &lt;code&gt;/v1/volatility/skew-term&lt;/code&gt;. If the ratio is in the top decile of its history, the front is rich: sell front variance, buy back variance. Size to vega-neutrality across the two legs, not notional-neutrality.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://lab.flashalpha.com/v1/volatility/skew-term/SPX&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Api-Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;front&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;term_structure&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;back&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;term_structure&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Front/back ratio: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;front&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;atm_iv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;back&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;atm_iv&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Regime: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;term_structure_regime&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Event distortions.&lt;/strong&gt; The front ratio inflates mechanically before FOMC, CPI, and earnings because the near-term expiry prices the event premium. A top-decile ratio during a FOMC week is not a calendar opportunity; it is the options market correctly pricing the event. Check the term-structure endpoint's event flags first.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skew / risk-reversal trades
&lt;/h3&gt;

&lt;p&gt;A risk reversal sells an OTM put and buys an OTM call at the same delta, delta-hedged: a pure bet on the skew level.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RR25 = σ_IV(Δput = −0.25) − σ_IV(Δcall = +0.25)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A 25-delta RR in the bottom decile (puts cheap relative to calls, rare in equities) is a long-skew opportunity. A top-decile RR (puts extremely rich) is a short-skew opportunity, but timing matters enormously because equity skew is structurally bid and can stay rich for months.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dispersion
&lt;/h3&gt;

&lt;p&gt;The canonical dispersion trade sells index variance and buys single-name variance in proportion to index weights. The P&amp;amp;L is driven by the off-diagonal cross-terms: each constituent pair contributes its weighted vol product weighted by the correlation gap. When implied correlation exceeds realised, selling the index and buying the names earns positive carry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regime risk.&lt;/strong&gt; Correlation is regime-switching. In a broad risk-off event (March 2020, the 2022 rate shock), realised correlation spikes above 0.9 and the dispersion trade loses catastrophically because single-name vol cannot offset the index move. Sizing requires explicit correlation-scenario stress testing, not just historical mean-reversion assumptions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Variance vs vol RP trades
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;vrp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://lab.flashalpha.com/v1/vrp/SPX&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Api-Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;VRP (variance basis): &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;vrp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;variance_risk_premium&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;pp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;VolRP (vol basis):    &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;vrp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;volatility_risk_premium&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;pp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# VRP z &amp;gt;&amp;gt; VolRP z: wings rich, convexity elevated
# VolRP z &amp;gt;&amp;gt; VRP z: wings cheap, ATM richness dominates
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the convexity adjustment widens, the wings are expensive relative to ATM; a ratio spread long ATM and short the wings monetises it. When it compresses, butterfly buyers and long vol-of-vol positions benefit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Risk and sizing
&lt;/h2&gt;

&lt;p&gt;Every vol-RV trade should be vega-hedged at the trade level: the book earns from surface-shape dislocations, not from the level of vol. Net vega across all legs should sit close to zero, rebalanced at least daily. Gamma neutrality is harder to hold simultaneously, since in a calendar the short front leg has far higher gamma than the long back leg, so you will carry net gamma. For a multi-name dispersion book, report risk in vega-weighted terms per name, normalising by vol-of-vol (proxy via b from the SVI fit), because 10,000 vega in NVDA carries more vol-of-vol risk than 10,000 vega in MSFT.&lt;/p&gt;

&lt;p&gt;The residual risk in a delta- and vega-neutral book is correlation risk, which is fat-tailed and regime-switching. Size as a fraction of the risk budget assuming realised correlation can spike 0.3 to 0.5 above its long-run mean in a single macro shock, and confirm the resulting P&amp;amp;L stays inside your drawdown limit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The kinks and common mistakes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Trading off a non-arbitrage-free surface.&lt;/strong&gt; A butterfly failure implies negative probability density. The symptom is subtle: a calendar that should pay positive carry bleeds theta because the fit is locally inconsistent. Check &lt;code&gt;arb_free&lt;/code&gt; per slice before placing any trade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Conflating VaRP with VolRP.&lt;/strong&gt; A high VolRP z-score says ATM straddles are rich. A high VaRP z-score says the wings are rich too. Selling a straddle when VaRP is rich but VolRP is flat earns no premium; the wing richness lives in the variance-swap convexity adjustment. The correct trade there is a ratio spread, not an outright straddle sale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Liquidity filtering of SVI fits.&lt;/strong&gt; Stale, zero-OI, or wide-market strikes distort the fit. Rich/cheap signals in the far wings are often artefacts of liquidity gaps, not real dislocations. Cross-check wing signals against raw chain liquidity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Dispersion correlation regime shifts.&lt;/strong&gt; The implied-exceeds-realised argument is valid in low-correlation regimes. During a macro sell-off, realised correlation jumps toward 1.0 and the trade loses on both legs at once. Require hard stop-losses on realised correlation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Term-structure event distortions.&lt;/strong&gt; A calendar that looks rich on the ATM ratio alone may be fully justified by an event in the front expiry. Check event flags on both legs before interpreting front-month richness as a calendar opportunity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Realised vol estimator choice.&lt;/strong&gt; Close-to-close is biased by overnight gaps and noisy for short windows. Yang-Zhang uses overnight, open-to-close, and close-to-close returns simultaneously for lower variance. The choice can shift apparent richness by 0.5 to 2pp, enough to flip a weak z-score signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Worked example: an SPX surface snapshot
&lt;/h2&gt;

&lt;p&gt;Representative figures, illustrative rather than live:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Front (21d)&lt;/th&gt;
&lt;th&gt;Back (49d)&lt;/th&gt;
&lt;th&gt;Read&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ATM IV&lt;/td&gt;
&lt;td&gt;17.4%&lt;/td&gt;
&lt;td&gt;15.8%&lt;/td&gt;
&lt;td&gt;Ratio 1.10, mild backwardation, front modestly rich&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25Δ RR&lt;/td&gt;
&lt;td&gt;−4.2pp&lt;/td&gt;
&lt;td&gt;−3.1pp&lt;/td&gt;
&lt;td&gt;Front put wing steeper, within normal range (~60th pctile)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Var-swap fair vol&lt;/td&gt;
&lt;td&gt;19.1%&lt;/td&gt;
&lt;td&gt;17.2%&lt;/td&gt;
&lt;td&gt;Convexity +1.7pp and +1.4pp above ATM, wings elevated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Butterfly (25Δ)&lt;/td&gt;
&lt;td&gt;1.8pp&lt;/td&gt;
&lt;td&gt;1.5pp&lt;/td&gt;
&lt;td&gt;Wing curvature above ATM, consistent with convexity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arb flags&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Trade-ready on both slices&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The front convexity adjustment of +1.7pp is elevated versus the historical mean near 1.0pp for SPX, so variance swaps are expensive relative to straddles. A ratio spread (long ATM, short wings) or an outright var-swap sell is more attractive than a simple straddle sale. The skew signal is neutral at the 60th percentile, so no standalone RR trade is justified.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="n"&gt;adv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://lab.flashalpha.com/v1/adv_volatility/SPX&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Api-Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;hist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://lab.flashalpha.com/v1/surface/history/SPX?lookback_days=90&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Api-Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;skew&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://lab.flashalpha.com/v1/volatility/skew-term/SPX&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Api-Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;rr_today&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;skew&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;term_structure&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;risk_reversal_25d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;rr_hist&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;risk_reversal_25d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;hist&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;skew_history&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;span class="n"&gt;rr_pctile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rr_hist&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;rr_today&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="n"&gt;front_arb_free&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;adv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;svi_parameters&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arb_free&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;rr_pctile&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;85&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;front_arb_free&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PUT WING RICH: short skew / short RR candidate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;rr_pctile&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;front_arb_free&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PUT WING CHEAP: long skew / long RR candidate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No skew signal: RR at &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rr_pctile&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;th percentile&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Endpoints for vol-arb
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Delivers&lt;/th&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/v1/adv_volatility/{t}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SVI params, variance surface, arb flags, var-swap fair values&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/v1/surface/{t}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full IV surface grid (historical replay available)&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/v1/surface/svi/{t}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Per-bucket IV with rolling mean and z-score&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/v1/vrp/{t}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Variance RP, vol RP, z-scores&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/v1/dispersion?index=...&amp;amp;symbols=...&amp;amp;weights=...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Implied/realised correlation, premium&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/v1/volatility/skew-term/{t}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ATM IV, 25Δ RR, butterfly, regime, event flags&lt;/td&gt;
&lt;td&gt;Growth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/v1/volatility/spot-vol-correlation/{t}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;30d, 90d, 6m spot-vol correlation&lt;/td&gt;
&lt;td&gt;Growth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/v1/volatility/{t}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ATM IV, Yang-Zhang and close-to-close realised vol, IV rank&lt;/td&gt;
&lt;td&gt;Growth&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a Claude-based research or signal-generation agent, the vol-arb MCP connector is at &lt;code&gt;https://lab.flashalpha.com/mcp-oauth/volarb&lt;/code&gt;, exposing the advanced volatility, VRP, surface, dispersion, and term-structure tools as Claude-callable functions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The edge in relative-value volatility is exposure to the shape of the surface, not its level, and shape is more persistent and mean-reverting than level. Capturing it cleanly depends on an arbitrage-free fit, a clear separation between variance and volatility risk premium, and explicit correlation-scenario sizing for anything dispersion-shaped. Get the surface right first; the trades follow from it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://flashalpha.com/articles/complete-guide-volatility-relative-value-trading" rel="noopener noreferrer"&gt;FlashAlpha&lt;/a&gt;. FlashAlpha provides SVI surfaces, var-swap strikes, VRP decomposition, dispersion, and term structure as structured JSON for 6,000+ US equities and ETFs. &lt;a href="https://flashalpha.com/pricing" rel="noopener noreferrer"&gt;Free API key, no credit card.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>quant</category>
      <category>python</category>
      <category>trading</category>
      <category>finance</category>
    </item>
    <item>
      <title>Best Options Data APIs 2026: 7 Compared (Pricing &amp; Free Tiers)</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Sun, 07 Jun 2026 07:00:40 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/best-options-data-apis-2026-7-compared-pricing-free-tiers-1lf5</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/best-options-data-apis-2026-7-compared-pricing-free-tiers-1lf5</guid>
      <description>&lt;p&gt;&lt;strong&gt;Full disclosure:&lt;/strong&gt; I built FlashAlpha. I am going to be honest about where every other provider beats us, because lying in a comparison guide gets you exactly one click and zero customers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The seven that actually matter
&lt;/h2&gt;

&lt;p&gt;The "options data API" search returns dozens of providers. Most are repackaged Polygon, dead startups, or enterprise tools nobody under $1M revenue can afford. These seven are the ones real quants and developers actually choose between:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;th&gt;Starting price&lt;/th&gt;
&lt;th&gt;Free tier&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Polygon.io&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Raw market data infrastructure, tick-level history&lt;/td&gt;
&lt;td&gt;$29/mo (stocks) + $79/mo (options)&lt;/td&gt;
&lt;td&gt;5 calls/min, no options&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ORATS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Historical data, backtesting, 25 years of history&lt;/td&gt;
&lt;td&gt;$99/mo&lt;/td&gt;
&lt;td&gt;14-day trial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tradier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Brokerage-attached API, retail traders, sandbox&lt;/td&gt;
&lt;td&gt;$10/mo (data) or free with brokerage account&lt;/td&gt;
&lt;td&gt;Sandbox account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Intrinio&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Institutional fundamental + options data combo&lt;/td&gt;
&lt;td&gt;~$1,000/mo+&lt;/td&gt;
&lt;td&gt;Limited demo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ThetaData&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cheap historical options tick data for quants&lt;/td&gt;
&lt;td&gt;$80/mo&lt;/td&gt;
&lt;td&gt;None (paid only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unusual Whales&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Flow alerts, dark pool prints, congressional trades&lt;/td&gt;
&lt;td&gt;$48/mo retail / API on request&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FlashAlpha&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pre-computed exposure analytics (GEX/DEX/VEX/CHEX), max pain, vol surfaces&lt;/td&gt;
&lt;td&gt;Free / $79 / $299 / $1,499/mo&lt;/td&gt;
&lt;td&gt;5 req/day, no time limit, no card&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That is the table you came for. Now let me explain why the choice matters and which one fits which job.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are you actually building?
&lt;/h2&gt;

&lt;p&gt;Most developers waste their first month picking an API on price or feature lists without asking what data they actually need to fetch. Five common project types and the right starting point for each:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. A backtesting engine.&lt;/strong&gt; Start with ORATS or ThetaData. Both have deep historical options data with greeks attached. ORATS gives you a hosted backtesting engine (300M+ pre-computed backtests) and 98 proprietary indicators if you do not want to build the strategy logic yourself. ThetaData is cheaper per gigabyte if you are comfortable writing your own framework and pulling raw end-of-day data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. A real-time GEX dashboard.&lt;/strong&gt; Start with FlashAlpha. Real-time per-strike gamma exposure, gamma flip levels, call/put walls, and dealer regime classification, pre-computed in a single API call. Polygon and Tradier give you the raw chain, but you will need to compute the greeks yourself, then aggregate by strike, then label the regime. That is 2,000+ lines of code before your first chart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. API access for a brokerage workflow.&lt;/strong&gt; Start with Tradier. If you already trade with Tradier, the data is bundled with the account, the API is free for active traders, and the sandbox lets you build before funding. No pre-computed analytics, though. Good for execution-adjacent automation, bad for analytical research.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. A SaaS product needing every contract on every US underlying.&lt;/strong&gt; Start with Polygon.io. They are the infrastructure layer: tick-level history, full chains, websocket streaming, real-time consolidated quotes. Expensive at scale but the most complete raw feed in the retail-accessible range. Use Polygon for the data, build (or rent) analytics on top.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Following flow, dark pool prints, unusual activity, congressional trades.&lt;/strong&gt; Start with Unusual Whales. They built a product around the "follow the smart money" thesis. The data is opinion-laden in a way the others are not. You are getting their interpretation of "unusual" baked in, which is fine if you trust the definition and a problem if you want to define your own.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three categories nobody names
&lt;/h2&gt;

&lt;p&gt;Once you have narrowed by use case, the seven fall into three categories none of their marketing pages name out loud. Knowing the category is more useful than any feature list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Category A: Raw data infrastructure (Polygon, Tradier, ThetaData).&lt;/strong&gt; They give you the chain - bid, ask, IV, OI, volume, sometimes greeks - and you bring the analytics layer. Best for teams that want full control of the pipeline. Trade-off: 4-8 weeks building the analytics layer before your first useful screen. Cheapest long-term if you have engineers and time; fastest path to a delayed launch if you have a deadline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Category B: Pre-computed analytics (ORATS, FlashAlpha).&lt;/strong&gt; These ship analytics with the data - regime labels, GEX, vol surfaces, strategy scores, VRP. You pay for the math to be done for you. Best for teams whose value-add is the strategy, not the data engineering. Trade-off: you are locked into someone else's definitions. The category splits on the time axis - ORATS optimises for EOD depth (25 years back to 2007), FlashAlpha for minute-level dealer-positioning analytics (live, plus a historical API replaying every analytics endpoint at any minute since April 2018 in the same response shape). ORATS goes wider, FlashAlpha goes deeper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Category C: Flow and sentiment products (Unusual Whales, SpotGamma, Intrinio).&lt;/strong&gt; These wrap data in a UX or a thesis. You pay for opinion as much as data. Best for traders who want a commentary or alert stream rather than building from raw inputs. Trade-off: less programmatic flexibility - the best content often lives behind a web dashboard, not an API.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each one does best, in one sentence
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Polygon.io&lt;/strong&gt; - Best raw options data infrastructure in the retail-accessible price range. Buy if your team will build the analytics layer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ORATS&lt;/strong&gt; - Best for historical backtesting and 25 years of consistently-computed indicators. Buy if your strategy needs to backtest across multiple regimes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tradier&lt;/strong&gt; - Best brokerage-attached API. Buy if you are already a Tradier customer or want bundled execution and data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intrinio&lt;/strong&gt; - Best for combining fundamentals with options in one bill. Buy if you have $1K+/mo budget and need both.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ThetaData&lt;/strong&gt; - Best cheap historical options tick data. Buy if you are a price-sensitive quant comfortable with raw data engineering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unusual Whales&lt;/strong&gt; - Best flow alerts and "follow the smart money" product. Buy if you want opinion-laden alerts rather than building from raw data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FlashAlpha&lt;/strong&gt; - Best pre-computed dealer-positioning analytics (GEX, DEX, VEX, CHEX, max pain, regime, VRP) with a matched live + historical API. Buy if you want to ship a GEX dashboard or premium-selling scanner this week instead of next quarter.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The stacks that actually work
&lt;/h2&gt;

&lt;p&gt;Most serious teams combine two providers. The three I see most often:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backtest + live execution.&lt;/strong&gt; If you need pre-2018 EOD depth or ORATS's proprietary indicators, use ORATS for deep-history validation and FlashAlpha for live signals plus intraday research since 2018. If your strategy is dealer-positioning-driven, FlashAlpha alone works - the historical API replays every live endpoint at any minute since April 2018 in the same shape, so backtest and production run the same code path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Raw data + custom analytics.&lt;/strong&gt; Polygon for the raw chain, in-house Python for everything else. Full methodology control, slowest to first value, cheapest at scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flow alerts + positioning context.&lt;/strong&gt; Unusual Whales for the alerts, FlashAlpha for the positioning. When the alert fires "TSLA unusual call activity," check whether TSLA is in positive or negative gamma, where the call wall is, and what the VRP looks like. The alert tells you something is happening; the positioning tells you whether to fade or follow it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decide in under five minutes
&lt;/h2&gt;

&lt;p&gt;Work down this list and stop at the first match:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;EOD backtesting engine needing pre-2018 data → ORATS&lt;/li&gt;
&lt;li&gt;Backtesting a dealer-positioning or intraday strategy since 2018 → FlashAlpha (Alpha tier, historical API)&lt;/li&gt;
&lt;li&gt;Every options contract on every US underlying with full tick history → Polygon.io&lt;/li&gt;
&lt;li&gt;Retail trader already on Tradier → Tradier API (free for you)&lt;/li&gt;
&lt;li&gt;Ship a GEX dashboard or VRP scanner this week → FlashAlpha (free tier, no card)&lt;/li&gt;
&lt;li&gt;Flow alerts and "what are the smart traders doing today" → Unusual Whales&lt;/li&gt;
&lt;li&gt;Fundamentals + options in one bill, $1K+/mo budget → Intrinio&lt;/li&gt;
&lt;li&gt;Cheap quant who will write your own pipeline against raw tick data → ThetaData&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If two or more match, read the dedicated pairwise comparison - the headline difference is rarely the actual decision driver.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed in 2026
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free tiers are table stakes.&lt;/strong&gt; The "no credit card" free tier used to be a differentiator. Now Polygon, Tradier sandbox, and newer entrants all offer one. The bar for "show me before you charge me" is permanently higher.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pre-computed analytics is a category.&lt;/strong&gt; Until 2024, most providers shipped raw data and expected you to build analytics (ORATS aside). Buyers now ask "what do you compute for me?" not just "what data do you ship?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Point-in-time analytics replay is new.&lt;/strong&gt; A historical API mirroring every live analytics endpoint at minute resolution since April 2018, in the same response shape, is a shape that did not exist before. Raw historical data is still a commodity; the minute-level computed-analytics replay is the new part.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP servers are an unlock.&lt;/strong&gt; Model Context Protocol lets LLM assistants (Claude, Cursor, Windsurf) query providers directly. If your dev workflow involves an LLM - and most do in 2026 - MCP support is a real differentiator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0DTE is its own product.&lt;/strong&gt; Same-day expiry now drives enough volume that providers ship dedicated 0DTE endpoints returning pin risk, expected move, and gamma acceleration in real time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The TL;DR
&lt;/h2&gt;

&lt;p&gt;For the most common case - a developer who wants to build something useful with options data this week without getting locked into a $299/mo bill before validating the idea - start with a free tier (5 calls/day, no card, no time limit) covering GEX, IV, BSM greeks, key levels, and stock quotes for 6,000+ symbols. Prototype a whole premium-selling screener before deciding whether to scale up.&lt;/p&gt;

&lt;p&gt;Then pair it with the right second provider. ORATS for backtesting depth. Polygon for raw data scale. Unusual Whales for flow context. The single-vendor stack rarely wins; the two-vendor stack does.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://flashalpha.com/articles/best-options-data-apis-2026" rel="noopener noreferrer"&gt;flashalpha.com&lt;/a&gt;. FlashAlpha provides pre-computed options analytics - GEX, DEX, VEX, CHEX, SVI surfaces, max pain, VRP, and dealer positioning - as a live and historical API for 6,000+ US equities and ETFs.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>finance</category>
      <category>trading</category>
      <category>quant</category>
    </item>
    <item>
      <title>Alpha Decay in Options Analytics: Which Endpoints Erode With Crowding, and Why the Edge Has a Price</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Sat, 06 Jun 2026 20:31:07 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/alpha-decay-in-options-analytics-which-endpoints-erode-with-crowding-and-why-the-edge-has-a-price-3pn0</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/alpha-decay-in-options-analytics-which-endpoints-erode-with-crowding-and-why-the-edge-has-a-price-3pn0</guid>
      <description>&lt;p&gt;If you sell options analytics to prop desks and funds, the first honest question a quant buyer asks is: "If you sell this to everyone, doesn't the edge disappear?" It is the right question, and the lazy answer ("our moat is data depth") does not survive contact with someone who has read the crowding literature. The accurate answer requires separating what actually decays from what does not, because the two are mixed together in any analytics product.&lt;/p&gt;

&lt;p&gt;Full disclosure: I build this stack. I am going to be specific about which of our own endpoints carry no edge at all, because the credibility of the parts that &lt;em&gt;do&lt;/em&gt; matter depends on not overselling the parts that do not.&lt;/p&gt;

&lt;h2&gt;
  
  
  What alpha decay actually is
&lt;/h2&gt;

&lt;p&gt;Alpha decay is the erosion of a strategy's excess return over time. It has three distinct drivers, and conflating them is the most common mistake:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data-mining decay.&lt;/strong&gt; A backtested edge was partly noise; it shrinks out-of-sample even if nobody else ever sees it. McLean and Pontiff bound this at roughly the 26% out-of-sample decline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crowding / publication decay.&lt;/strong&gt; Once others learn the signal and commit capital, they arbitrage it toward fair value. This is the additional drop from 26% to 58% - the part caused by awareness, not noise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capacity decay.&lt;/strong&gt; A specific case of crowding: the strategy has finite room before the participants' own trades move the price against them. Capacity is a function of &lt;em&gt;liquidity and holding period&lt;/em&gt;, not of how clever the signal is.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point is the one most relevant to a data vendor, and the one most often abused in marketing. The crowding literature is consistent that decay magnitude scales with capacity constraints: slower, less liquid strategies decay more because they attract more arbitrage capital relative to the liquidity available to absorb it (&lt;a href="https://arxiv.org/pdf/2105.01380" rel="noopener noreferrer"&gt;Why and how systematic strategies decay, 2021&lt;/a&gt;). The classic worked example is pairs trading, whose returns compressed materially as hedge funds crowded it after the 1990s.&lt;/p&gt;

&lt;p&gt;The corollary matters for honesty. A signal on the most liquid instruments on earth - SPX, SPY, 0DTE index options - has very high capacity, so the marginal participant erodes it slowly. A niche, low-capacity signal erodes fast. Any vendor claiming "we limit subscribers so the edge survives" is only telling the truth for the low-capacity case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not every endpoint is an edge
&lt;/h2&gt;

&lt;p&gt;Here is the part that gets skipped. An analytics API is a mix of measurements, risk premia, mechanical effects, and genuine timing signals. Only one of those four classes decays the way the popular usage of "alpha decay" implies.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Class&lt;/th&gt;
&lt;th&gt;Endpoints&lt;/th&gt;
&lt;th&gt;Decay behaviour&lt;/th&gt;
&lt;th&gt;Mechanism / evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;1. Measurement&lt;/strong&gt; (was never alpha)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;option_chain&lt;/code&gt;, &lt;code&gt;option_quote&lt;/code&gt;, &lt;code&gt;stock_quote&lt;/code&gt;, &lt;code&gt;greeks&lt;/code&gt;, &lt;code&gt;solve_iv&lt;/code&gt;, &lt;code&gt;volatility&lt;/code&gt;, &lt;code&gt;surface&lt;/code&gt;, &lt;code&gt;dex&lt;/code&gt;, &lt;code&gt;vex&lt;/code&gt;, &lt;code&gt;chex&lt;/code&gt;, &lt;code&gt;kelly&lt;/code&gt;, &lt;code&gt;tickers&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;None. You cannot decay what was never an edge.&lt;/td&gt;
&lt;td&gt;Reports consensus market state or is pure math. Any edge lives in &lt;em&gt;your model of them&lt;/em&gt;, not in the number.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;2. Risk premia&lt;/strong&gt; (persistent, time-varying)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;vrp&lt;/code&gt; (the premium itself)&lt;/td&gt;
&lt;td&gt;Compresses under crowding but is not eliminated; can invert in stress.&lt;/td&gt;
&lt;td&gt;Compensation for bearing variance risk (Carr and Wu, 2009). Paid because short-vol periodically blows up.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;3. Mechanical flow&lt;/strong&gt; (structural)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;max_pain&lt;/code&gt; / pinning, the dealer-hedging component of &lt;code&gt;gex&lt;/code&gt; and &lt;code&gt;levels&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Resists crowding decay; erodes instead via front-running and manipulation.&lt;/td&gt;
&lt;td&gt;Driven by dealer delta-hedging, not by how many people believe it (Ni, Pearson and Poteshman, 2005).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;4. Crowdable timing signals&lt;/strong&gt; (genuine decay)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;narrative&lt;/code&gt;, the directional read of &lt;code&gt;exposure_summary&lt;/code&gt;, &lt;code&gt;zero_dte&lt;/code&gt; timing, front-running a gamma-flip &lt;em&gt;level&lt;/em&gt;, VRP strategy scoring, the live &lt;code&gt;screener&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Real decay with awareness and capital, scaled by capacity.&lt;/td&gt;
&lt;td&gt;Publication / crowding effect (McLean and Pontiff, 2016).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Class 1 - measurement endpoints carry no alpha to lose
&lt;/h3&gt;

&lt;p&gt;A real-time options chain, a Black-Scholes greek, a solved implied vol, an SVI-fitted surface, a DEX/VEX/CHEX exposure - these are descriptions of the market's current state. The vol surface is the market's &lt;em&gt;consensus&lt;/em&gt;; it cannot be arbitraged away by being widely distributed because it is not a prediction. If you have an edge here, it is in your model spotting that the surface is mispriced relative to your own forecast, and that edge is yours, not the endpoint's. Distributing this data to a thousand desks does not degrade it. This is the bulk of what most buyers actually need, and it is honest to say it does not decay.&lt;/p&gt;

&lt;h3&gt;
  
  
  Class 2 - the variance risk premium is a premium, not an anomaly
&lt;/h3&gt;

&lt;p&gt;VRP is frequently mis-sold as a decaying "edge." It is not an anomaly; it is compensation for selling volatility insurance, and it is pervasive across assets and regions precisely because someone has to be paid to be short volatility into the next crash. Crowding compresses it - more sellers, thinner premium - but it does not vanish, because the risk it pays for is real and occasionally catastrophic (February 2018's short-vol unwind is the standing reminder). VRP is persistent &lt;em&gt;in expectation&lt;/em&gt;, time-varying, and capable of going deeply negative in stress. What decays is the &lt;em&gt;timing overlay&lt;/em&gt; on top of it - knowing when to lean in - not the premium itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Class 3 - pinning is mechanical, so it resists belief-crowding
&lt;/h3&gt;

&lt;p&gt;Max pain and strike pinning are the most misunderstood case. Ni, Pearson and Poteshman (2005) showed that on expiration dates, optionable stock closes cluster at strike prices, shifting returns by an average of at least 16.5 basis points, with no equivalent effect in non-optionable stocks. The driver is &lt;em&gt;dealer delta-hedging&lt;/em&gt;: hedgers of net-long option positions sell above the strike and buy below it, pushing price toward the strike. Because the effect is a mechanical consequence of hedging flow rather than a belief traders can pile into, it does not decay the way a sentiment signal does.&lt;/p&gt;

&lt;p&gt;Two honest caveats keep this factual. First, the original evidence covers 1996-2002; market structure has changed materially since, and the rise of 0DTE has compressed the relevant hedging horizon, so the modern magnitude is not guaranteed to match the original study. Second, the same paper found proprietary-trader manipulation contributing to clustering, which means the erosion channel here is front-running and gaming, not crowding-toward-fair-value. The signal is structural, but it is not immortal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Class 4 - the signals that genuinely decay
&lt;/h3&gt;

&lt;p&gt;This is where "alpha decay" actually applies. A packaged directional narrative, a gamma-flip &lt;em&gt;level traded as a setup&lt;/em&gt;, a 0DTE expected-move timing call, a ranked screener of "best" setups - these are predictions that work better when fewer people act on them, and McLean-Pontiff is the empirical anchor: awareness erodes returns.&lt;/p&gt;

&lt;p&gt;The crucial distinction is the &lt;strong&gt;two-layer nature of a dealer-positioning level&lt;/strong&gt;. The gamma-flip level &lt;em&gt;as a number&lt;/em&gt; is mechanical (Class 3) and persistent. The &lt;em&gt;trade of front-running that level&lt;/em&gt; is a Class 4 timing signal and does decay with crowding. Same endpoint, two layers, opposite decay behaviour.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the edge has a price
&lt;/h2&gt;

&lt;p&gt;For Class 4 signals - and only those - distribution is the decay variable. The mechanism is a congestion externality: each additional participant acting on a capacity-constrained signal imposes a small cost on everyone already holding it, by moving the price before they can. This is standard limits-to-arbitrage reasoning.&lt;/p&gt;

&lt;p&gt;The factual scoping matters: this externality is large for low-capacity signals and small for high-capacity ones. So the correct version of the rationing argument is not "we cap subscribers or the edge dies on everything." It is narrower and defensible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For genuinely capacity-constrained signals, the value to each holder is a decreasing function of how many other holders there are. The economically efficient price for such a feed is therefore &lt;em&gt;high by construction&lt;/em&gt; - the price is the rationing mechanism that keeps per-holder capacity intact.&lt;/li&gt;
&lt;li&gt;Mass retail distribution of a niche, low-capacity signal is the fastest way to destroy it.&lt;/li&gt;
&lt;li&gt;This is observable in the tiering itself. Measurement endpoints (Class 1, no decay) are cheap or free. The crowdable signals (Class 4) sit in the higher tiers. The price gradient tracks the decay gradient, which is what you would expect if the pricing is doing real work rather than segmenting on willingness-to-pay alone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The signals worth protecting are protected by the fact that a crowd cannot afford them, and the things a crowd &lt;em&gt;can&lt;/em&gt; afford are the ones that do not decay anyway.&lt;/p&gt;

&lt;h2&gt;
  
  
  Offshoring the quant stack
&lt;/h2&gt;

&lt;p&gt;Strip away the Class 4 signals and look at what is left: Class 1 measurement infrastructure. That is the durable, non-decaying core, and it is also the most expensive thing to build in-house. Replicating it means standing up three functions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A quant function&lt;/strong&gt; to build and validate the calculators - greeks hydration, SVI surface fitting with arbitrage constraints, exposure math, VRP estimation. Months of work before the first correct number.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A data function&lt;/strong&gt; to ingest, store, and serve options data at scale - the minute-level history behind a single liquid name runs into billions of rows - with gap detection and daily reconciliation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A devops / on-call function&lt;/strong&gt; to keep the pipeline running every trading day.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a desk whose actual edge is its trading, not its data infrastructure, the build-versus-buy maths is one-sided. What you are really paying for is the non-decaying measurement layer - the part that stays valuable no matter how many people have it. The Class 4 signals on top stay useful precisely because the price keeps their distribution narrow.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;McLean, R.D. and Pontiff, J. (2016). "Does Academic Research Destroy Stock Return Predictability?" &lt;em&gt;Journal of Finance&lt;/em&gt; 71(1): 5-32.&lt;/li&gt;
&lt;li&gt;Ni, S.X., Pearson, N.D. and Poteshman, A.M. (2005). "Stock Price Clustering on Option Expiration Dates." &lt;em&gt;Journal of Financial Economics&lt;/em&gt; 78(1): 49-87.&lt;/li&gt;
&lt;li&gt;Carr, P. and Wu, L. (2009). "Variance Risk Premiums." &lt;em&gt;Review of Financial Studies&lt;/em&gt; 22(3): 1311-1341.&lt;/li&gt;
&lt;li&gt;"Why and how systematic strategies decay" (2021). arXiv:2105.01380.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://flashalpha.com/articles/alpha-decay-options-signals-which-endpoints-erode" rel="noopener noreferrer"&gt;flashalpha.com&lt;/a&gt;. FlashAlpha provides pre-computed options analytics - GEX, DEX, VEX, CHEX, SVI surfaces, VRP, and dealer positioning - as a live and historical API for 6,000+ US equities and ETFs.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>quant</category>
      <category>options</category>
      <category>trading</category>
      <category>finance</category>
    </item>
    <item>
      <title>Machine Learning on Options Data: An Honest Quant ML Guide</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Sat, 30 May 2026 07:53:06 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/machine-learning-on-options-data-an-honest-quant-ml-guide-49hk</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/machine-learning-on-options-data-an-honest-quant-ml-guide-49hk</guid>
      <description>&lt;p&gt;Options data is one of the densest public-markets modalities and one of the worst-served by ML toolchains. This is a direct tour of eight ML methodologies that have published research or plausible workflows on options, grouped by maturity, with the data shape each one needs, where historical replay actually delivers minute-level signal versus end-of-day, and the honest list of what none of this solves.&lt;/p&gt;

&lt;p&gt;I maintain the calculator stack this is written against, so I'll be upfront about the bias: I sell pre-computed analytics on top of historical options data. For a trader the pitch has always been "you don't have to build the calculator yourself." For an ML engineer the pitch is sharper: you don't have to build the training corpus yourself. Most of the exposure summaries, volatility analytics, and quote streams that power the live API are also available point-in-time across the history window. Some pieces (SVI parameters, open interest, macro overlays) are EOD-stamped rather than minute-level, and I'll flag exactly where that matters per methodology.&lt;/p&gt;

&lt;p&gt;If you want the case against before the survey, skip to the failures section at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pipeline problem (why this field is small)
&lt;/h2&gt;

&lt;p&gt;Before any model trains, the data has to be shaped, and options data is uniquely punishing here.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Raw chains aren't features.&lt;/strong&gt; A quote feed gives you bids and asks per strike. You still need spot, the forward curve, dividends, and a consistent Greeks pass before any of those numbers are usable as model inputs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Surface fits are not optional.&lt;/strong&gt; Without an arbitrage-free fit, your "implied volatility" feature is whatever Newton-Raphson converged to per strike, which means your skew, term, and butterfly features are noise plus signal. Models trained on that overfit to fit instability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-year minute-level coverage is large and hard to join.&lt;/strong&gt; Spot bars, option quotes per strike per expiration, open interest, macro overlays (VIX, VVIX, SKEW, MOVE), event calendars. Assembling all of this from raw tick providers is measured in months, and then you own the maintenance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leakage hides in EOD.&lt;/strong&gt; Most academic options datasets are end-of-day. Intraday strategies trained on EOD labels are quietly using settlement information that wouldn't have been known mid-session. Backtest looks great, live looks terrible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Greeks consistency.&lt;/strong&gt; If your training data has Greeks from one IV-surface assumption and your inference path uses another, you have silent training-serving skew. The feature drifts and you blame the model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why most published ML-on-options papers use a tiny strike subset and a short window. Every methodology below assumes the data is shaped right. If it isn't, your research timeline is consumed before you ever read a paper.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two SDKs, one wire format
&lt;/h2&gt;

&lt;p&gt;There are two FlashAlpha Python packages, and conflating them is a common mistake.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;flashalpha&lt;/code&gt; wraps the live service. High-level methods do not accept an &lt;code&gt;at=&lt;/code&gt; kwarg.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;flashalpha-historical&lt;/code&gt; wraps the historical service. Every high-level method requires &lt;code&gt;at=&lt;/code&gt; for point-in-time replay.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Recommended: dedicated historical SDK
# pip install flashalpha-historical
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flashalpha_historical&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FlashAlphaHistorical&lt;/span&gt;

&lt;span class="n"&gt;hx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FlashAlphaHistorical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;snap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exposure_summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2020-03-16T15:30:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;vol&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;volatility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2024-06-03T14:30:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Fallback: hit historical REST directly with the same X-Api-Key
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="n"&gt;BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://historical.flashalpha.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;HEADERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-Api-Key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;at&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="si"&gt;}{&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HEADERS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;vol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/v1/volatility/SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2024-06-03T14:30:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What historical actually ships: minute-level vs EOD
&lt;/h2&gt;

&lt;p&gt;"Same response shape as live" is true for the analytics surface. It is materially misleading for a handful of endpoints, and the resolution truth matters more than the schema.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Resolution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Per-contract bid, ask, IV, Greeks, spot&lt;/td&gt;
&lt;td&gt;Minute, 9:30 to 16:00 ET&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50x50 surface grid values&lt;/td&gt;
&lt;td&gt;Minute (driven by quotes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SVI calibration parameters {a, b, ρ, m, σ}&lt;/td&gt;
&lt;td&gt;EOD-stamped (one fit per trading day)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open interest&lt;/td&gt;
&lt;td&gt;EOD-stamped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Macro (VIX, VVIX, SKEW, MOVE)&lt;/td&gt;
&lt;td&gt;EOD-stamped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forward prices&lt;/td&gt;
&lt;td&gt;EOD-stamped&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-contract &lt;code&gt;svi_vol&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Always null in historical (&lt;code&gt;backtest_mode&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-contract &lt;code&gt;volume&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Always 0 in historical (use &lt;code&gt;open_interest&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That table dictates which methodology survives at minute resolution and which is bounded to EOD.&lt;/p&gt;

&lt;h2&gt;
  
  
  The maturity map
&lt;/h2&gt;

&lt;p&gt;The eight are not equally mature.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Production-proven:&lt;/strong&gt; realised-vol regression (1), deep hedging (4) for market makers and option desks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Research-backed:&lt;/strong&gt; sequence models on surfaces (3), vol-surface anomaly detection (5), causal inference and event studies (8).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plausible but not production:&lt;/strong&gt; regime classification on pre-computed dealer labels (2), generative path augmentation (6), GNNs on chains (7).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I include all eight because the data shape supports all eight. I am not selling all eight as alpha.&lt;/p&gt;

&lt;p&gt;If you read nothing else, read this table. It pulls the rest of the article into one place: what each method is mature enough to ship, the resolution constraint that actually bites it, and the tier that unblocks it.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Methodology&lt;/th&gt;
&lt;th&gt;Maturity&lt;/th&gt;
&lt;th&gt;Resolution constraint&lt;/th&gt;
&lt;th&gt;Tier to run it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Realised-vol regression&lt;/td&gt;
&lt;td&gt;Production&lt;/td&gt;
&lt;td&gt;Macro overlay is EOD; features otherwise minute&lt;/td&gt;
&lt;td&gt;Growth live / Alpha replay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Regime classification&lt;/td&gt;
&lt;td&gt;Plausible&lt;/td&gt;
&lt;td&gt;Labels minute-level; classifier methodology drifts&lt;/td&gt;
&lt;td&gt;Growth live / Alpha replay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Sequence models on surfaces&lt;/td&gt;
&lt;td&gt;Research&lt;/td&gt;
&lt;td&gt;Grid minute, SVI latent EOD&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Deep hedging / RL&lt;/td&gt;
&lt;td&gt;Production (desks)&lt;/td&gt;
&lt;td&gt;Greeks minute, OI EOD, full chain per step&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Surface anomaly detection&lt;/td&gt;
&lt;td&gt;Research&lt;/td&gt;
&lt;td&gt;Grid minute, SVI reference EOD&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Generative path augmentation&lt;/td&gt;
&lt;td&gt;Plausible&lt;/td&gt;
&lt;td&gt;Grid minute; can't synthesise unseen tails&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;GNNs on chains&lt;/td&gt;
&lt;td&gt;Speculative&lt;/td&gt;
&lt;td&gt;Chain minute; no known PnL profile&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Causal inference / event studies&lt;/td&gt;
&lt;td&gt;Research&lt;/td&gt;
&lt;td&gt;Surface minute; statistical power is the limit&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pattern is blunt: live feature engineering starts at Growth, and every method that needs point-in-time history is Alpha. The free tier inspects response shapes on a single non-index equity and nothing more.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Realised-volatility forecasting (regression)
&lt;/h2&gt;

&lt;p&gt;The simplest, most-published, most reliably useful-at-the-margin target: predict realised vol at a forward horizon (1d, 5d, 21d) given the current implied surface and recent realised history.&lt;/p&gt;

&lt;p&gt;Realised vol over horizon h is RV(t, h) = sqrt((252/h) · Σ r²). The vol risk premium is VRP = σ_IV − σ_RV. The forecasting target is the realised side; the implied side is a feature, because traders pricing protection are betting on the future return distribution and that signal leaks into level, skew, and term structure.&lt;/p&gt;

&lt;p&gt;Tree ensembles (XGBoost, LightGBM) and small recurrent models exploit this with a feature set that is easy to assemble: realised vol at multiple lookbacks, ATM 30-day IV, 25-delta risk reversal (skew), 30d-vs-90d term slope, 25-delta strangle vs ATM (butterfly), and the macro overlay (EOD-stamped in history).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;vol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;volatility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2024-06-14T15:30:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# realised-vol ladders, ATM IV, skew, term structure
# field names follow the live /v1/volatility response
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What it doesn't solve: regime change (the model always lags) and event-driven shocks (FOMC and earnings follow a different conditional distribution; treat them as a separate feature regime). This is the Kaggle-shaped end of options ML. Useful as a building block, not institutional alpha standalone.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Regime classification (dealer gamma, VRP)
&lt;/h2&gt;

&lt;p&gt;Conditional strategies are where most options alpha actually lives: sell premium when VRP is rich, buy gamma when dealers are short, fade rallies in positive-gamma regimes, ride them in negative-gamma. Every one needs a label, and labels are where most ML projects on options quietly fail, either look-ahead-biased or arbitrary.&lt;/p&gt;

&lt;p&gt;The exposure summary endpoint returns a categorical regime label per minute alongside net GEX, gamma flip, 0DTE contribution, and dealer-positioning interpretations, with the same classifier running across the replay window.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;summary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exposure_summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2024-06-14T15:30:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# net GEX/DEX/VEX/CHEX, gamma flip, 0DTE contribution,
# dealer-hedging narrative, regime label
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Honest caveat: the classifier evolves as bugs are fixed, so replay reflects current methodology, not a frozen-at-the-time snapshot. If you need bit-exact reproducibility against an older pull, archive your responses. The labels are descriptive, not causal: knowing the market is in a negative-gamma regime doesn't tell you when it ends. Pair with a separate transition-timing model. That's why this sits in "plausible but not production."&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Sequence models on IV surfaces (LSTM, transformer)
&lt;/h2&gt;

&lt;p&gt;The surface at time t is an (n_strikes by n_expirations) tensor; the sequence over a day is a tensor time series. This is squarely in the modality patch-based transformers, TCNs, and dilated convolutions handle well. The canonical reference is Horvath, Muguruza, and Tomas, "Deep Learning Volatility" (2019), which uses neural nets to price options under rough vol; the inverse problem of predicting surface dynamics uses the same input shape.&lt;/p&gt;

&lt;p&gt;SVI fits each expiration slice's total variance w(k) = a + b{ρ(k − m) + sqrt((k − m)² + σ²)}: five parameters per slice, arbitrage-free under explicit constraints.&lt;/p&gt;

&lt;p&gt;Feature engineering, in increasing dimensional efficiency: raw IV grid (most expressive, hardest to train), SVI parameters per slice, or whole-surface SVI parameters as global state (lowest-dimensional latent).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resolution caveat that bites here.&lt;/strong&gt; The 50x50 grid evolves at minute resolution because it's driven by quotes. The SVI calibration parameters are EOD-stamped. An intraday &lt;code&gt;at=&lt;/code&gt; returns the most recent EOD SVI parameters, not a fresh intraday calibration. If your model forecasts the SVI latent, you have one observation per trading day, not per minute. If you use the raw grid, the intraday tensor is real.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;surface&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;surface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2024-06-14T15:30:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# minute-level grid
&lt;/span&gt;&lt;span class="n"&gt;adv&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;adv_volatility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2024-06-14T15:30:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# SVI (EOD) + arb checks
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What it doesn't solve: sub-second mid-quote prediction. Market makers see flow you don't. Stay at multi-second horizons or longer.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Deep hedging and RL hedging
&lt;/h2&gt;

&lt;p&gt;This is where the academic literature is strongest and industrial deployment most mature, inside market-maker and exotic-desk shops. You hold a path-dependent position and want a hedging policy that minimises transaction-cost-aware variance, CVaR, or another risk measure. Analytical delta hedging is provably suboptimal under transaction costs and jumps; neural-network policies trained on simulated and real paths beat it.&lt;/p&gt;

&lt;p&gt;The objective: min over policy π of ρ(V_T − C_T), where V_T = V_0 + Σ π_t ΔS_t − Σ TC(π_t) and ρ is a convex risk measure. References: Buehler, Gonon, Teichmann, Wood, "Deep Hedging" (2018); Kolm and Ritter (2019); Cao, Chen, Hull, Poulos (2021).&lt;/p&gt;

&lt;p&gt;The data requirement is the hardest in this article: the full option chain at every step of every rollout, with full Greeks, so the policy can choose its hedge.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;chain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;option_quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2024-06-14T15:30:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# flat array, renamed fields: implied_vol (not iv), open_interest (not oi),
# lastUpdate (camelCase). Historical-only: iv_bid, iv_ask, vanna, charm, rho.
# volume always 0 (use open_interest); svi_vol always null (backtest_mode);
# open_interest EOD-stamped.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The minute-level Greeks, bid/ask, and spot anchor are real and usable; EOD OI and the null intraday smoother are the honest limits. Deep hedging is a hedging technology, not an alpha. PnL comes from being a market maker; deep hedging shrinks the residual variance. If you're a directional trader, this isn't your methodology.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Vol-surface anomaly detection (unsupervised)
&lt;/h2&gt;

&lt;p&gt;Mispriced surfaces produce structural arbitrage (butterfly, calendar, sticky-strike vs sticky-delta) and unusual structural shifts that precede directional moves. Both are unsupervised: you learn what normal looks like and flag deviations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Autoencoder on the surface grid.&lt;/strong&gt; Reconstruction error is the anomaly score. The 50x50 grid is minute-level historically, so this works at minute resolution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quote-vs-fit residual analysis.&lt;/strong&gt; The deviation between minute-level quotes and the EOD SVI fit is itself a signal; a persistent large deviation often precedes a quote correction or flags a stale fit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reference: Ackerer, Tagasovska, Vatter, "Deep Smoothing of the Implied Volatility Surface" (2020). The residuals of any smoother are usable as anomaly signals.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;adv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;adv_volatility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2024-06-14T15:30:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# SVI (EOD), variance grid, butterfly/calendar arb flags,
# variance-swap fair values, higher-order Greeks surfaces
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What it doesn't solve: anomalies on illiquid strikes are mostly fit noise. Use the liquidity-weighted version.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Generative models for vol path augmentation
&lt;/h2&gt;

&lt;p&gt;The 8-year intraday history sounds long until you condition on a joint state: negative dealer gamma, VRP above its 90th percentile, earnings week, VIX between 18 and 22. The sample count drops to single digits. Generative models synthesise realistic-but-novel paths to augment training in those undersampled regions.&lt;/p&gt;

&lt;p&gt;Reference: Wiese, Knobloch, Korn, Kretschmer, "Quant GANs" (2020); the architecture has since extended to TimeGAN, conditional GANs on surface tensors, and diffusion models on financial series.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;iter_market_minutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2018-04-16&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-01-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;grid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;surface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isoformat&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nf"&gt;surface_grid_to_tensor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What it doesn't solve: synthetic paths can't introduce tail behaviour that wasn't in the training set. A model trained on calm regimes will not invent a COVID-style crash. Generative augmentation expands the interior of your distribution, not its tails. Plan stress tests separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Graph neural nets on option chains
&lt;/h2&gt;

&lt;p&gt;The most speculative section. I include it because the data shape is right, not because industry adoption is strong. Contracts on the same underlying form a natural graph: strikes connect via butterflies, expirations via calendars, related underlyings (SPX/SPY, sector ETFs and constituents) via vol-of-vol relationships. A GNN with these structural priors can handle the whole surface jointly rather than slice by slice.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;chain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;option_quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2024-06-14T15:30:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# nodes = per-strike contracts; edges via moneyness/expiry proximity;
# messages carry IV and Greek information
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Worth reaching for cross-chain mispricing detection (SPX vs SPY drift, sector ETFs vs constituents) or research where the joint surface structure matters. It's a research direction, not a deployed methodology with a known PnL profile. Calibrate expectations accordingly.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Causal inference and event studies
&lt;/h2&gt;

&lt;p&gt;The most under-rated angle. Classical finance has decades of event-study methodology; modern ML adds heterogeneous treatment effect estimation (causal forests, X-learners, doubly-robust estimators give per-firm CATE rather than a single average), counterfactual surface construction (synthetic control on the surface tensor), and IV-crush prediction.&lt;/p&gt;

&lt;p&gt;A concrete flow: pull the surface around every earnings announcement in the window. Use trading-day offsets, not calendar-day, and align to the actual announcement timestamp (most issuers report before-open or after-close).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas_market_calendars&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;mcal&lt;/span&gt;
&lt;span class="n"&gt;nyse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mcal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_calendar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XNYS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;trading_days_before&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;sched&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nyse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;end_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sched&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;to_pydatetime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pull_pre_post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;announce_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;when_announced&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;pre_day&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;trading_days_before&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;announce_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;last_day&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;trading_days_before&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;announce_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;when_announced&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;before_open&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;post_day&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;announce_ts&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;post_day&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nyse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;valid_days&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;announce_ts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;announce_ts&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;pre&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;volatility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pre_day&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;T15:30:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;volatility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;last_day&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;T15:30:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;volatility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;post_day&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;T15:30:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Earnings and FOMC dates are well known; the matched surface state isn't, and that's the bottleneck. What it doesn't solve: rare-event causal estimates have wide error bars regardless of ML sophistication. The framework cleans up the analysis; it doesn't manufacture statistical power.&lt;/p&gt;

&lt;h2&gt;
  
  
  Leakage and point-in-time correctness
&lt;/h2&gt;

&lt;p&gt;The single most common reason ML-on-options papers don't replicate live: training labels built from end-of-day or settlement data that wouldn't have been known at the decision time. The model looks fine in cross-validation and loses money in paper trading. The cause is upstream of the model.&lt;/p&gt;

&lt;p&gt;The primitive against this is point-in-time replay. Every historical endpoint accepts &lt;code&gt;at=YYYY-MM-DDTHH:mm:ss&lt;/code&gt; and returns the response as it would have been computed at that minute. Feature construction is leak-free by default if you ask for features at t and labels at t+h using &lt;code&gt;at&lt;/code&gt; for both.&lt;/p&gt;

&lt;p&gt;Checklist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are your features as-of t or as-of t-1? Decide explicitly and verify.&lt;/li&gt;
&lt;li&gt;Are your labels computed using only data timestamped ≤ t + horizon, not back-revised?&lt;/li&gt;
&lt;li&gt;Are your regime labels from the same classifier across history, or did methodology drift?&lt;/li&gt;
&lt;li&gt;Does your hold-out split respect time (chronological), not random?&lt;/li&gt;
&lt;li&gt;Are event dates aligned to the announcement timestamp (before-open vs after-close)?&lt;/li&gt;
&lt;li&gt;Are you treating EOD-stamped fields (SVI, OI, macro) as as-of-most-recent-close, not as-of-minute t?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What ML on options won't solve
&lt;/h2&gt;

&lt;p&gt;The credibility section. Every quant ML engineer has met a vendor who claimed everything.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sub-second mid-quote prediction.&lt;/strong&gt; Market makers see the flow; you don't. The information asymmetry is structural.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regime change prediction.&lt;/strong&gt; Detection works. Change prediction does not, robustly. Detection plus position sizing is the honest play.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-asset macro.&lt;/strong&gt; Options data tells you about this underlying. Rates, credit, FX, commodities come from elsewhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Survivorship bias.&lt;/strong&gt; Cross-sectional ML on single-name options is biased toward winners that didn't get delisted. Index ETFs largely sidestep it; single-name work needs explicit handling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intraday SVI / OI / macro evolution.&lt;/strong&gt; EOD-stamped here. If your architecture requires minute-level SVI dynamics, this dataset is not it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Same response shape" for everything.&lt;/strong&gt; True for most analytics endpoints; not for optionquote, maxpain, or stock-summary macro objects. Write your client with awareness.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your project requires any of the above, this stack is part of the answer, not the whole answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The substrate, not the strategy
&lt;/h2&gt;

&lt;p&gt;Eight methodologies, grouped by maturity, mapped to verified endpoints. The honest pitch: this is the data substrate that compresses ML wall-clock from quarters to weeks. It does not manufacture alpha; it removes the pipeline tax. Pick the methodology that fits your research question, recognise that almost all require historical replay, and budget accordingly. For a single non-index equity sniff test, the free tier inspects response shapes. For real work you need the historical replay tier.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://flashalpha.com/articles/machine-learning-options-data-quant-strategies-guide" rel="noopener noreferrer"&gt;FlashAlpha Research&lt;/a&gt;. Free API key, no credit card: &lt;a href="https://flashalpha.com/pricing" rel="noopener noreferrer"&gt;flashalpha.com/pricing&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>quant</category>
      <category>python</category>
      <category>api</category>
    </item>
    <item>
      <title>Connect Claude to a live options-analytics API over MCP (the 2-endpoint gotcha)</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Fri, 29 May 2026 13:10:21 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/connect-claude-to-a-live-options-analytics-api-over-mcp-the-2-endpoint-gotcha-3e00</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/connect-claude-to-a-live-options-analytics-api-over-mcp-the-2-endpoint-gotcha-3e00</guid>
      <description>&lt;p&gt;FlashAlpha ships &lt;strong&gt;two&lt;/strong&gt; MCP endpoints with the same tool catalogue but different auth, and picking the wrong one is the single most common setup failure. This walks both paths and the errors you will actually hit.&lt;/p&gt;

&lt;p&gt;FlashAlpha exposes 40 tools over the Model Context Protocol (23 live, 17 historical-replay), so you can ask Claude about gamma exposure, dealer positioning, volatility surfaces and Greeks in plain English instead of hand-rolling REST calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which endpoint?
&lt;/h2&gt;

&lt;p&gt;Same tools on both. Different authentication. Match the row to the client you are configuring.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Client&lt;/th&gt;
&lt;th&gt;URL&lt;/th&gt;
&lt;th&gt;Auth&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;claude.ai (web)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://lab.flashalpha.com/mcp-oauth&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OAuth (one-time sign-in)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Desktop&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;https://lab.flashalpha.com/mcp-oauth&lt;/code&gt; (current builds) or &lt;code&gt;https://lab.flashalpha.com/mcp&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;OAuth, or API key on older builds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code (CLI)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://lab.flashalpha.com/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;API key per tool call&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursor / Windsurf / VS Code&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://lab.flashalpha.com/mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;API key per tool call&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The one rule: &lt;strong&gt;claude.ai web and current Claude Desktop builds use the &lt;code&gt;-oauth&lt;/code&gt; endpoint and OAuth sign-in.&lt;/strong&gt; The CLI and editor clients (Claude Code, Cursor, Windsurf, VS Code) use the plain &lt;code&gt;/mcp&lt;/code&gt; endpoint and you hand Claude the key in your first message. If your Desktop build is old enough that OAuth fails, fall back to &lt;code&gt;/mcp&lt;/code&gt; and the apiKey path below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 1: OAuth (claude.ai web or Claude Desktop)
&lt;/h2&gt;

&lt;p&gt;Cleanest setup. Sign in once, click Allow, and Claude calls tools on your behalf with no key handling. Works on Free, Pro, Max, Team and Enterprise.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://claude.ai" rel="noopener noreferrer"&gt;claude.ai&lt;/a&gt; and sign in.&lt;/li&gt;
&lt;li&gt;Your name (bottom-left) then &lt;strong&gt;Settings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customize&lt;/strong&gt; then &lt;strong&gt;Connectors&lt;/strong&gt;. On Team/Enterprise the workspace owner adds connectors under &lt;em&gt;Organization settings then Connectors&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;+&lt;/strong&gt; then &lt;strong&gt;Add custom connector&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Fill in the dialog:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name:&lt;/strong&gt; &lt;code&gt;FlashAlpha&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote MCP server URL:&lt;/strong&gt; &lt;code&gt;https://lab.flashalpha.com/mcp-oauth&lt;/code&gt;. The &lt;code&gt;-oauth&lt;/code&gt; suffix is required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced settings:&lt;/strong&gt; leave empty. FlashAlpha uses Dynamic Client Registration, so Claude registers itself. No client ID or secret to paste.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add&lt;/strong&gt;, then &lt;strong&gt;Connect&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Sign in on the FlashAlpha page and click &lt;strong&gt;Allow&lt;/strong&gt;. If you are already signed in to flashalpha.com in the same browser, you skip straight to consent.&lt;/li&gt;
&lt;li&gt;You land back in Claude and the connector flips to &lt;strong&gt;Connected&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On Desktop the only difference is the callback: you get an "Open Claude?" browser dialog that deep-links back into the app. Click &lt;strong&gt;Open Claude&lt;/strong&gt;. That is expected, not an error.&lt;/p&gt;

&lt;p&gt;Verify with a new chat: &lt;em&gt;"What is my FlashAlpha account?"&lt;/em&gt; Claude calls &lt;code&gt;get_account&lt;/code&gt; and returns your email, tier and remaining quota.&lt;/p&gt;

&lt;p&gt;Your API key never appears in Claude on this path. The OAuth resource server resolves your account from the bearer token and forwards your stored key on the internal upstream call only.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 2: apiKey (Desktop, Cursor, Windsurf, VS Code, Claude Code CLI)
&lt;/h2&gt;

&lt;p&gt;Here each tool takes an &lt;code&gt;apiKey&lt;/code&gt; argument. Two steps: register the URL, then tell Claude the key once per chat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Desktop config:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;macOS: &lt;code&gt;~/Library/Application Support/Claude/claude_desktop_config.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Windows: &lt;code&gt;%APPDATA%\Claude\claude_desktop_config.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"flashalpha"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://lab.flashalpha.com/mcp"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save, then &lt;strong&gt;fully quit and reopen&lt;/strong&gt; Claude Desktop. A reload is not enough; the config is read once at startup.&lt;/p&gt;

&lt;p&gt;First message in a fresh chat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;My FlashAlpha API key is fa_xxxxxxxxxxxxxxxxxxxxxxxx.
Use it on every FlashAlpha tool call.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude holds the key for the session and passes it as &lt;code&gt;apiKey&lt;/code&gt; on every call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Other clients, same &lt;code&gt;/mcp&lt;/code&gt; URL and same chat-paste pattern:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Claude Code CLI&lt;/span&gt;
claude mcp add flashalpha &lt;span class="nt"&gt;--transport&lt;/span&gt; http https://lab.flashalpha.com/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Cursor: &lt;em&gt;Settings then MCP Servers then Add Server&lt;/em&gt;. Name &lt;code&gt;flashalpha&lt;/code&gt;, URL &lt;code&gt;https://lab.flashalpha.com/mcp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Windsurf: &lt;em&gt;Cascade then MCP then Add Server&lt;/em&gt;, paste the same URL.&lt;/li&gt;
&lt;li&gt;VS Code (Copilot / Continue): add &lt;code&gt;{ "url": "https://lab.flashalpha.com/mcp" }&lt;/code&gt; to your MCP settings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why is the key not in the config? Claude Desktop's HTTP-transport MCP config only supports a URL. There is no &lt;code&gt;env&lt;/code&gt; or &lt;code&gt;headers&lt;/code&gt; pass-through that maps to a tool argument, and the key is a per-tool argument. So it comes from the conversation, or you skip it entirely with the OAuth endpoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"MCP Server not responding" on claude.ai.&lt;/strong&gt; You pasted &lt;code&gt;/mcp&lt;/code&gt; into a custom-connector dialog that needs OAuth. The &lt;code&gt;/mcp&lt;/code&gt; endpoint expects an &lt;code&gt;apiKey&lt;/code&gt; argument the browser flow never sends, so the first call hangs. Edit the connector URL to exactly &lt;code&gt;https://lab.flashalpha.com/mcp-oauth&lt;/code&gt; and reconnect. This is the one nearly everyone hits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"A server with this URL already exists" but nothing shows in your Connectors list.&lt;/strong&gt; Claude.ai recorded the URL during an earlier handshake that failed mid-flow. Try, in order: hard-refresh (Ctrl/Cmd+Shift+R) and retry Add; open claude.ai in an incognito window and Add from there; sign out and back in. If all three still error, send Anthropic support the &lt;code&gt;ofid_...&lt;/code&gt; reference from the original failure and ask them to clear the orphaned record.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"A server with this URL already exists" and FlashAlpha is visible.&lt;/strong&gt; Close the dialog, click the existing entry, use &lt;strong&gt;Connect&lt;/strong&gt; / &lt;strong&gt;Reconnect&lt;/strong&gt;. If stuck, delete from the &lt;strong&gt;...&lt;/strong&gt; menu and re-add.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"apiKey is required" on Desktop.&lt;/strong&gt; Config is fine, Claude just has not been told the key in this chat. Paste it as your first message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Unauthorized" after hours of working.&lt;/strong&gt; Token expired before refresh. Settings then Connectors then FlashAlpha then &lt;strong&gt;Reconnect&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP 429.&lt;/strong&gt; Daily quota hit (Free 5/day, Basic 100, Growth 2,500, Alpha unlimited). Reset is midnight UTC, or upgrade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"no_data" on &lt;code&gt;get_gex&lt;/code&gt;, &lt;code&gt;get_levels&lt;/code&gt;, &lt;code&gt;get_volatility&lt;/code&gt;.&lt;/strong&gt; Markets are closed. Not a connector bug. Retry during US market hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desktop ignores the new config.&lt;/strong&gt; You reloaded instead of quitting. Cmd-Q on macOS, tray then Quit on Windows, then relaunch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get once it is green
&lt;/h2&gt;

&lt;p&gt;All 23 live tools work immediately. Highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exposure:&lt;/strong&gt; &lt;code&gt;get_gex&lt;/code&gt;, &lt;code&gt;get_dex&lt;/code&gt;, &lt;code&gt;get_vex&lt;/code&gt;, &lt;code&gt;get_levels&lt;/code&gt;, &lt;code&gt;get_exposure_summary&lt;/code&gt;, &lt;code&gt;get_narrative&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Volatility and pricing:&lt;/strong&gt; &lt;code&gt;get_volatility&lt;/code&gt;, &lt;code&gt;get_stock_summary&lt;/code&gt;, &lt;code&gt;calculate_greeks&lt;/code&gt;, &lt;code&gt;solve_iv&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Market data:&lt;/strong&gt; &lt;code&gt;get_stock_quote&lt;/code&gt;, &lt;code&gt;get_tickers&lt;/code&gt;, &lt;code&gt;get_option_chain&lt;/code&gt;, &lt;code&gt;get_account&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Historical replay&lt;/strong&gt; (Alpha tier): 17 tools that mirror the live ones with an &lt;code&gt;at=&amp;lt;timestamp&amp;gt;&lt;/code&gt; argument back to April 2018&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Four one-click workflow prompts also surface in the client UI: &lt;code&gt;analyze_exposure(symbol)&lt;/code&gt;, &lt;code&gt;vrp_regime_check(symbol)&lt;/code&gt;, &lt;code&gt;historical_comparison(symbol, reference_date)&lt;/code&gt; and &lt;code&gt;zero_dte_brief(symbol)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A good first prompt: &lt;em&gt;"Show me the gamma exposure for SPY and tell me where the gamma flip is."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Free tier needs only an email and password, no card: &lt;a href="https://flashalpha.com/pricing" rel="noopener noreferrer"&gt;flashalpha.com/pricing&lt;/a&gt;. The same key works on both endpoints.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>claude</category>
      <category>ai</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>FlashAlpha vs Quant Data: What an AI Agent Can Actually Reason Over</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Wed, 27 May 2026 13:39:00 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/flashalpha-vs-quant-data-what-an-ai-agent-can-actually-reason-over-39ki</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/flashalpha-vs-quant-data-what-an-ai-agent-can-actually-reason-over-39ki</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure up front: I work on FlashAlpha. The factual claims are checkable against &lt;a href="https://quantdata.us/api/docs" rel="noopener noreferrer"&gt;quantdata.us/api/docs&lt;/a&gt; and &lt;a href="https://lab.flashalpha.com/swagger" rel="noopener noreferrer"&gt;lab.flashalpha.com/swagger&lt;/a&gt; as of 2026-05-27. The framing is opinion.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quant Data and FlashAlpha both publish themselves as real-time options analytics platforms with REST APIs and native MCP servers. From a feature-list distance they look like they compete head-to-head. They do not. They were architected for different classes of user and they expose fundamentally different data layers.&lt;/p&gt;

&lt;p&gt;This is the comparison the way a senior engineer would explain it to a colleague evaluating both.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one-sentence framing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Quant Data is a trader workstation with an API attached. FlashAlpha is an API-first quant analytics engine with a UI attached.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That sentence does most of the work. Both platforms read the same underlying market data and both expose a REST surface plus an MCP server, so a checklist will produce overlap. The interesting comparison is not which checkbox each one ticks. It is which class of problem each platform was built to solve, and what that decision implies for everything downstream.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Quant Data&lt;/th&gt;
&lt;th&gt;FlashAlpha&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Primary product&lt;/td&gt;
&lt;td&gt;Hosted dashboard (web, iOS, Android) with 30+ tools; REST API on top&lt;/td&gt;
&lt;td&gt;REST API + MCP server; companion per-ticker pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Design philosophy&lt;/td&gt;
&lt;td&gt;Trader workflow platform&lt;/td&gt;
&lt;td&gt;Quantitative analytics infrastructure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Greeks coverage&lt;/td&gt;
&lt;td&gt;First-order Greek-weighted exposures (delta, gamma, vega)&lt;/td&gt;
&lt;td&gt;First-order plus second-order (VEX, CHEX) with published 8-year backtest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Volatility surfaces&lt;/td&gt;
&lt;td&gt;Vol skew, term structure, IV rank&lt;/td&gt;
&lt;td&gt;Full SVI calibration, arbitrage-free constraints, sampleable smiles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flow scoring&lt;/td&gt;
&lt;td&gt;Flow analytics endpoints (Net Drift, Net Flow)&lt;/td&gt;
&lt;td&gt;Six-component composite with &lt;code&gt;score_breakdown&lt;/code&gt; in every response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open/close inference&lt;/td&gt;
&lt;td&gt;OI snapshots and changes&lt;/td&gt;
&lt;td&gt;Per-contract OI simulator, 0.43 confidence weight, daily calibration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dealer positioning&lt;/td&gt;
&lt;td&gt;Greek-weighted exposure series&lt;/td&gt;
&lt;td&gt;Positive vs negative gamma regime, flip-level computation, regime-conditioned VRP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing entry&lt;/td&gt;
&lt;td&gt;$124.99/mo annual, non-pro, personal use only&lt;/td&gt;
&lt;td&gt;Free 5 req/day; Basic $63/mo annual; commercial use allowed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best fit&lt;/td&gt;
&lt;td&gt;Discretionary traders who want a polished UI + mobile&lt;/td&gt;
&lt;td&gt;Quants, devs, fintech apps, AI agents consuming derived state&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What each platform actually is
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Quant Data
&lt;/h3&gt;

&lt;p&gt;A real-time options market intelligence platform built around a hosted dashboard. Web app plus native iOS and Android with drag-and-drop layouts and 30+ trading tools. A REST API exposes the same feeds programmatically, and an MCP server lets ChatGPT, Claude, Cursor, Gemini, and custom agents call it as a typed tool. The standard plan is gated to non-professionals with "personal use only" and no external redistribution.&lt;/p&gt;

&lt;p&gt;What you get: a polished dashboard product, 23 options endpoints, 6 equity endpoints, real-time alerts, and an MCP server. The data is the polished, finished feed; the API mirrors what the dashboard shows.&lt;/p&gt;

&lt;h3&gt;
  
  
  FlashAlpha
&lt;/h3&gt;

&lt;p&gt;An options quantitative analytics engine that ships as a REST API and an MCP server, with a companion site that surfaces the same analytics visually. The endpoints cover the same raw-flow territory Quant Data does, but the centre of gravity is one layer up: derived market state. Dealer-positioning regimes, second-order exposures, full SVI-calibrated arbitrage-free volatility surfaces, VRP series, an OI simulator that emits effective open interest in near real time, 0DTE analytics keyed on intraday gamma regime, and a six-component scored flow signal with the formula breakdown returned in every response.&lt;/p&gt;

&lt;p&gt;What you get: a documented REST API, SDKs in Python, JavaScript/TypeScript, C#, Go, and Java, an MCP server at &lt;code&gt;lab.flashalpha.com/mcp&lt;/code&gt; with typed tools for every endpoint, an OpenAPI playground at &lt;code&gt;lab.flashalpha.com/swagger&lt;/code&gt;, and methodology articles covering every derived value. No native mobile app, no flagship dashboard. The API is the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Quant Data does genuinely well
&lt;/h2&gt;

&lt;p&gt;This is the section that earns the article credibility. If a vendor-vs-vendor piece only critiques the competitor, the reader correctly discounts it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Polished trader workflow.&lt;/strong&gt; Drag-and-drop layouts, iOS and Android apps, real-time alerts, exchange notifications, a clean UI for flow monitoring. Serious product surface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dark pool visibility.&lt;/strong&gt; Dark Flow, Dark Pool Levels, Equity Prints, and exchange notifications are first-class endpoints.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API ergonomics.&lt;/strong&gt; The "many shapes, one operation" filter design (case-insensitive field names, shorthand and full-name operators, scalar or array values interchangeably) is a developer-experience win.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solid infrastructure positioning.&lt;/strong&gt; Published 240 req/min rate limit, 99.99% uptime SLA, 365+ day historical lookback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native MCP support.&lt;/strong&gt; They shipped MCP-as-typed-tools early and deserve credit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discretionary-trader fit.&lt;/strong&gt; The product is honestly built for a human in the loop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this is a hedge. Quant Data is a well-built trader platform. The question is whether it is the right product for a different class of problem, the one FlashAlpha was built to solve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Flow data vs derived intelligence: the centerpiece distinction
&lt;/h2&gt;

&lt;p&gt;Most options APIs expose what an options market &lt;em&gt;did&lt;/em&gt;: trades, chains, sweeps, exposure snapshots, raw activity. This is necessary and useful. It is also one layer below where systematic strategies actually need to operate.&lt;/p&gt;

&lt;p&gt;FlashAlpha exposes that same raw flow, but also surfaces a layer above it: what the options market &lt;em&gt;is&lt;/em&gt;, in structural terms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typical options API surface (activity):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Order flow prints, options chains with first-order Greeks&lt;/li&gt;
&lt;li&gt;Sweep and block tags&lt;/li&gt;
&lt;li&gt;Exposure by strike and expiration&lt;/li&gt;
&lt;li&gt;Max pain, IV rank, vol skew snapshots&lt;/li&gt;
&lt;li&gt;Dark pool prints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;FlashAlpha's additional layer (structure):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dealer-positioning regime classification (positive vs negative gamma)&lt;/li&gt;
&lt;li&gt;VEX (vanna exposure) and CHEX (charm exposure) series&lt;/li&gt;
&lt;li&gt;SVI-calibrated arbitrage-free volatility surfaces&lt;/li&gt;
&lt;li&gt;VRP, regime-conditioned and directional&lt;/li&gt;
&lt;li&gt;Effective open interest from an intraday OI simulator&lt;/li&gt;
&lt;li&gt;Six-component scored flow signals with &lt;code&gt;score_breakdown&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Gamma flip levels and exposure concentration zones&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Activity tells you what just happened. Structural data tells you what regime the market is in. Both matter; they are not substitutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quantitative differentiators
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Second-order exposures: VEX and CHEX
&lt;/h3&gt;

&lt;p&gt;Quant Data's exposure endpoints are Greek-weighted by first-order Greeks (delta, gamma, sometimes vega). Standard treatment, correct for most flow-monitoring use cases.&lt;/p&gt;

&lt;p&gt;FlashAlpha additionally surfaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VEX (vanna exposure):&lt;/strong&gt; sensitivity of dealer delta to implied volatility changes. Useful for vol-crush behaviour around earnings, dealer hedging shifts when vol moves, and regime transitions where the second-order term dominates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CHEX (charm exposure):&lt;/strong&gt; time-decay impact on dealer delta positioning. Useful for intraday drift, expiry effects (OPEX, quarterly), 0DTE dynamics, overnight roll-over.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;FlashAlpha published an &lt;a href="https://flashalpha.com/articles/gex-dex-vex-chex-8-year-backtest-spy-vix-control" rel="noopener noreferrer"&gt;8-year backtest of GEX/DEX/VEX/CHEX as predictors of SPY returns and VIX changes&lt;/a&gt;. Most retail-focused platforms do not surface these in a usable form.&lt;/p&gt;

&lt;h3&gt;
  
  
  Arbitrage-free volatility surfaces (SVI)
&lt;/h3&gt;

&lt;p&gt;Quant Data exposes vol skew, term structure, IV rank, IV percentile. Standard.&lt;/p&gt;

&lt;p&gt;FlashAlpha exposes the full underlying surface infrastructure. SVI (Stochastic Volatility Inspired) calibrations per expiration with arbitrage-free constraints (no calendar arbitrage, no butterfly arbitrage), smile parameterisation that can be sampled at any strike or moneyness, term-structure interpolation, and the underlying liquidity-filtered fit data.&lt;/p&gt;

&lt;p&gt;This matters for any workflow that consumes IV as a primary input: backtesting, signal generation off skew dynamics, options pricing models, variance trading, ML features built from surface shape rather than snapshot points.&lt;/p&gt;

&lt;h3&gt;
  
  
  Volatility risk premium (VRP)
&lt;/h3&gt;

&lt;p&gt;VRP is the gap between implied volatility and realised volatility. It is the central premium that systematic options strategies harvest. Quant Data does not surface a published VRP endpoint in their API documentation as of writing.&lt;/p&gt;

&lt;p&gt;FlashAlpha publishes VRP as a first-class derived value in several conditioned forms: base VRP across the universe, GEX-conditioned (segmented by dealer-positioning regime), directional (put vs call decomposition), and a VRP-driven strategy scoring endpoint.&lt;/p&gt;

&lt;h3&gt;
  
  
  OI simulator and effective open interest
&lt;/h3&gt;

&lt;p&gt;The OPRA tape carries the side of every trade but not whether it opens or closes a position. That information lives at the clearing firm and reaches the tape the next morning as a settled OI broadcast.&lt;/p&gt;

&lt;p&gt;Quant Data exposes the standard daily OI snapshots and changes. Same data the rest of the industry consumes.&lt;/p&gt;

&lt;p&gt;FlashAlpha runs a per-contract OI simulator that maintains a running signed intraday delta against the OPRA broadcast. The simulator's per-trade confidence weight is &lt;strong&gt;0.43&lt;/strong&gt;, calibrated daily against next-morning settled OI residuals. The output is an effective open interest field that updates intraday, which is what lets FlashAlpha compute live GEX from flow rather than only end-of-day settled GEX.&lt;/p&gt;

&lt;p&gt;For systematic strategies that care about intraday regime shifts, this is the difference between operating on yesterday's positioning and today's.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scoring transparency
&lt;/h3&gt;

&lt;p&gt;FlashAlpha's Flow Signals endpoint returns a six-component composite score with the full &lt;code&gt;score_breakdown&lt;/code&gt; in every response. Components: premium (log-normalised), size-vs-OI (ratio), aggressor strength (NBBO-position + side), sweep structure (sweep/block/single), opening bias (OI simulator output, 0.43 weight), tenor (linear decay to 45 DTE). Default weights and formulas are documented. The breakdown reconstructs the composite within rounding.&lt;/p&gt;

&lt;p&gt;Quant Data's order flow endpoints surface Net Drift, Net Flow, and Contract Statistics without a documented composite formula. Fine for a finished-signal product; a different choice from audit-trail-by-default.&lt;/p&gt;

&lt;h2&gt;
  
  
  The MCP / agent angle
&lt;/h2&gt;

&lt;p&gt;Both platforms ship native MCP servers. The interesting question is not whether a platform has an MCP surface but what shape the data is in when an agent consumes it.&lt;/p&gt;

&lt;p&gt;LLMs reason well over compact, structured, derived values and poorly over voluminous raw data. Handing an agent a 3,000-row chain JSON and asking it to compute exposures, fit a surface, or derive a regime is a misuse of the tool. There is no clean closed-form path from "here is the chain" to "this market is in a negative-gamma regime with VRP three standard deviations above the GEX-conditioned mean."&lt;/p&gt;

&lt;p&gt;An agent &lt;em&gt;can&lt;/em&gt; reason cleanly over precomputed derived state:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"What is the current gamma regime for SPX?" → one field, one value, one decision branch.&lt;/li&gt;
&lt;li&gt;"Is VRP elevated relative to its GEX-conditioned distribution?" → one signal, segmented by regime.&lt;/li&gt;
&lt;li&gt;"List the top-5 scored unusual flow signals on NVDA today, with &lt;code&gt;score_breakdown&lt;/code&gt;." → structured, bounded, auditable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;FlashAlpha was designed assuming a non-trivial fraction of consumers would be machines rather than humans. The derived analytics layer is the surface area an AI agent actually wants. The raw chain is available, but it is not the primary product.&lt;/p&gt;

&lt;p&gt;Quant Data's MCP server exposes the same data layer as the dashboard: flow feeds, exposure snapshots, dark pool prints. For a workflow that wants an agent to surface what a trader would see, this is well-suited. For a workflow that wants an agent to reason over structural market state, the derived layer matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ideal use cases
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use case&lt;/th&gt;
&lt;th&gt;Better fit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Discretionary options flow trading from a dashboard&lt;/td&gt;
&lt;td&gt;Quant Data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mobile options flow monitoring (iOS, Android)&lt;/td&gt;
&lt;td&gt;Quant Data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dark pool prints and exchange notification feeds&lt;/td&gt;
&lt;td&gt;Quant Data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quantitative research on dealer positioning&lt;/td&gt;
&lt;td&gt;FlashAlpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Systematic volatility strategies (VRP harvest, variance, dispersion)&lt;/td&gt;
&lt;td&gt;FlashAlpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backtesting on second-order exposures (VEX, CHEX)&lt;/td&gt;
&lt;td&gt;FlashAlpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Building ML features from surface shape&lt;/td&gt;
&lt;td&gt;FlashAlpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live GEX/DEX from flow (intraday regime detection)&lt;/td&gt;
&lt;td&gt;FlashAlpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0DTE intraday gamma regime modelling&lt;/td&gt;
&lt;td&gt;FlashAlpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI / LLM agents reasoning over derived market state&lt;/td&gt;
&lt;td&gt;FlashAlpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API-first integration into a fintech app&lt;/td&gt;
&lt;td&gt;FlashAlpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audit-trail scored unusual flow signals&lt;/td&gt;
&lt;td&gt;FlashAlpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free tier with no credit card for evaluation&lt;/td&gt;
&lt;td&gt;FlashAlpha (5 req/day)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If your workflow centres on visual flow monitoring in a polished dashboard, Quant Data is the better fit and there is no shame in it. If it centres on systematic strategies, derived market state, or agent-driven automation, FlashAlpha is the better fit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing (2026-05-27)
&lt;/h2&gt;

&lt;p&gt;Quant Data's standard plan is explicitly marked "Non-professionals only" and "Personal use only. Not for external redistribution." If you are building a commercial product, a fintech app, or anything that redistributes data downstream, you need their enterprise tier (contact sales).&lt;/p&gt;

&lt;p&gt;FlashAlpha's paid tiers allow commercial use directly. Free (5 req/day, no card), Basic $63/mo annual (100 req/day), Growth $239/mo annual (2,500 req/day), Alpha $1,199/mo annual (unlimited, full derived analytics + historical replay).&lt;/p&gt;

&lt;p&gt;The right comparison is per-workflow, not per-dollar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the two genuinely overlap
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Raw flow ingest, sweep/block tagging&lt;/li&gt;
&lt;li&gt;First-order Greek-weighted exposure series&lt;/li&gt;
&lt;li&gt;IV rank, percentile, vol skew&lt;/li&gt;
&lt;li&gt;Max pain&lt;/li&gt;
&lt;li&gt;Native MCP for agents&lt;/li&gt;
&lt;li&gt;Well-documented REST surfaces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your workflow only uses the overlap surface, the two are closer to substitutes than this article suggests, and the choice should come down to pricing, ergonomics, and UI. The thesis here is that workflows that &lt;em&gt;only&lt;/em&gt; use the overlap surface are leaving the more interesting half of options analytics on the table.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one sentence
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;FlashAlpha is designed to expose quantitative market structure, not just market activity.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If that sentence describes the layer your strategy or product needs, FlashAlpha is the right fit. If it doesn't, Quant Data may genuinely be the better-fit product for what you are doing, and that is a legitimate outcome.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full article with FAQ, deeper methodology, and links to the published backtests on the &lt;a href="https://flashalpha.com/articles/flashalpha-vs-quantdata-quant-infrastructure-vs-trader-platform" rel="noopener noreferrer"&gt;canonical version&lt;/a&gt;. Free API key (5 req/day, no card) at &lt;a href="https://flashalpha.com/pricing" rel="noopener noreferrer"&gt;flashalpha.com/pricing&lt;/a&gt;. OpenAPI playground at &lt;a href="https://lab.flashalpha.com/swagger" rel="noopener noreferrer"&gt;lab.flashalpha.com/swagger&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>mcp</category>
      <category>ai</category>
      <category>options</category>
    </item>
  </channel>
</rss>
