<?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>How Much Does IV Drop After Earnings? Real Crush Numbers by Name</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Tue, 04 Aug 2026 07:54:53 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/how-much-does-iv-drop-after-earnings-real-crush-numbers-by-name-4ifc</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/how-much-does-iv-drop-after-earnings-real-crush-numbers-by-name-4ifc</guid>
      <description>&lt;p&gt;If you are asking &lt;strong&gt;how much does IV drop after earnings&lt;/strong&gt;, the honest answer is: it depends on the name, and the difference is measurable. This post puts real numbers on earnings IV crush using event-history data, then explains the mechanics that make META's crush three times NVDA's.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IV crush, defined in one paragraph:&lt;/strong&gt; implied volatility before earnings contains a one-time jump premium for the announcement. The moment results are out, that uncertainty is resolved and the jump premium evaporates - ATM implied volatility drops discontinuously, typically at the next open. The size of the drop is the share of total option-implied variance that the event itself represented.&lt;/p&gt;

&lt;h2&gt;
  
  
  The measured distributions
&lt;/h2&gt;

&lt;p&gt;From &lt;code&gt;GET /v1/earnings/iv-crush/{symbol}&lt;/code&gt; on 2026-08-03, which returns the live expected-crush estimate plus the distribution over up to 20 past events:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symbol&lt;/th&gt;
&lt;th&gt;Median crush&lt;/th&gt;
&lt;th&gt;P25&lt;/th&gt;
&lt;th&gt;P75&lt;/th&gt;
&lt;th&gt;Best event&lt;/th&gt;
&lt;th&gt;Events&lt;/th&gt;
&lt;th&gt;Next earnings&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;META&lt;/td&gt;
&lt;td&gt;42.5%&lt;/td&gt;
&lt;td&gt;41.0%&lt;/td&gt;
&lt;td&gt;43.4%&lt;/td&gt;
&lt;td&gt;46.5%&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;2026-10-27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AAPL&lt;/td&gt;
&lt;td&gt;23.2%&lt;/td&gt;
&lt;td&gt;20.4%&lt;/td&gt;
&lt;td&gt;27.5%&lt;/td&gt;
&lt;td&gt;28.6%&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;2026-10-28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NVDA&lt;/td&gt;
&lt;td&gt;14.8%&lt;/td&gt;
&lt;td&gt;14.1%&lt;/td&gt;
&lt;td&gt;15.5%&lt;/td&gt;
&lt;td&gt;16.8%&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2026-08-26&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Crush here is the percentage drop in ATM IV from the last pre-event reading to the first post-event reading, front expiry.&lt;/p&gt;

&lt;p&gt;Honest footnotes: the samples are the platform's covered event history (four to six events per name at the time of writing, growing each quarter), and a zero in a distribution's worst column - both AAPL and META carry one - marks an event where the measured crush did not materialise in the data. The interquartile range is the robust read, not the extremes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why META crushes 3x harder than NVDA
&lt;/h2&gt;

&lt;p&gt;Pre-event IV is a blend of two components: baseline diffusion (the vol the stock runs on ordinary days) and the event jump. The crush percentage is essentially the event's share of total implied variance. Two things drive it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How large the expected jump is relative to baseline vol.&lt;/strong&gt; META's post-earnings moves have repeatedly been double-digit percent against a baseline vol in the 30s - the event dominates the front expiry, so resolving it removes most of the IV. NVDA runs a high baseline vol (around 37% in early August 2026, three weeks before its report) with an implied move that is large in dollars but smaller &lt;em&gt;relative to that baseline&lt;/em&gt;, so the event share - and the crush - is smaller.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Days to expiry at the event.&lt;/strong&gt; The shorter the expiry, the larger the event's share of remaining variance, the more violent the crush. Weeklies crush hardest; a 60-day option barely notices.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The expected-move endpoint performs exactly this decomposition - splitting the front-expiry straddle into jump and diffusion using the pre/post-event term structure - which is what makes a live crush estimate possible before the event.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ramp: expected crush grows into the event
&lt;/h2&gt;

&lt;p&gt;Three weeks before NVDA's 2026-08-26 report, the live estimate read a modest expected crush (about 4% at the front expiry, pre-IV 42.5 against post-IV 40.8) - far below the 15% the distribution says the event delivers.&lt;/p&gt;

&lt;p&gt;That is not a contradiction; it is the ramp. Event variance concentrates into the front expiry as the calendar rolls toward the report: with three weeks of ordinary trading days still in the expiry, the jump is a small share of total variance. By the week of the event, the front expiry is mostly jump, and the expected crush converges toward the historical distribution.&lt;/p&gt;

&lt;p&gt;Watching the live estimate ramp against the historical median is the cleanest way to see whether this quarter's event premium is building rich or cheap relative to the name's own history.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trading implications, honestly stated
&lt;/h2&gt;

&lt;p&gt;Crush is not free money. The stock moves at the same moment the IV collapses, and whether short-premium structures win depends on implied vs realised move, not on the existence of crush. Measured separately across 70 events: the median event harvested a third of the implied move with a 67% win rate and a fat left tail.&lt;/p&gt;

&lt;p&gt;The per-name crush distribution adds the structure-selection layer. Names with large, reliable crush and modest realised moves favour short-vega structures; names where the crush is small relative to gap risk favour defined-risk or long-gamma-into-ramp structures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pulling it yourself
&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;requests&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;sym&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;AAPL&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;META&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;NVDA&lt;/span&gt;&lt;span class="sh"&gt;"&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;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="s"&gt;https://lab.flashalpha.com/v1/earnings/iv-crush/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;sym&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="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;KEY&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;est&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;current_estimate&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;distribution&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;sym&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;earnings_date&lt;/span&gt;&lt;span class="sh"&gt;"&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;expected &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;est&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;expected_crush_pct&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;median &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dist&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;median&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;%  p25 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dist&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;p25&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;  p75 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dist&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;p75&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;Per-event detail - EPS and revenue surprises, implied vs actual moves, realised crush per event - comes from the companion &lt;code&gt;/v1/earnings/history/{symbol}&lt;/code&gt; endpoint, and the upcoming calendar from &lt;code&gt;/v1/earnings/calendar&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;How much does IV drop after earnings on average?&lt;/strong&gt;&lt;br&gt;
Across the names measured here, median crush ranges from about 15% (NVDA) through 23% (AAPL) to 43% (META) of pre-event ATM IV at the front expiry. There is no useful single average: the number is a per-name property driven by the event's share of total implied variance, and it is stable enough per name to be worth looking up rather than guessing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When exactly does IV crush happen?&lt;/strong&gt;&lt;br&gt;
At the resolution of the uncertainty: effectively instantaneous at the first quotes after the announcement (the next open for after-close reporters). The decay &lt;em&gt;into&lt;/em&gt; the event is a separate, slower effect - the jump premium itself holds until the news is out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can you profit from IV crush by selling options before earnings?&lt;/strong&gt;&lt;br&gt;
Only when the implied move overprices the realised move - the crush and the gap arrive together. The measured base rate: about two-thirds of events pay the seller something, the median event pays a third of the implied move, and the tail events cost multiples of it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does IV crush affect all expirations equally?&lt;/strong&gt;&lt;br&gt;
No. Crush concentrates in the front expiry, where the event is the dominant share of remaining variance. Back-month IV barely moves, which is why calendar structures are one of the standard earnings expressions and why measuring crush requires expiry-matched pre/post readings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;IV crush is real, large, and - the part almost nobody quantifies - radically different across names: the same mega-cap quarter produced a 15% median crush in NVDA and a 43% median crush in META. The distribution for any covered name is one API call, and the live estimate ramps against it into each event.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://flashalpha.com/articles/how-much-does-iv-drop-after-earnings-real-crush-numbers" rel="noopener noreferrer"&gt;flashalpha.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>finance</category>
      <category>api</category>
      <category>data</category>
    </item>
    <item>
      <title>Gamma Scalping: The Complete Guide to Delta-Hedged Straddle P&amp;L</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Tue, 04 Aug 2026 07:54:41 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/gamma-scalping-the-complete-guide-to-delta-hedged-straddle-pl-ogo</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/gamma-scalping-the-complete-guide-to-delta-hedged-straddle-pl-ogo</guid>
      <description>&lt;p&gt;If you searched for &lt;strong&gt;gamma scalping&lt;/strong&gt; - or for why your delta-hedged straddle made money on a day the market barely closed changed - this is the complete mechanical picture: the identity, the breakeven, the hedging tradeoffs, the entry conditions, and the data to run it on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gamma scalping, defined in one paragraph:&lt;/strong&gt; gamma scalping is delta-hedging a long-gamma options position (typically an ATM straddle) so that each move in the underlying forces profitable re-hedges - buying dips and selling rips mechanically - while paying theta for the privilege. It converts an options position into a trade of realised volatility against the implied volatility you paid.&lt;/p&gt;

&lt;h2&gt;
  
  
  The identity that runs the whole strategy
&lt;/h2&gt;

&lt;p&gt;Delta-hedge a long option continuously and the direction drops out. What remains, per small time step, is the canonical P&amp;amp;L decomposition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dP&amp;amp;L ≈ ½ Γ S² (σ²realised − σ²implied) dt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read it term by term. &lt;strong&gt;½ΓS²&lt;/strong&gt; is dollar gamma - how much delta the position manufactures per squared move. The bracket is the &lt;strong&gt;variance spread&lt;/strong&gt; - realised variance delivered minus implied variance paid (the theta you bleed is the implied leg).&lt;/p&gt;

&lt;p&gt;Everything about gamma scalping falls out of this line. You are not "trading options"; you are long realised variance and short implied variance, sized by dollar gamma. The strategy wins if, and only if, the underlying realises more than the options implied over the holding period. Re-hedging is merely the collection mechanism.&lt;/p&gt;

&lt;p&gt;The same identity with the sign flipped is every premium seller's income statement, which is why realised vs implied is the spread that runs the entire volatility complex.&lt;/p&gt;

&lt;h2&gt;
  
  
  The breakeven, with live numbers
&lt;/h2&gt;

&lt;p&gt;The intuitive version of the identity: each day, the position must move enough to pay that day's theta. For an ATM straddle the breakeven daily move is approximately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;breakeven ≈ S × IV / √252
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On 2026-08-03, SPY closed at 758.34 with 30-day ATM implied vol around 13%. That prices a breakeven daily move of roughly &lt;strong&gt;0.82%, or about 6.2 SPY points&lt;/strong&gt;. Days that move more than that earn the long-gamma book money; days that move less bleed it.&lt;/p&gt;

&lt;p&gt;And the regime context said bleed: VIX stood at 15.86 against an SPX 20-day realised of 12.48 - implied comfortably above realised, the normal volatility-risk-premium state in which the average long-gamma day loses. That single comparison is the entry gate for the whole strategy, and it is one API call (below).&lt;/p&gt;

&lt;p&gt;The payoff curve is quadratic, because P&amp;amp;L tracks variance rather than the move itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hedging frequency: the tradeoff nobody escapes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hedge continuously&lt;/strong&gt; and P&amp;amp;L converges to the identity with minimal noise - but transaction costs scale with the number of hedges and eat the edge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hedge rarely&lt;/strong&gt; (daily, or at fixed delta bands) and costs drop, but P&amp;amp;L picks up path noise: you can realise high vol and still lose if the path whipsaws between your hedge points. The expected value is unchanged; the variance of outcomes grows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Band-based hedging&lt;/strong&gt; (re-hedge when delta drifts past a threshold) is the standard practical compromise, with bands widened as costs rise. On index products with tight markets the costs are manageable; on single names the spread cost per hedge is a first-order input.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One practical asymmetry: scalping into a gap is not optional. Overnight gaps deliver realised variance with no opportunity to hedge along the way - which is precisely why gap-heavy names (earnings season, biotech) are where long gamma pays best, and why realised-vol estimators that ignore overnight moves mislead. Use an estimator that handles the open.&lt;/p&gt;

&lt;h2&gt;
  
  
  When long gamma actually pays
&lt;/h2&gt;

&lt;p&gt;The identity says: when realised beats implied. The measurable states where that happens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Negative VRP episodes.&lt;/strong&gt; The volatility risk premium is positive most of the time (that is the premium), but it inverts around shocks and regime breaks. A negative or deeply compressed VRP z-score is the systematic entry flag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pre-event ramps.&lt;/strong&gt; Into earnings, implied rises but realised rises with it through the ramp; the post-event crush is the exit, not the trade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Short-gamma dealer regimes.&lt;/strong&gt; When the dealer complex is short gamma, forced hedging amplifies moves - realised vol runs hot relative to quiet-regime pricing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The biggest gamma scalper in the market is the dealer complex
&lt;/h2&gt;

&lt;p&gt;Here is the connection that makes gamma scalping more than a niche strategy. When dealers are net long gamma, the entire market-making complex is running this exact playbook at index scale - buying every dip and selling every rally to stay delta-neutral.&lt;/p&gt;

&lt;p&gt;That mechanical flow is why long-gamma regimes pin and dampen markets, and why GEX - the aggregate dollar gamma of that complex, by strike - predicts intraday behaviour. When you gamma scalp, you are joining (or opposing) the largest systematic vol trader in existence, and the signed polarity of dealer gamma tells you which side they are on today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running the numbers on the API
&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;requests&lt;/span&gt;

&lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;H&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="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;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;KEY&lt;/span&gt;&lt;span class="p"&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;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="s"&gt;/v1/vrp/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="n"&gt;H&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;rv&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="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;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;H&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="c1"&gt;# The gate: is implied trading rich or cheap to realised?
# vrp payload carries the IV-RV spread, z-score and percentile;
# volatility payload carries the realised-vol estimators.
&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;vrp&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;rv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The volatility endpoint carries the implied and realised series for the comparison. The VRP dashboard adds the z-score and percentile that place today's spread against the name's own history - the systematic version of the VIX-vs-realised eyeball test - and its historical counterpart replays the series point-in-time for backtests (SPY minute data from 2017-01-03). For per-strike dollar gamma to size the position, the greeks endpoint serves the chain live.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;What is gamma scalping in simple terms?&lt;/strong&gt;&lt;br&gt;
Buy a straddle so you make money if the stock moves either way. As it moves, keep flattening your directional exposure - selling some stock after rallies, buying after dips. Each flatten locks in profit from the move. If the stock moves around a lot, the locked-in profits exceed the daily cost of owning the options; if it goes quiet, they do not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is gamma scalping profitable?&lt;/strong&gt;&lt;br&gt;
Only when realised volatility exceeds the implied volatility you paid - which is the exception, not the rule, because implied usually carries a premium. Profitability is a timing question: the strategy pays around shocks, events, and short-gamma dealer regimes, and bleeds in the long calm stretches. Measure the spread before entering; do not run it as a permanent posture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How often should you re-hedge?&lt;/strong&gt;&lt;br&gt;
There is no free choice: frequent hedging reduces path noise but multiplies transaction costs; infrequent hedging is cheaper but noisier. Delta bands with band width scaled to the name's spread cost is standard practice. The expected P&amp;amp;L is set by realised-vs-implied either way - hedging style mainly chooses your variance around it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it the same as what market makers do?&lt;/strong&gt;&lt;br&gt;
Mechanically yes - dealers delta-hedge their books continuously, and when they are net long gamma the whole complex is gamma scalping against the market, which dampens volatility. The difference is intent: dealers hedge inventory they were paid a spread to carry; a gamma scalper chooses the position to express a realised-vol view.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;Gamma scalping is the cleanest expression of the only question in volatility trading: will realised beat implied? The identity ½ΓS²(RV²-IV²) decides the outcome, the breakeven daily move (about 0.82% for SPY at August 2026 pricing) makes it concrete, and the implied-vs-realised spread that gates the trade is one volatility call away.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://flashalpha.com/articles/gamma-scalping-complete-guide-delta-hedged-straddle-pnl" rel="noopener noreferrer"&gt;flashalpha.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>finance</category>
      <category>api</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Charted 8 Years of SPY Skew History. The Folklore Is Backwards.</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Fri, 24 Jul 2026 07:09:17 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/i-charted-8-years-of-spy-skew-history-the-folklore-is-backwards-dcl</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/i-charted-8-years-of-spy-skew-history-the-folklore-is-backwards-dcl</guid>
      <description>&lt;p&gt;The 25-delta skew is the implied volatility of the 25-delta put minus the implied volatility of the 25-delta call. In one number it tells you how much more the market is paying for downside protection than for upside participation. It is the cleanest single measure of the price of crash insurance.&lt;/p&gt;

&lt;p&gt;You can look up today's value in about four seconds. Charting its history is close to impossible, and that is the interesting part.&lt;/p&gt;

&lt;p&gt;To know what skew was on 13 March 2020 you need the whole option chain as it stood at that timestamp: strikes, quotes, and enough of the smile to interpolate to the 25-delta wings on both sides. Not a daily close, not a settlement file. The chain, at a minute, eight years ago. That data is rare enough that "what does skew normally do around selloffs" has stayed a folklore question rather than a data question.&lt;/p&gt;

&lt;p&gt;So I rebuilt the series. Every Friday close from May 2018 through March 2026, 413 weeks. Then I tested the folklore, and it failed in a way that turns out to be more useful than if it had passed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sample:&lt;/strong&gt; 413 Friday closes (Thursday on holiday weeks), 2018-05-04 to 2026-03-27.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; &lt;code&gt;GET /v1/stock/SPY/summary?at={date}&lt;/code&gt;, reading the &lt;code&gt;volatility.skew_25d&lt;/code&gt; block, which carries the 25-delta put IV, the 25-delta call IV, and their difference on the front expiry, all derived from real point-in-time quotes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flavour:&lt;/strong&gt; this is &lt;em&gt;front-expiry&lt;/em&gt; skew, typically 2-5 DTE. It is the most reactive skew gauge there is. A 30-60 DTE series moves the same direction with smaller amplitude.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forward returns:&lt;/strong&gt; SPY close four weeks later against the sampling close.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is what one observation actually looks like, from the single most extreme week in the sample:&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;"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;"2020-03-13T16:00: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;"price"&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;"mid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;270.96&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;"volatility"&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;"skew_25d"&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;"expiry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2020-03-16"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"days_to_expiry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"put_25d_iv"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;87.19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"call_25d_iv"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;59.87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"skew_25d"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;27.32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"smile_ratio"&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.456&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;"macro"&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;"vix"&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;57.83&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;87 vol points bid for the put wing, 60 offered on the call wing, VIX at 57.8. That is what maximum fear looks like as a number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Eight years of skew, by year
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Median skew (vol pts)&lt;/th&gt;
&lt;th&gt;90th percentile&lt;/th&gt;
&lt;th&gt;Regime&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2018 (May+)&lt;/td&gt;
&lt;td&gt;2.12&lt;/td&gt;
&lt;td&gt;4.96&lt;/td&gt;
&lt;td&gt;Vol-normalizing, Q4 bear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;1.82&lt;/td&gt;
&lt;td&gt;3.93&lt;/td&gt;
&lt;td&gt;Grind higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.21&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7.71&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Covid crash and recovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;2.72&lt;/td&gt;
&lt;td&gt;5.00&lt;/td&gt;
&lt;td&gt;Bull with crash memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;2.36&lt;/td&gt;
&lt;td&gt;4.72&lt;/td&gt;
&lt;td&gt;Bear market&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.22&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.96&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Skew collapse, 0DTE era&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;1.30&lt;/td&gt;
&lt;td&gt;2.21&lt;/td&gt;
&lt;td&gt;Grind, brief August shock&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;2.55&lt;/td&gt;
&lt;td&gt;4.14&lt;/td&gt;
&lt;td&gt;Tariff shock and recovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026 (Q1)&lt;/td&gt;
&lt;td&gt;3.20&lt;/td&gt;
&lt;td&gt;4.99&lt;/td&gt;
&lt;td&gt;Elevated hedging demand&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two regime stories fall out of this table immediately.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;2023-24 skew collapse&lt;/strong&gt; is the one nobody talks about. Median front skew halved against every earlier year in the sample. That is the fingerprint of the 0DTE era: systematic call overwriting and relentless daily premium selling compressed the put wing's relative price for two full years. Crash insurance was on sale, and it stayed on sale long enough that people stopped noticing.&lt;/p&gt;

&lt;p&gt;And 2026 Q1's median of 3.20 is running at essentially Covid-year levels. That is the market's standing bid for downside protection right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ten most extreme prints, 2018-2026
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Skew (vol pts)&lt;/th&gt;
&lt;th&gt;VIX&lt;/th&gt;
&lt;th&gt;Context&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2020-03-13&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;27.32&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;57.8&lt;/td&gt;
&lt;td&gt;Covid crash, pre -12% Monday&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020-03-20&lt;/td&gt;
&lt;td&gt;13.71&lt;/td&gt;
&lt;td&gt;66.0&lt;/td&gt;
&lt;td&gt;Crash week 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020-03-06&lt;/td&gt;
&lt;td&gt;11.26&lt;/td&gt;
&lt;td&gt;41.9&lt;/td&gt;
&lt;td&gt;Crash week 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021-01-29&lt;/td&gt;
&lt;td&gt;10.76&lt;/td&gt;
&lt;td&gt;33.1&lt;/td&gt;
&lt;td&gt;Meme-stock degrossing week&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-04-04&lt;/td&gt;
&lt;td&gt;9.24&lt;/td&gt;
&lt;td&gt;45.3&lt;/td&gt;
&lt;td&gt;Tariff shock&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020-10-30&lt;/td&gt;
&lt;td&gt;8.07&lt;/td&gt;
&lt;td&gt;38.0&lt;/td&gt;
&lt;td&gt;Pre-election hedging peak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2018-10-26&lt;/td&gt;
&lt;td&gt;8.03&lt;/td&gt;
&lt;td&gt;24.2&lt;/td&gt;
&lt;td&gt;October 2018 selloff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020-03-27&lt;/td&gt;
&lt;td&gt;7.95&lt;/td&gt;
&lt;td&gt;65.5&lt;/td&gt;
&lt;td&gt;First rebound week&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020-02-28&lt;/td&gt;
&lt;td&gt;7.82&lt;/td&gt;
&lt;td&gt;40.1&lt;/td&gt;
&lt;td&gt;Crash week 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020-04-03&lt;/td&gt;
&lt;td&gt;7.29&lt;/td&gt;
&lt;td&gt;46.8&lt;/td&gt;
&lt;td&gt;Bottom week&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read the Context column and notice what is missing. There is not one quiet week in this table. Every extreme print landed &lt;strong&gt;during&lt;/strong&gt; a stress event, never before one.&lt;/p&gt;

&lt;p&gt;That observation is what the next section formalizes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The folklore test
&lt;/h2&gt;

&lt;p&gt;The received wisdom is that elevated skew is a warning. Smart money is buying puts, position accordingly.&lt;/p&gt;

&lt;p&gt;I split all 413 weeks at the 90th skew percentile and measured SPY's return over the following four weeks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;Weeks&lt;/th&gt;
&lt;th&gt;Median 4-week forward return&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Top-decile skew&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+2.74%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;All other weeks&lt;/td&gt;
&lt;td&gt;371&lt;/td&gt;
&lt;td&gt;+1.61%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The folklore fails, and it fails informatively. Extreme skew did not predict drawdowns. It marked weeks where fear was already fully priced, which pushed forward returns &lt;em&gt;higher&lt;/em&gt;, not lower.&lt;/p&gt;

&lt;p&gt;The mechanism is obvious once you have looked at the top-10 table. Skew explodes when everyone is bidding for puts simultaneously, and that happens mid-panic, near capitulation. By the time crash protection is historically expensive, most of the crash has already happened. You are not being warned. You are being billed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rebuild it
&lt;/h2&gt;

&lt;p&gt;One call per date:&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: &lt;/span&gt;&lt;span class="nv"&gt;$FLASHALPHA_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://historical.flashalpha.com/v1/stock/SPY/summary?at=2020-03-13"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The whole series plus the forward-return split:&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="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="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="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/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;week_row&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&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="n"&gt;s&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="s"&gt;/stock/SPY/summary&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;at&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&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="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;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;volatility&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;skew_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;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;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&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&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;skew_25d&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_25d_iv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;put_25d_iv&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_25d_iv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;call_25d_iv&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;dte&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&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;price&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;mid&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;vix&lt;/span&gt;&lt;span class="sh"&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;macro&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;vix&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="n"&gt;dates&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;date_range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2018-05-04&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;2026-03-27&lt;/span&gt;&lt;span class="sh"&gt;"&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;W-FRI&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%Y-%m-%d&lt;/span&gt;&lt;span class="sh"&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="nf"&gt;week_row&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&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;d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dates&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fwd_4w&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;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;close&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="n"&gt;cut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&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&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;quantile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.90&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;skew&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;gt;=&lt;/span&gt; &lt;span class="n"&gt;cut&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="n"&gt;df&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&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;cut&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;cutoff:           &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cut&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; vol pts&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;top-decile weeks: &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;top&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  median 4w fwd &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fwd_4w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;median&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;2&lt;/span&gt;&lt;span class="o"&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;all other weeks:  &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;rest&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  median 4w fwd &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fwd_4w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;median&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;2&lt;/span&gt;&lt;span class="o"&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="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nlargest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&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&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;date&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;skew&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;vix&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]].&lt;/span&gt;&lt;span class="nf"&gt;to_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obvious extensions, all one-line edits: resample to daily instead of weekly to catch intraweek spikes, swap in a fixed-DTE expiry from &lt;code&gt;iv_term_structure&lt;/code&gt; for a less twitchy series, or condition the forward-return split on VIX regime rather than skew percentile.&lt;/p&gt;

&lt;h2&gt;
  
  
  What skew history is actually for
&lt;/h2&gt;

&lt;p&gt;Since it does not warn you, here is what it does do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hedge-cost timing.&lt;/strong&gt; The yearly table is a price chart for protection. Buying puts in 2023 (median 1.22) cost half what the same insurance cost in 2021. The time to own hedges is when skew is compressed, which is precisely when nobody wants them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contrarian context at extremes.&lt;/strong&gt; Top-decile skew has historically been a better moment to start scaling into risk than out of it. Not a signal on its own. Useful context against a signal you already have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regime identification.&lt;/strong&gt; A persistent shift in median skew, like 2023's collapse or 2026's elevation, says the options market has structurally re-priced tail risk. Strategy mix should follow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Put-spread design.&lt;/strong&gt; When skew is fat, put spreads that sell the inflated lower wing beat outright puts. When skew is flat, outright puts are the better hedge. The history tells you which regime you are standing in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest limitations
&lt;/h2&gt;

&lt;p&gt;Weekly Friday sampling misses intraweek skew spikes that resolved by the close. Front-expiry skew is deliberately twitchy; a 30-60 DTE series shows the same regimes with smaller amplitudes. And the forward-return split is descriptive, not a hypothesis test: 42 extreme weeks clustered into a handful of episodes is nowhere near 42 independent observations. March 2020 alone contributes five of the top ten.&lt;/p&gt;

&lt;p&gt;I would rather state that plainly than dress up a five-episode sample as statistics.&lt;/p&gt;

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

&lt;p&gt;Eight years of history replaces two pieces of folklore with two usable facts.&lt;/p&gt;

&lt;p&gt;Skew does not warn. It confirms, loudly, at the worst possible price.&lt;/p&gt;

&lt;p&gt;And skew regimes persist for years, which makes the &lt;em&gt;level&lt;/em&gt; chart actionable in a way the daily print never is: cheap-skew years are when hedges should be accumulated, fat-skew weeks are when they should be monetized or spread.&lt;/p&gt;

&lt;p&gt;Both facts were invisible until the history existed. Pull any week and check.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://flashalpha.com/articles/spy-25-delta-skew-history-selloffs-data-study" rel="noopener noreferrer"&gt;flashalpha.com&lt;/a&gt;. Endpoint docs &lt;a href="https://flashalpha.com/docs/historical-stock-summary" rel="noopener noreferrer"&gt;here&lt;/a&gt;; the archive replays any minute back to January 2017.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>datascience</category>
      <category>api</category>
      <category>finance</category>
    </item>
    <item>
      <title>Are 0DTE Straddles Overpriced? I Replayed 193 SPY Sessions to Find Out</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Fri, 24 Jul 2026 06:59:04 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/are-0dte-straddles-overpriced-i-replayed-193-spy-sessions-to-find-out-58eh</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/are-0dte-straddles-overpriced-i-replayed-193-spy-sessions-to-find-out-58eh</guid>
      <description>&lt;p&gt;"0DTE straddles are overpriced" is the most repeated claim in options trading since daily expirations took over SPY volume. It is also completely testable, and almost nobody tests it, because doing so needs something awkward: the state of the option chain at a specific minute on thousands of past days. Daily OHLC bars will not do it. You need point-in-time quotes.&lt;/p&gt;

&lt;p&gt;So I replayed &lt;strong&gt;193 Wednesday sessions from July 2022 through April 2026&lt;/strong&gt;, snapshotting the SPY same-day straddle at 10:00 ET and comparing what it implied against what SPY actually did into the close.&lt;/p&gt;

&lt;p&gt;Here is the method, the numbers, and a script that reproduces the whole thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sample:&lt;/strong&gt; every Wednesday from 2022-07-06 to 2026-04-01 with a SPY 0DTE expiry and complete data. 193 sessions, holidays excluded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snapshot:&lt;/strong&gt; &lt;code&gt;GET /v1/exposure/zero-dte/SPY?at={date}T10:00:00&lt;/code&gt;, which returns the ATM straddle price and the implied 1-sigma move built from real minute-level NBBO quotes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Realized:&lt;/strong&gt; the 16:00 ET quote mid against the 10:00 spot. That is the move the 10:00 straddle actually had to survive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benchmarks:&lt;/strong&gt; this is the part people skip. A &lt;em&gt;fairly priced&lt;/em&gt; 1-sigma move contains the close about 68.3% of the time, and the median absolute move of a normal variable is about 0.674 sigma. Richness gets measured against those numbers, not against zero.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point matters. A straddle that "contains the close 71% of the time" sounds like nothing until you know the fair-value number is 68.3%.&lt;/p&gt;

&lt;h2&gt;
  
  
  The headline numbers
&lt;/h2&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;Measured&lt;/th&gt;
&lt;th&gt;If fairly priced&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Close inside the 10:00 implied 1-sigma band&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;71.0%&lt;/strong&gt; of sessions&lt;/td&gt;
&lt;td&gt;~68.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sessions where realized move exceeded implied 1-sigma&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;25.9%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~31.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Median of realized move / implied move&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.589&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~0.674&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Median implied 1-sigma move (10:00 ET)&lt;/td&gt;
&lt;td&gt;0.72% of spot&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Median absolute realized move (10:00 to close)&lt;/td&gt;
&lt;td&gt;0.37%&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every line points the same way. The 10:00 straddle priced in slightly more movement than SPY delivered. Realized moves ran roughly &lt;strong&gt;13% below&lt;/strong&gt; the fair-value benchmark (0.589 against 0.674), the band held about 3 points more often than chance, and breaches happened about 6 points less often than fair pricing implies.&lt;/p&gt;

&lt;p&gt;That is a volatility risk premium, alive and measurable at the daily horizon. It is also small. Anyone selling you a "0DTE is free money" course is describing a 13% markup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is the edge stable?
&lt;/h2&gt;

&lt;p&gt;The obvious follow-up: 0DTE volume exploded over this window. Did the premium get arbitraged away?&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Sessions&lt;/th&gt;
&lt;th&gt;Hit rate (inside 1-sigma)&lt;/th&gt;
&lt;th&gt;Median implied&lt;/th&gt;
&lt;th&gt;Median abs realized&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2022 (H2)&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;69.2%&lt;/td&gt;
&lt;td&gt;1.17%&lt;/td&gt;
&lt;td&gt;0.73%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;td&gt;69.2%&lt;/td&gt;
&lt;td&gt;0.73%&lt;/td&gt;
&lt;td&gt;0.49%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;70.0%&lt;/td&gt;
&lt;td&gt;0.60%&lt;/td&gt;
&lt;td&gt;0.32%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;td&gt;71.2%&lt;/td&gt;
&lt;td&gt;0.62%&lt;/td&gt;
&lt;td&gt;0.39%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026 (Q1)&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;84.6%&lt;/td&gt;
&lt;td&gt;0.71%&lt;/td&gt;
&lt;td&gt;0.26%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;No. The hit rate sits in a tight 69-71% band across four genuinely different vol regimes: the 2022 bear, the 2023-24 grind, the 2025 tariff shock. The absolute level of implied vol moved a lot. The &lt;em&gt;markup&lt;/em&gt; did not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The caveat that pays for everything
&lt;/h2&gt;

&lt;p&gt;The worst session in the sample was &lt;strong&gt;April 9, 2025&lt;/strong&gt;. Here is the actual snapshot, unedited:&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;499.84&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;"2025-04-09T10:00: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;"time_to_close_hours"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"expected_move"&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;"implied_1sd_dollars"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;17.5691&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"implied_1sd_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;3.5149&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"straddle_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;13.47&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"atm_iv"&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.290367&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"upper_bound"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;516.7198&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lower_bound"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;482.9602&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;A 3.51% one-sigma move. Already enormous, ATM IV at 129%, mid tariff panic. The market was not asleep.&lt;/p&gt;

&lt;p&gt;SPY closed at 543.44 on the tariff-pause headline. That is &lt;strong&gt;+8.72%&lt;/strong&gt;, roughly 2.5x the implied move, and about 27 points above the upper bound the chain had priced at 10:00.&lt;/p&gt;

&lt;p&gt;A naked short straddle sized to "collect the premium" that morning gave back weeks of harvest in one afternoon.&lt;/p&gt;

&lt;p&gt;This is the whole seller's bargain in one line: &lt;strong&gt;about 74% of sessions the implied move is too big, about 26% it is too small, and a handful of those are catastrophically too small.&lt;/strong&gt; The premium exists precisely because someone has to hold that tail. Selling it naked is a leverage decision, not an edge decision. Defined-risk structures (iron flies, condors) monetize the same overpricing with a worst case you survive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproduce it
&lt;/h2&gt;

&lt;p&gt;Two calls per session. First the 10:00 snapshot, then the close:&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: &lt;/span&gt;&lt;span class="nv"&gt;$FLASHALPHA_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://historical.flashalpha.com/v1/exposure/zero-dte/SPY?at=2025-04-09T10:00:00"&lt;/span&gt;

curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: &lt;/span&gt;&lt;span class="nv"&gt;$FLASHALPHA_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://historical.flashalpha.com/v1/stockquote/SPY?at=2025-04-09T16:00:00"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full study is about thirty lines:&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="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="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="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/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;session_row&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&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;zd&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="s"&gt;/exposure/zero-dte/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;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;at&lt;/span&gt;&lt;span class="sh"&gt;"&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;date&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;T10:00: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;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="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;if&lt;/span&gt; &lt;span class="n"&gt;zd&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;no_zero_dte&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="bp"&gt;None&lt;/span&gt;  &lt;span class="c1"&gt;# no same-day expiry, skip
&lt;/span&gt;
    &lt;span class="n"&gt;close&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="s"&gt;/stockquote/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;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;at&lt;/span&gt;&lt;span class="sh"&gt;"&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;date&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;T16:00: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;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="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;spot_10&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;zd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;underlying_price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;implied_pct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;zd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;expected_move&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;implied_1sd_pct&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;realized_pct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mid&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;spot_10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;spot_10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&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;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&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_pct&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;implied_pct&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_pct&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;realized_pct&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ratio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&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;realized_pct&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;implied_pct&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inside_band&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&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;realized_pct&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;implied_pct&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="n"&gt;dates&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;date_range&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-07-06&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;2026-04-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;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;W-WED&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%Y-%m-%d&lt;/span&gt;&lt;span class="sh"&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;r&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dates&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;r&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;session_row&lt;/span&gt;&lt;span class="p"&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;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;sessions:     &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;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;hit rate:     &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inside_band&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="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;   (fair value 68.3%)&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;median ratio: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;median&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;3&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;   (fair value 0.674)&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;worst miss:   &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&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;x on &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&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="n"&gt;ratio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;idxmax&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="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 interesting variations are one-line edits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Change &lt;code&gt;T10:00:00&lt;/code&gt; to &lt;code&gt;T11:30:00&lt;/code&gt; or &lt;code&gt;T14:00:00&lt;/code&gt; and measure how the premium decays across the session. &lt;code&gt;time_to_close_hours&lt;/code&gt; is computed from your timestamp, so the maths stays consistent.&lt;/li&gt;
&lt;li&gt;Split by &lt;code&gt;vol_context.vix&lt;/code&gt; to see whether the markup is regime-dependent.&lt;/li&gt;
&lt;li&gt;Swap &lt;code&gt;W-WED&lt;/code&gt; for &lt;code&gt;B&lt;/code&gt; to cover every business day instead of one per week.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Honest limitations
&lt;/h2&gt;

&lt;p&gt;Wednesdays only, so one session per week. That avoids weekday-mix effects but samples less than it could. The close is measured against the 10:00 spot, not the intraday high and low that a gamma scalper actually cares about. Quote mids, no fees or slippage. 2026 is a partial year, and its 84.6% hit rate is 13 sessions, so read it as noise until it is not.&lt;/p&gt;

&lt;p&gt;FOMC Wednesdays stay in the sample. Worth noting on its own: straddles on Fed days priced roughly double the neighbouring weeks, and the market largely respected them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The conclusion
&lt;/h2&gt;

&lt;p&gt;The 0DTE volatility risk premium is real, stable, and small. The market pays about a 13% markup on daily movement, session after session, year after year, and that markup is fully earned by whoever eats the April 9ths.&lt;/p&gt;

&lt;p&gt;If you trade this, the practical output is a number rather than a slogan: the implied move is wide about 74% of the time, and the way to collect that without donating it back is defined risk and honest sizing.&lt;/p&gt;

&lt;p&gt;Rerun it, change the snapshot hour, slice it by VIX regime. Every endpoint replays back to January 2017.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://flashalpha.com/articles/are-0dte-straddles-overpriced-193-spy-sessions-data-study" rel="noopener noreferrer"&gt;flashalpha.com&lt;/a&gt;. The historical replay endpoints are documented &lt;a href="https://flashalpha.com/docs/historical-zero-dte" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>datascience</category>
      <category>api</category>
      <category>finance</category>
    </item>
    <item>
      <title>12 Things You Can Do with a Minute-Level Historical Options Data API</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Tue, 21 Jul 2026 19:13:09 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/12-things-you-can-do-with-a-minute-level-historical-options-data-api-4n6</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/12-things-you-can-do-with-a-minute-level-historical-options-data-api-4n6</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://flashalpha.com/articles/things-you-can-do-with-historical-options-data-api-12-quant-projects" rel="noopener noreferrer"&gt;flashalpha.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;What can you actually do with historical options data? In practice: backtest strategies against real bid/ask quotes, measure whether 0DTE straddles are systematically overpriced, rebuild IV rank and skew history, test whether GEX walls and max pain actually hold, and replay crisis days minute by minute.&lt;/p&gt;

&lt;p&gt;FlashAlpha Historical stores &lt;strong&gt;80+ billion minute-level option rows&lt;/strong&gt; across 200+ symbols — 26 of them fully analytics-ramped (SPY, QQQ, SPX/SPXW, XSP, IWM, TSLA, NVDA and more) — plus 23M+ stock minute-bars, with coverage from &lt;strong&gt;January 2017&lt;/strong&gt; onward. Every live analytics endpoint can be replayed at any minute in that window via a single &lt;code&gt;at=&lt;/code&gt; parameter.&lt;/p&gt;

&lt;p&gt;Here are 12 projects, most impactful first, each with the exact endpoint behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Pull the full option chain as it looked at any minute since 2017
&lt;/h2&gt;

&lt;p&gt;The foundational primitive: &lt;code&gt;/v1/optionquote&lt;/code&gt; returns every SPY contract's bid, ask, mid, implied vol, full BSM greeks (delta, gamma, theta, vega, rho, vanna, charm), and open interest exactly as they stood at any minute between 09:30 and 16:00 ET on any trading day since January 3, 2017. No reconstruction on your side — one call, one as-of chain.&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_API_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://historical.flashalpha.com/v1/optionquote/SPY?at=2026-03-05T15:30:00&amp;amp;expiry=2026-03-06&amp;amp;strike=680&amp;amp;type=C"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything else on this list is built on top of this call.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Backtest strategies against real bid/ask quotes, not theoretical fills
&lt;/h2&gt;

&lt;p&gt;Most options backtests die on fills: they price entries at a theoretical mid that never existed, on a dead contract with a $2 wide market. Because the archive stores the actual NBBO at minute resolution, you can enter at the real ask and exit at the real bid.&lt;/p&gt;

&lt;p&gt;Two filters, &lt;code&gt;maxSpreadPct&lt;/code&gt; and &lt;code&gt;maxSpreadAbs&lt;/code&gt;, drop wide "ghost quotes" on illiquid contracts before they poison your fill model, and structurally invalid quotes (crossed or one-sided markets) are always removed. The &lt;code&gt;X-Filtered-Out&lt;/code&gt; response header tells you exactly how many contracts were vetoed.&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;# Liquidity gauntlet: max 8% relative spread AND max $0.25 absolute spread&lt;/span&gt;
curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: YOUR_API_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://historical.flashalpha.com/v1/optionquote/SPY?at=2026-03-05T15:30:00&amp;amp;expiry=2026-03-06&amp;amp;maxSpreadPct=0.08&amp;amp;maxSpreadAbs=0.25"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Worked example on this data: &lt;a href="https://flashalpha.com/articles/spy-put-credit-spread-matrix-8-year-backtest-theoretical-vs-realized" rel="noopener noreferrer"&gt;SPY Put Credit Spread Matrix: 8-Year Backtest&lt;/a&gt; — theoretical vs realized P&amp;amp;L across strikes and DTEs.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Test whether 0DTE straddles are systematically overpriced
&lt;/h2&gt;

&lt;p&gt;The most-asked 0DTE question has a testable answer. &lt;code&gt;/v1/exposure/zero-dte&lt;/code&gt; returns the same-day straddle price and the implied 1-sigma expected move at any minute — and &lt;code&gt;time_to_close_hours&lt;/code&gt; is computed from your &lt;code&gt;at=&lt;/code&gt; timestamp, so the remaining expected move is accurate to the minute.&lt;/p&gt;

&lt;p&gt;Pull it at 10:00 ET every day for a few years, compare the implied move to the realized close-to-close move, and you have a distribution of implied-vs-realized 0DTE moves: the raw material for deciding whether selling (or buying) the same-day straddle carries edge, and at which time of day. The same endpoint returns pin risk, magnet strikes, OI concentration, and 0DTE share of total gamma for every historical session.&lt;/p&gt;

&lt;p&gt;We ran this exact study across 193 sessions: &lt;a href="https://flashalpha.com/articles/are-0dte-straddles-overpriced-193-spy-sessions-data-study" rel="noopener noreferrer"&gt;Are 0DTE Straddles Overpriced?&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Replay March 16, 2020 minute by minute
&lt;/h2&gt;

&lt;p&gt;The best read in the archive. At 15:30 ET on the day SPY closed down 12%, the historical API shows spot at 246.01, dealers short gamma with net GEX at &lt;strong&gt;-$2.8B&lt;/strong&gt;, net delta exposure at -$173B, and vanna exposure at +$154B — the exact mechanical setup that amplified every move into the close.&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_API_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://historical.flashalpha.com/v1/exposure/summary/SPY?at=2020-03-16T15:30:00"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replaying days like this — Covid, the 2022 bear legs, the August 2024 vol shock — is the cheapest regime-recognition training a discretionary trader can buy: you watch positioning deteriorate in real data instead of reading about it afterward.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Build an ATM IV time series and IV rank history
&lt;/h2&gt;

&lt;p&gt;Walk &lt;code&gt;at=&lt;/code&gt; forward one trading day at a time (a bare date defaults to the 16:00 ET close) against &lt;code&gt;/v1/stock/{symbol}/summary&lt;/code&gt; and you get ATM IV, HV20, HV60, VRP, and skew in one call per day — an instant IV time series without stitching vendors together. IV rank and IV percentile history fall out in a few lines of pandas:&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;httpx&lt;/span&gt;&lt;span class="p"&gt;,&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;from&lt;/span&gt; &lt;span class="n"&gt;tqdm&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tqdm&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;...&lt;/span&gt;&lt;span class="sh"&gt;"&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;dates&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2019-01-01&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;2026-06-30&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&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;timeout&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="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;c&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;d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;tqdm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dates&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;c&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="s"&gt;/v1/stock/SPY/summary&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;at&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="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%Y-%m-%d&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;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;200&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;v&lt;/span&gt; &lt;span class="o"&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;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;volatility&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;rows&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;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;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;atm_iv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hv_20&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hv_20&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&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&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&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]})&lt;/span&gt;

&lt;span class="n"&gt;iv&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;rows&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;set_index&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;iv&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_252d&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;iv&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;rolling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;252&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iloc&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="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&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="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# rolling window only sees the past: the rank series is walk-forward by construction
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same loop, pointed at a 10:00 ET timestamp instead of the close, gives you a morning IV series — useful for entry-time studies. You can finally answer "was 18 vol actually cheap in March 2026?" with data instead of memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Reconstruct a 25-delta skew history
&lt;/h2&gt;

&lt;p&gt;The same daily walk gives you &lt;code&gt;skew_25d&lt;/code&gt; — put wing IV minus call wing IV at 25 delta — straight from the summary response, or per-expiry skew profiles from &lt;code&gt;/v1/volatility&lt;/code&gt;. Chart it through 2018–2026 and every stress regime is visible — though when we ran the study across 413 weeks, the "early warning" folklore failed in an interesting way: &lt;a href="https://flashalpha.com/articles/spy-25-delta-skew-history-selloffs-data-study" rel="noopener noreferrer"&gt;SPY 25-Delta Skew History&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Build a volatility cone from 8 years of realized vol
&lt;/h2&gt;

&lt;p&gt;A volatility cone needs one thing: a long, clean daily price history. &lt;code&gt;/v1/stock/{symbol}/prices&lt;/code&gt; returns up to 2000 daily OHLC bars per call, and &lt;code&gt;/v1/volatility&lt;/code&gt; serves the realized-vol ladder (5/10/20/30/60-day) computed on it at any historical date. Compute rolling realized vol at each horizon, take percentile bands, and you have the cone: today's IV plotted against where realized vol has actually lived at that horizon. The fastest sanity check for "is vol cheap or rich right now."&lt;/p&gt;

&lt;p&gt;Published result: &lt;a href="https://flashalpha.com/articles/spy-volatility-cone-8-years-data-study" rel="noopener noreferrer"&gt;The SPY Volatility Cone: 8 Years of Realized Vol Percentiles&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Backtest GEX regimes and test whether walls hold
&lt;/h2&gt;

&lt;p&gt;Everyone quotes the GEX thesis — positive gamma dampens, negative gamma amplifies — but almost nobody tests it, because historical GEX barely exists as a product. With &lt;code&gt;/v1/exposure/gex&lt;/code&gt; and &lt;code&gt;/v1/exposure/levels&lt;/code&gt; you can pull the net GEX, gamma flip, call wall, and put wall for every session since 2017 and measure it directly: conditional next-day realized vol by regime, wall touch-and-reject rates, flip-cross behavior.&lt;/p&gt;

&lt;p&gt;We ran a version ourselves: &lt;a href="https://flashalpha.com/articles/gex-dex-vex-chex-8-year-backtest-spy-vix-control" rel="noopener noreferrer"&gt;GEX, DEX, VEX, CHEX: 8-Year SPY/VIX Backtest&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Harvest the volatility risk premium with leak-free percentiles
&lt;/h2&gt;

&lt;p&gt;The classic premium-selling rule — "sell when VRP percentile is above 80" — is only testable if the percentile at each historical date uses &lt;em&gt;only data available at that date&lt;/em&gt;. &lt;code&gt;/v1/vrp&lt;/code&gt; is date-bounded by construction: percentiles and z-scores at &lt;code&gt;at=&lt;/code&gt; are computed exclusively from snapshots strictly before that date. No lookahead, no quiet inflation of your backtest Sharpe.&lt;/p&gt;

&lt;p&gt;The endpoint also returns IV-RV spreads at four horizons, term VRP, GEX-conditioned harvest scores, and strategy scores per structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Watch the whole vol surface reprice through events
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;/v1/surface&lt;/code&gt; builds a 50×50 implied-vol grid over tenor and log-moneyness at any minute, and &lt;code&gt;/v1/adv_volatility&lt;/code&gt; exposes the daily SVI parameters, forward prices, arbitrage flags, and variance-swap fair values behind it. Sample the surface at successive minutes through an event — a Fed day, an earnings-adjacent macro shock, the Covid crash — and you can animate how the smile twists and the term structure inverts in real time.&lt;/p&gt;

&lt;p&gt;For vol researchers, per-expiry SVI parameter history (a, b, rho, m, sigma) since 2017 is a calibration dataset that is genuinely hard to find anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Measure whether max pain actually pins
&lt;/h2&gt;

&lt;p&gt;Max pain is a theory with a testable prediction: price gravitates toward the strike that minimizes option-holder payout into expiration. &lt;code&gt;/v1/maxpain&lt;/code&gt; returns the max pain strike, full pain curve, pin probability, and dealer alignment at any historical minute — so you can check the prediction against every expiry since 2017, split by OPEX vs daily expirations, and by whether dealer positioning agreed.&lt;/p&gt;

&lt;p&gt;Published 534-day sample: &lt;a href="https://flashalpha.com/articles/spy-max-pain-history-by-date" rel="noopener noreferrer"&gt;SPY Max Pain History by Date&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Turn term-structure inversion into a risk signal
&lt;/h2&gt;

&lt;p&gt;The IV term structure spends most of its life in contango; inversion is the market pricing near-term stress. The historical stock summary carries the VIX term structure (VIX9D / VIX / VIX3M / VIX6M with slope and contango/backwardation label) as EOD macro context, and &lt;code&gt;/v1/volatility&lt;/code&gt; serves SPY's own per-expiry IV term structure at any minute.&lt;/p&gt;

&lt;p&gt;Build the daily series, flag inversions, and test the obvious rule: de-risk when the front inverts, re-risk when contango restores. We tested it across 37 inversion episodes — the answer surprised us: &lt;a href="https://flashalpha.com/articles/vix-term-structure-inversions-since-2018-data-study" rel="noopener noreferrer"&gt;VIX Term Structure Inversions Since 2018&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  More ideas worth an afternoon
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FOMC vol-crush event studies&lt;/strong&gt; — pull ATM IV and vanna/charm exposure at 13:55 and 14:30 ET on every Fed day; measure the crush and the dealer-flow shift minute by minute.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Greeks P&amp;amp;L attribution on past trades&lt;/strong&gt; — reprice any historical position minute by minute from &lt;code&gt;/v1/optionquote&lt;/code&gt; and decompose its P&amp;amp;L into delta, gamma, theta, and vega contributions. The honest post-mortem tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Charm-into-close and OPEX-week studies&lt;/strong&gt; — test the "charm flows support the close" folklore with &lt;code&gt;/v1/exposure/chex&lt;/code&gt; across years of sessions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Liquidity regime mapping&lt;/strong&gt; — use the spread filters plus the &lt;code&gt;X-Filtered-Out&lt;/code&gt; header to measure when SPY option spreads blow out: open, close, crash days.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Coverage, resolution &amp;amp; access
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Coverage:&lt;/strong&gt; 26 fully-ramped symbols, most from January 2017 to present; minute-level option archives for 200+ symbols. Additional symbols backfilled on demand — &lt;code&gt;/v1/tickers&lt;/code&gt; reports the live coverage map, per-table health, and known gaps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resolution:&lt;/strong&gt; option quotes, greeks, and stock spot at &lt;strong&gt;1-minute&lt;/strong&gt; granularity (09:30–16:00 ET); open interest, SVI fits, and macro (VIX, VVIX, SKEW, MOVE, DGS10) applied at end of day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No lookahead by design:&lt;/strong&gt; every endpoint answers as-of &lt;code&gt;at=&lt;/code&gt;; VRP percentiles are date-bounded to strictly earlier snapshots.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access:&lt;/strong&gt; same &lt;code&gt;X-Api-Key&lt;/code&gt; as the live API, base URL &lt;code&gt;https://historical.flashalpha.com&lt;/code&gt;. Full conventions in the &lt;a href="https://flashalpha.com/docs/historical-api" rel="noopener noreferrer"&gt;historical API overview&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Every project on this list reduces to the same primitive: ask the market a question &lt;em&gt;as of a specific minute&lt;/em&gt;, and trust that the answer only uses what was knowable then. That's what makes minute-level, as-of historical options data different from EOD aggregates or raw tick dumps — the analytics arrive already point-in-time correct.&lt;/p&gt;

&lt;p&gt;Pick the project closest to how you trade, pull the endpoint behind it, and let the data argue with your priors. The &lt;a href="https://flashalpha.com/articles/historical-options-data-api-complete-guide" rel="noopener noreferrer"&gt;complete endpoint guide&lt;/a&gt; is the reference.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Questions or a symbol you'd like backfilled? Find us on &lt;a href="https://discord.gg/UtH22J8df2" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; or &lt;a href="https://github.com/FlashAlpha-lab" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>api</category>
      <category>quant</category>
      <category>finance</category>
    </item>
    <item>
      <title>Flow-Signed GEX: Are Dealers Long or Short Gamma From Today's Tape?</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Sat, 11 Jul 2026 08:40:00 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/flow-signed-gex-are-dealers-long-or-short-gamma-from-todays-tape-1dkf</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/flow-signed-gex-are-dealers-long-or-short-gamma-from-todays-tape-1dkf</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Every GEX tool signs gamma the same way: calls positive, puts negative. That answers "what is the market's structural gamma?" It does not answer "are dealers actually long or short gamma from today's flow?" FlashAlpha's new &lt;code&gt;?polarity=flow&lt;/code&gt; mode answers the second question by signing each strike from the measured dealer position on today's classified tape. Untraded strikes contribute exactly zero. Defaults unchanged.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://flashalpha.com/articles/flow-signed-gex-polarity-dealers-long-or-short-gamma" rel="noopener noreferrer"&gt;FlashAlpha Research&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Two ways to sign dealer gamma
&lt;/h2&gt;

&lt;p&gt;Every gamma exposure number rests on one hidden choice: what sign to attach to each strike's gamma. Almost every tool makes the same choice, and it smuggles in an assumption: that dealers sit on the opposite side of all customer positioning in one fixed way, forever.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;How each strike is signed&lt;/th&gt;
&lt;th&gt;What it answers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;convention&lt;/code&gt; (default)&lt;/td&gt;
&lt;td&gt;Calls positive, puts negative&lt;/td&gt;
&lt;td&gt;What is the market's &lt;em&gt;structural&lt;/em&gt; gamma?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;flow&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Measured dealer position from today's classified session trades&lt;/td&gt;
&lt;td&gt;Are dealers &lt;em&gt;actually&lt;/em&gt; long or short gamma today?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The first is a property of open contracts. The second is a property of the live tape. You want both, and now the same endpoints serve either, selected with one parameter. Omit it (or pass &lt;code&gt;?polarity=convention&lt;/code&gt;) and you get the existing behaviour, byte for byte. Anything else returns &lt;code&gt;400 {"error":"invalid_polarity"}&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How flow polarity is computed
&lt;/h2&gt;

&lt;p&gt;The computation is deliberately simple and fully mechanical. For each strike, on both the call and put side:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dealer_pos = -(customer_buys - customer_sells)
           = customer_sells - customer_buys

GEX_strike = dealer_pos * gamma * multiplier * spot^2 * 0.01
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where the multiplier is 100 for equity options and the 0.01 scales to a 1% move.&lt;/p&gt;

&lt;p&gt;The logic is the market-maker's mirror. When customers buy options, dealers end up short those options, and short gamma. When customers sell, dealers end up long, and long gamma. So &lt;code&gt;dealer_pos&lt;/code&gt; is simply the negative of net customer buying, accumulated from the 09:30 ET open, starting at zero.&lt;/p&gt;

&lt;h3&gt;
  
  
  How trades are classified
&lt;/h3&gt;

&lt;p&gt;Buy/sell tagging is a quote-rule aggressor classification against the concurrent NBBO, a Lee-Ready-style method:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A print near the ask is buyer-initiated&lt;/li&gt;
&lt;li&gt;A print near the bid is seller-initiated&lt;/li&gt;
&lt;li&gt;A print in the middle of the spread is indeterminate and &lt;strong&gt;excluded&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no tick-rule fallback and no midpoint imputation. If the aggressor is ambiguous, the trade simply does not contribute.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it explicitly does NOT use
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Not used&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Open interest&lt;/td&gt;
&lt;td&gt;The surface is built from classified volume alone. No settled OI, no effective-OI simulator, no open/close confidence weights.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opening-position estimates&lt;/td&gt;
&lt;td&gt;Dealer position starts from zero at the open and accumulates only measured trades. Nothing is assumed about yesterday's book.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decay heuristics&lt;/td&gt;
&lt;td&gt;Nothing ages or re-weights past trades within the session. It is a straight running sum.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three clean properties fall out:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Untraded strikes contribute exactly 0.&lt;/strong&gt; No classified session trades means &lt;code&gt;dealer_pos = 0&lt;/code&gt; and zero gamma contribution.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Midpoint trades are dropped, not guessed.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Position is session-cumulative from the open&lt;/strong&gt;, so it measures the day's dealer inventory change, not the absolute book.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the whole point: the signal moves when dealers actually trade, not when a model decides positions should have changed. One practical consequence worth knowing: because only traded strikes count, the flow-signed surface can look sparser than the convention surface on quiet names or early in the session. That sparseness is information, not a bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading net_gex
&lt;/h2&gt;

&lt;p&gt;Once each strike is signed by dealer position, the sign of the aggregate &lt;code&gt;live_net_gex&lt;/code&gt; is the whole message.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;net_gex &amp;gt; 0, dealers net LONG gamma.&lt;/strong&gt; Dealers hedge against the move: sell rallies, buy dips. Volatility compresses and price tends to pin around the gamma flip. The classic mean-reverting, low-realised-vol regime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;net_gex &amp;lt; 0, dealers net SHORT gamma.&lt;/strong&gt; Dealers hedge with the move: chase price up, sell it down, amplifying the trend. Volatility expands and larger directional moves become more likely.&lt;/p&gt;

&lt;p&gt;The label is echoed as &lt;code&gt;live_net_gex_label&lt;/code&gt; (&lt;code&gt;"positive"&lt;/code&gt; or &lt;code&gt;"negative"&lt;/code&gt;) so you never re-derive the sign in client code. The same signing flows through the levels endpoint, re-signing the gamma flip and the call and put walls.&lt;/p&gt;

&lt;h2&gt;
  
  
  The endpoints, precisely scoped
&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;What flow mode changes&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/flow/gex/{symbol}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full re-signed surface, aggregate as &lt;code&gt;live_net_gex&lt;/code&gt;, plus per-strike dealer diagnostics&lt;/td&gt;
&lt;td&gt;Growth and above&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET /v1/flow/levels/{symbol}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Re-signs &lt;code&gt;live_gamma_flip&lt;/code&gt;, &lt;code&gt;live_call_wall&lt;/code&gt;, &lt;code&gt;live_put_wall&lt;/code&gt;. &lt;code&gt;live_max_pain&lt;/code&gt; intentionally stays OI-based&lt;/td&gt;
&lt;td&gt;Growth and above&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET /v1/flow/live/{symbol}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Re-signed aggregate gamma as &lt;code&gt;live_gex&lt;/code&gt;. DEX and dealer-risk in the bundle stay convention-signed&lt;/td&gt;
&lt;td&gt;Alpha and above&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Scope notes that will save you a support ticket: the five other simulation-aware flow endpoints (&lt;code&gt;summary&lt;/code&gt;, &lt;code&gt;pin-risk&lt;/code&gt;, &lt;code&gt;dex&lt;/code&gt;, &lt;code&gt;dealer-risk&lt;/code&gt;, &lt;code&gt;oi&lt;/code&gt;) do not accept &lt;code&gt;polarity&lt;/code&gt;. And flow polarity is independent of the effective-OI simulator the default flow surface uses; that is a separate mechanism.&lt;/p&gt;

&lt;p&gt;Coverage is 6,000+ US equities and ETFs, plus ES and NQ index futures. Because the default is unchanged, every existing integration keeps working exactly as before. Flow mode is strictly additive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Calling 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;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://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="c1"&gt;# Flow-signed GEX: sign each strike by measured dealer position
&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="s"&gt;/v1/flow/gex/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;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;polarity&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;flow&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="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;Polarity:        &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;polarity&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 dealer GEX:  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;live_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="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;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;live_net_gex_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="s"&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;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;live_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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;live_net_gex&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="mi"&gt;0&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;Dealers net SHORT gamma - moves amplify, vol expands&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;Dealers net LONG gamma - moves dampen, price pins&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Inspect where the position came from, strike by strike
&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;r&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&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][:&lt;/span&gt;&lt;span class="mi"&gt;3&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;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;strike&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;: dealer calls &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;call_dealer_pos&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="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;dealer puts &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;put_dealer_pos&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="si"&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;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;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="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;In flow mode the response adds a top-level &lt;code&gt;polarity: "flow"&lt;/code&gt; marker plus four per-strike diagnostics: &lt;code&gt;call_net_customer&lt;/code&gt; and &lt;code&gt;put_net_customer&lt;/code&gt; (customer buys minus sells, in contracts) and &lt;code&gt;call_dealer_pos&lt;/code&gt; and &lt;code&gt;put_dealer_pos&lt;/code&gt; (their negatives). Settled &lt;code&gt;call_oi&lt;/code&gt; / &lt;code&gt;put_oi&lt;/code&gt; are still returned per strike for reference, but play no part in the signed gamma.&lt;/p&gt;

&lt;p&gt;An illustrative API-shape sample (not live data):&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;"polarity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"flow"&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="mi"&gt;-4200000000&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_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;"negative"&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_gamma_flip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;596.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;"strikes"&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;"strike"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;595.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"call_gex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-145000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"put_gex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;62000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"net_gex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-83000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"call_net_customer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"put_net_customer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-1890&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"call_dealer_pos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;-2150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"put_dealer_pos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1890&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"call_oi"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15820&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"put_oi"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12340&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 the strike: customers net bought 2,150 calls, so dealers are short 2,150 calls and short gamma on that side. Customers net sold 1,890 puts, so dealers are long those puts and long gamma there. Net across the surface is negative: dealers are net short gamma and moves are likely to amplify.&lt;/p&gt;

&lt;h2&gt;
  
  
  The divergence trade
&lt;/h2&gt;

&lt;p&gt;Convention and flow polarity are complementary, not competing. Use convention GEX for the structural backdrop and the flip level, then watch flow polarity intraday to catch when the day's order flow pushes dealers into a genuinely different gamma posture than the OI-based picture implies. When the two disagree, the disagreement is the signal: structural gamma says pin, real positioning says amplify.&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="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://lab.flashalpha.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;H&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="c1"&gt;# Same endpoint, two signings
&lt;/span&gt;&lt;span class="n"&gt;conv&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="s"&gt;/v1/flow/gex/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="n"&gt;H&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;flow&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="s"&gt;/v1/flow/gex/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;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;polarity&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;flow&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;H&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;structural_long&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;live_net_gex&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;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;dealer_long&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;flow&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;live_net_gex&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;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;structural_long&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;dealer_long&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;Structural gamma long, but today&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s flow has dealers SHORT - expect amplification&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;dealer_long&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;Dealers genuinely long gamma from the tape - fade extremes toward the flip&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;Both agree: dealers short gamma - respect trends&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;Pair it with &lt;a href="https://flashalpha.com/articles/net-dealer-premium-api-are-dealers-long-or-short-premium" rel="noopener noreferrer"&gt;net dealer premium&lt;/a&gt;, the premium-sign counterpart, for a fuller read of dealer positioning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backtesting with no lookahead bias
&lt;/h2&gt;

&lt;p&gt;Flow polarity works on the point-in-time historical API too. Add &lt;code&gt;?at=&amp;lt;timestamp&amp;gt;&amp;amp;polarity=flow&lt;/code&gt; to reconstruct the flow-signed surface as it stood at any minute, using only the classified tape up to that instant, with greeks repriced at that moment's spot. Historical replay covers &lt;code&gt;/v1/flow/gex&lt;/code&gt; and &lt;code&gt;/v1/flow/levels&lt;/code&gt; on the Alpha-tier historical API (the historical live bundle does not take the parameter).&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;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="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="n"&gt;rows&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;day&lt;/span&gt; &lt;span class="ow"&gt;in&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-05-01&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;2026-05-31&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="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;day&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;Y&lt;/span&gt;&lt;span class="o"&gt;-%&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;-%&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;T18:00:00Z&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;   &lt;span class="c1"&gt;# 14:00 ET snapshot
&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="s"&gt;/v1/flow/gex/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;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;at&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="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;polarity&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;flow&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="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;rows&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;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;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="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;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;live_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;label&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;live_net_gex_label&lt;/span&gt;&lt;span class="sh"&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;rows&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;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# daily flow-signed dealer gamma regime, no lookahead
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because each snapshot only consumes the tape up to &lt;code&gt;at&lt;/code&gt;, the series is usable for genuine signal research on dealer-positioning regimes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What flow polarity is not
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not the effective-OI simulator.&lt;/strong&gt; The default flow surface estimates intraday OI change with a confidence weight and signs by convention. Flow polarity ignores that machinery and builds gamma from classified volume alone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not an absolute dealer book.&lt;/strong&gt; &lt;code&gt;dealer_pos&lt;/code&gt; is the net position accumulated today, from zero at the open. It is what dealers traded into during the session, not their full inventory including prior days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not a modification of anything else.&lt;/strong&gt; Convention output, settled exposure endpoints, DEX and dealer-risk are untouched. Only the three endpoints above change, and only when you ask.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One honest caveat: flow polarity is a derived signal off the classified options tape, not exchange-audited dealer accounting. The dealer side is inferred from quote-rule NBBO aggressor classification. Read the sign and its intraday shifts as a relative signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The full reference, including response schemas, an FAQ, and the same call in Python, JavaScript, C#, Go and cURL, is in the &lt;a href="https://flashalpha.com/articles/flow-signed-gex-polarity-dealers-long-or-short-gamma" rel="noopener noreferrer"&gt;original article&lt;/a&gt;. The &lt;a href="https://flashalpha.com/docs/playground" rel="noopener noreferrer"&gt;interactive playground&lt;/a&gt; has the endpoints live if you want to poke at them without writing code.&lt;/p&gt;

&lt;p&gt;Questions on the classification method or the maths welcome in the comments.&lt;/p&gt;

</description>
      <category>python</category>
      <category>api</category>
      <category>finance</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Backtesting Futures Gamma (ES &amp; NQ): Historical GEX Done Right</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Wed, 08 Jul 2026 13:40:29 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/backtesting-futures-gamma-es-nq-historical-gex-done-right-21gl</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/backtesting-futures-gamma-es-nq-historical-gex-done-right-21gl</guid>
      <description>&lt;p&gt;"Can I backtest futures gamma?" is one of the most common questions we get from quant desks, and the honest answer has two parts.&lt;/p&gt;

&lt;p&gt;First: FlashAlpha serves &lt;strong&gt;live&lt;/strong&gt; gamma exposure on ES and NQ futures today, computed properly on the options-on-futures chains. Second: the &lt;em&gt;historical replay&lt;/em&gt; engine does not yet cover the futures symbols, so &lt;code&gt;/v1/exposure/gex/ES=F?at=...&lt;/code&gt; returns no data. That is a real limitation — and this article is about the fact that it is not the blocker it looks like.&lt;/p&gt;

&lt;p&gt;The reason is structural. The dealer gamma that pins or unpins ES is the gamma of the entire S&amp;amp;P 500 options complex — SPX index options, SPY ETF options, and the ES options-on-futures — hedged by the same desks against the same index. That complex has a deep, clean, minute-resolution history. So the rigorous move is to &lt;strong&gt;backtest the regime on the cash-index history and trade it on the live future&lt;/strong&gt;, rather than wait for a thin native futures tape.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR — the split:&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;Phase&lt;/th&gt;
&lt;th&gt;Host&lt;/th&gt;
&lt;th&gt;Symbols&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Research / backtest&lt;/td&gt;
&lt;td&gt;&lt;code&gt;historical.flashalpha.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;SPY&lt;/code&gt; (for ES), &lt;code&gt;QQQ&lt;/code&gt; (for NQ), since April 2018&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live execution&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lab.flashalpha.com&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ES=F&lt;/code&gt;, &lt;code&gt;NQ=F&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same response shape on both hosts, so the same code path works for backtest and live.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why There Is No Native Futures GEX History (Yet)
&lt;/h2&gt;

&lt;p&gt;Computing historical gamma exposure needs a point-in-time options chain with open interest, strikes, and quotes at every past minute. For US equities and index options that history is deep and well-kept, which is why FlashAlpha can replay SPY, SPX, QQQ, and thousands of names back to 2018. Options-on-futures history is a different, sparser story across the industry, and FlashAlpha's replay engine does not yet ingest it. Concretely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live &lt;code&gt;ES=F&lt;/code&gt; and &lt;code&gt;NQ=F&lt;/code&gt; exposure works now — &lt;code&gt;/v1/exposure/gex/ES%3DF&lt;/code&gt; returns the full live surface.&lt;/li&gt;
&lt;li&gt;Historical &lt;code&gt;ES=F&lt;/code&gt; / &lt;code&gt;NQ=F&lt;/code&gt; does not — a &lt;code&gt;?at=&lt;/code&gt; replay on a futures symbol returns &lt;code&gt;no_data&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The cash-index proxies — &lt;code&gt;SPY&lt;/code&gt;, &lt;code&gt;SPX&lt;/code&gt;, &lt;code&gt;QQQ&lt;/code&gt;, &lt;code&gt;NDX&lt;/code&gt; — replay cleanly at minute resolution since &lt;strong&gt;2018-04-16&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rather than pretend otherwise, the workflow below leans on what is actually true and testable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cash-Index Proxy: ES Is the SPX Complex, NQ Is the NDX Complex
&lt;/h2&gt;

&lt;p&gt;An ES future is a financed claim on the S&amp;amp;P 500; an NQ future is a financed claim on the Nasdaq-100. The options that hedge them belong to the same index complex, so the &lt;em&gt;gamma regime&lt;/em&gt; — positive versus negative dealer gamma, where the flip sits, where the walls cluster — is shared. That is what makes the proxy sound: you are not substituting an unrelated instrument, you are reading the same dealer book from its most liquid, best-recorded venue.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ES ← SPY / SPX.&lt;/strong&gt; The E-mini S&amp;amp;P 500 tracks the same index as SPY and SPX. Historical SPY (or SPX) gamma regime is the ES gamma regime, minus a basis on the price axis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NQ ← QQQ / NDX.&lt;/strong&gt; The E-mini Nasdaq-100 tracks the same index as QQQ and NDX. Historical QQQ (or NDX) gamma regime is the NQ gamma regime, minus a basis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What transfers cleanly:&lt;/strong&gt; gamma regime (positive/negative), the timing of flips, relative wall placement, dealer-hedging direction, and the &lt;em&gt;shape&lt;/em&gt; of the exposure profile. These are properties of the index dealer book, not of one venue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What needs a translation:&lt;/strong&gt; the price of each level. Cash-index strikes are on the index; ES/NQ trade at a basis to cash. A level is correct in &lt;em&gt;regime&lt;/em&gt; terms but must be shifted onto the futures price before you act on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Translating Levels Through the Basis
&lt;/h2&gt;

&lt;p&gt;The only adjustment the proxy needs is on the price axis. The future trades at a basis to the cash index:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;F = S + Basis        (Basis = F − S)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where &lt;code&gt;F&lt;/code&gt; is the ES (or NQ) future and &lt;code&gt;S&lt;/code&gt; is the cash index (SPX or NDX). The basis reflects financing minus dividends to the contract's expiry and drifts toward zero into the quarterly roll. So a gamma flip your backtest found at an SPX level maps to an ES level by adding the current basis:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ES level = SPX level + Basis(now)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you backtest on SPY rather than SPX, first scale by roughly ten (SPY is about 1/10th of SPX) to reach index points, then apply the basis. The &lt;a href="https://flashalpha.com/futures/es" rel="noopener noreferrer"&gt;/futures/es&lt;/a&gt; page prints the live basis so you do not have to compute it by hand, and the &lt;a href="https://flashalpha.com/articles/es-futures-fair-value-basis-explained" rel="noopener noreferrer"&gt;ES fair value and basis explainer&lt;/a&gt; covers the mechanics in depth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this is enough:&lt;/strong&gt; dealer gamma is a statement about &lt;em&gt;where hedging flips sign&lt;/em&gt;, which is a property of the index, not the wrapper. The basis moves the number on the x-axis; it does not change whether dealers are long or short gamma. Get the regime from the deep cash history, get the exact price from the live future and its basis.&lt;/p&gt;

&lt;h2&gt;
  
  
  How To Backtest It: Signal on the Cash History
&lt;/h2&gt;

&lt;p&gt;The historical host mirrors the live exposure endpoints and adds an &lt;code&gt;?at=&lt;/code&gt; timestamp (ET). Pull SPY (for ES) or QQQ (for NQ) at any past minute and you get the same response shape as live — &lt;code&gt;net_gex&lt;/code&gt;, the gamma flip, the walls, and the per-strike breakdown:&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;# Replay SPY dealer gamma at a past timestamp (ET) - the ES proxy&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://historical.flashalpha.com/v1/exposure/gex/SPY?at=2026-06-13T15:55:00"&lt;/span&gt;

&lt;span class="c"&gt;# NQ backtests off QQQ&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://historical.flashalpha.com/v1/exposure/gex/QQQ?at=2026-06-13T15:55:00"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To build a strategy signal, walk a date range and tag each day's dealer-gamma regime from the sign of net GEX. That regime series is your ES 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;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;HOST&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/v1/exposure/gex/SPY&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;net_gex_at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;day&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HOST&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;at&lt;/span&gt;&lt;span class="sh"&gt;"&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;day&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;T15:55: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;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;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="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="c1"&gt;# Tag each session's regime - the signal you would have traded ES on
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;day&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;2026-06-08&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;2026-06-09&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;2026-06-10&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;net_gex_at&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;regime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;positive-gamma (pin)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;negative-gamma (trend)&lt;/span&gt;&lt;span class="sh"&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;day&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;regime&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;g&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From there it is an ordinary backtest: join the regime series to ES returns, test the rule (for example, "fade range in positive gamma, stand aside or follow trend in negative gamma"), and measure the edge. Because the historical and live responses are identical in shape, the same parsing code you write here runs unchanged against the live future in production. For the general historical-GEX backtesting workflow and field reference, see the &lt;a href="https://flashalpha.com/articles/historical-gex-api-backtesting-gamma-exposure-strategies" rel="noopener noreferrer"&gt;historical GEX API guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The workflow in five steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pick the proxy.&lt;/strong&gt; SPY (or SPX) for ES, QQQ (or NDX) for NQ.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replay the regime.&lt;/strong&gt; Loop &lt;code&gt;?at=&lt;/code&gt; over your test window and record net GEX, the flip, and the walls at each point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build the signal.&lt;/strong&gt; Turn the exposure series into your rule — regime sign, distance to flip, proximity to a wall.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Join to futures returns.&lt;/strong&gt; Test the rule against ES/NQ price action; the regime is shared, so the signal transfers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Translate levels for execution.&lt;/strong&gt; Shift any price level onto the future with the current basis.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Execute on the Live Futures Book
&lt;/h2&gt;

&lt;p&gt;When the backtested rule fires today, read the actual dealer gamma off the live future — this is where the options-on-futures chain, Black-76 pricing, and the correct CME multiplier ($50/pt for ES, $20/pt for NQ) matter for the exact levels:&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 ES gamma for the current session (URL-encode '=' as %3D)&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;# Live 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;So the division of labour is clean: the &lt;strong&gt;cash history gives you the tested edge&lt;/strong&gt;, the &lt;strong&gt;live future gives you the exact, execution-grade levels&lt;/strong&gt; on the instrument you actually trade. The live ES and NQ surfaces are documented in &lt;a href="https://flashalpha.com/articles/gex-on-futures-es-nq-gamma-exposure" rel="noopener noreferrer"&gt;GEX on ES &amp;amp; NQ futures&lt;/a&gt;, and the two books are compared side by side in &lt;a href="https://flashalpha.com/articles/es-futures-vs-spy-spx-gamma-comparison" rel="noopener noreferrer"&gt;ES futures vs SPY/SPX gamma&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What The Proxy Can and Cannot Tell You
&lt;/h2&gt;

&lt;p&gt;Being explicit about the edges keeps the backtest honest:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It is not the ES options-on-futures tape.&lt;/strong&gt; ES has its own open interest and its own 0DTE behavior. The &lt;em&gt;regime&lt;/em&gt; transfers; the exact ES per-strike OI in the past does not. For strategies that hinge on ES-specific micro-positioning, treat the proxy as regime context, not ground truth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The overnight session is only on the future.&lt;/strong&gt; ES gamma is live through the near-24-hour Globex session; the cash proxy is a regular-hours book. Backtest the regime on RTH cash, but remember the live future is what is active at 4 a.m. ET.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The basis is time-varying.&lt;/strong&gt; Use the basis as of each point in time, not a constant, especially across a quarterly roll.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native futures replay is on the roadmap.&lt;/strong&gt; When options-on-futures history lands in the replay engine, the same &lt;code&gt;?at=&lt;/code&gt; pattern will work directly on &lt;code&gt;ES=F&lt;/code&gt; / &lt;code&gt;NQ=F&lt;/code&gt; and this proxy step becomes optional.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Backtesting futures gamma is a solved problem if you frame it correctly: options-on-futures history is thin, but ES gamma is the S&amp;amp;P 500 complex's gamma and NQ gamma is the Nasdaq-100's, so you research the edge on the deep cash-index history (SPY/SPX for ES, QQQ/NDX for NQ, minute-resolution since April 2018), translate levels through the basis, and execute on the live &lt;code&gt;ES=F&lt;/code&gt; / &lt;code&gt;NQ=F&lt;/code&gt; book.&lt;/p&gt;

&lt;p&gt;See live futures gamma on &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;, and the &lt;a href="https://flashalpha.com/docs" rel="noopener noreferrer"&gt;API docs&lt;/a&gt; for the full field reference on both hosts.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Questions on the replay engine or the proxy approach? Drop a comment or find us on &lt;a href="https://discord.gg/UtH22J8df2" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>quant</category>
      <category>python</category>
      <category>api</category>
      <category>trading</category>
    </item>
    <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>
  </channel>
</rss>
