<?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>FlashAlpha vs LSEG Workspace (Refinitiv Eikon) 2026 - Options Data</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Thu, 20 Aug 2026 10:32:35 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/flashalpha-vs-lseg-workspace-refinitiv-eikon-2026-options-data-fjm</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/flashalpha-vs-lseg-workspace-refinitiv-eikon-2026-options-data-fjm</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://flashalpha.com/articles/flashalpha-vs-lseg-refinitiv-workspace-options-data" rel="noopener noreferrer"&gt;flashalpha.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Refinitiv Eikon was retired on 30 June 2025 and replaced by LSEG Workspace. Forced migrations are the moment desks audit what they are paying for, which is usually why this comparison comes up: someone is re-papering a Workspace contract and asking whether the options research it is meant to support is actually being supported.&lt;/p&gt;

&lt;p&gt;The honest answer is that Workspace and FlashAlpha barely overlap. One is a multi-asset workstation, the other is a single computed analytics layer. What follows is where the seam actually falls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full disclosure:&lt;/strong&gt; I built FlashAlpha. LSEG is a vastly broader business than mine and I will be direct about where Workspace is the correct purchase.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;LSEG Workspace&lt;/th&gt;
&lt;th&gt;FlashAlpha&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Product shape&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-asset terminal plus data feeds and an Excel add-in&lt;/td&gt;
&lt;td&gt;Options analytics API, no terminal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Coverage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Global equities, FX, fixed income, commodities, macro, Reuters news&lt;/td&gt;
&lt;td&gt;US equity / ETF / index options and CME futures options&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Options data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prices, chains, per-contract greeks and implied vols&lt;/td&gt;
&lt;td&gt;Aggregated dealer positioning: GEX, DEX, VEX, CHEX, gamma flip, walls, max pain, regime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Volatility surfaces&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Available within the platform's analytics&lt;/td&gt;
&lt;td&gt;SVI-calibrated with raw parameters and arbitrage flags&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Programmatic access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Data Library / Workspace APIs, entitlement-gated per subscription&lt;/td&gt;
&lt;td&gt;REST, commercial WebSocket streaming, MCP server, five SDKs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Point-in-time analytics replay&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Price history yes; derived positioning analytics, no&lt;/td&gt;
&lt;td&gt;51 analytics routes, any minute in the symbol's window, back to 2017-01-03 on the longest-covered names, via &lt;code&gt;?at=&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Quote-based per seat, data entitlements charged separately&lt;/td&gt;
&lt;td&gt;Published self-serve tiers plus quoted commercial tiers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Permanent self-serve free tier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No. LSEG offers sales-led trials, but no open free tier&lt;/td&gt;
&lt;td&gt;Yes. 5 requests / day, no card, no expiry&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The entitlement model is the thing to understand
&lt;/h2&gt;

&lt;p&gt;Workspace pricing is not one number, and this trips up budgeting more than anything else. There is a base platform licence per user, and then &lt;strong&gt;data entitlements are charged separately by asset class and geography&lt;/strong&gt;. Two colleagues on nominally the same Workspace can have materially different data access depending on what their firm entitled them to.&lt;/p&gt;

&lt;p&gt;For options research specifically, that has a practical consequence: whether you can pull the US options chain you need, at the depth you need, is a contract question rather than a product question. Teams routinely discover mid-project that the entitlement they have covers the underlying but not the derivatives at the granularity the study assumed, and the fix is a procurement cycle rather than a code change.&lt;/p&gt;

&lt;p&gt;FlashAlpha's equivalent constraint is simpler and visible up front: tiers gate which endpoints you can call, the limits are published, and the response headers tell you where you stand. Narrower product, but you can see the whole shape of it before you buy.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each one actually computes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  LSEG Workspace
&lt;/h3&gt;

&lt;p&gt;Workspace gives you options prices, chains, per-contract greeks and implied volatilities, alongside the rest of the multi-asset universe. The analytics are solid and the Excel integration is genuinely good, which matters more than quants like to admit because a great deal of real institutional analysis still happens in a spreadsheet.&lt;/p&gt;

&lt;p&gt;What it does not give you is the aggregation layer. There is no call that returns net gamma exposure by strike under a dealer-sign convention, no gamma flip level, no call or put wall, no charm or vanna exposure aggregate, and no regime classification. Those are a build on top of the chain data, and the build is the seven components covered in &lt;a href="https://flashalpha.com/articles/build-vs-buy-dealer-positioning-infrastructure" rel="noopener noreferrer"&gt;build vs buy&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;FlashAlpha starts where Workspace's options data stops. It publishes the aggregate: per-strike GEX, DEX, VEX and CHEX with a documented dealer-sign convention, gamma flip, call and put walls, max pain, SVI surfaces with raw parameters and arbitrage flags, VRP with z-scores and regime conditioning, and 0DTE analytics. One call returns the computed view rather than the chain you would reduce yourself.&lt;/p&gt;

&lt;p&gt;And it has none of the rest. No FX, no fixed income, no macro, no news, no equities fundamentals, no non-US options. If Workspace is a hundred markets one layer deep, FlashAlpha is one market a hundred layers deep.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the Reuters newsroom and macro history matter
&lt;/h2&gt;

&lt;p&gt;Two Workspace strengths deserve calling out because they have no FlashAlpha equivalent at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reuters news&lt;/strong&gt; is a primary newsroom, not an aggregator, and it is tightly integrated into the platform's instrument context. For anything event-driven, that integration is worth real money.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Macro and cross-asset history&lt;/strong&gt;, including the Datastream lineage, goes back decades across markets FlashAlpha does not touch. If your options signal needs to be conditioned on rates, FX or a macro series, Workspace has that history and FlashAlpha does not.&lt;/p&gt;

&lt;p&gt;A vol desk that wants dealer positioning conditioned on the rates path needs both, and there is no version of this comparison where one replaces the other.&lt;/p&gt;

&lt;h2&gt;
  
  
  History and reproducibility
&lt;/h2&gt;

&lt;p&gt;Workspace has far deeper and far broader price history than FlashAlpha, across far more markets. That is not close.&lt;/p&gt;

&lt;p&gt;The difference is again what is archived. Workspace stores prices. FlashAlpha stores &lt;em&gt;computed analytics&lt;/em&gt; at minute resolution, replayable at any minute inside each symbol's coverage window (75 symbols; 14 back to 2017-01-03, most from 2018, SPX from 2022; check &lt;code&gt;/v1/tickers&lt;/code&gt;), through the same endpoints that serve live data, with a base-URL swap and an &lt;code&gt;?at=&lt;/code&gt; parameter, across 51 mirrored analytics routes. The parity is close rather than total: earnings, screener and structures are live-only, and three historical response schemas differ in shape from their live counterparts. For backtesting a positioning signal that distinction is the whole game: you need the gamma flip level as it stood at 14:12 that day, not a value you recompute afterwards with today's code and today's conventions.&lt;/p&gt;

&lt;p&gt;Reconstructing that from Workspace chain history is possible. It is also the multi-quarter build, and the archive is the component that cannot be accelerated by hiring.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where LSEG Workspace wins
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-asset breadth.&lt;/strong&gt; FX, fixed income, commodities, macro and global equities in one place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reuters news&lt;/strong&gt;, integrated with instrument context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FX and fixed income depth&lt;/strong&gt;, where LSEG is genuinely a category leader rather than a follower.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Excel integration&lt;/strong&gt; that real analysts use daily.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decades of cross-asset history&lt;/strong&gt;, including the Datastream macro lineage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cheaper than Bloomberg&lt;/strong&gt; at comparable breadth, which is much of its commercial case.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global options coverage&lt;/strong&gt;, where FlashAlpha is US-only.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where FlashAlpha wins
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The aggregation layer is pre-computed&lt;/strong&gt;, not left to you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Point-in-time replay of derived analytics&lt;/strong&gt; at minute resolution, back to 2017-01-03 on the longest-covered symbols.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparent limits and entitlements&lt;/strong&gt;, published rather than negotiated per contract.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same contract live and historical&lt;/strong&gt;, so backtest code ships to production unchanged.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluate without procurement.&lt;/strong&gt; Free tier, no card, no sales cycle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Depth in US options specifically&lt;/strong&gt;, including 0DTE, SVI parameters and VRP conditioning that a generalist platform does not carry.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pricing, with sources
&lt;/h2&gt;

&lt;p&gt;LSEG does not publish Workspace pricing; it is quote-based and varies with entitlements, region and negotiated terms. The figures below are widely reported reference ranges as of August 2026, not vendor statements.&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;LSEG Workspace&lt;/th&gt;
&lt;th&gt;FlashAlpha&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Entry&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reduced-functionality tiers reported from around $4,000 / year&lt;/td&gt;
&lt;td&gt;Free: 5 requests / day, no card, no expiry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Typical full seat&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Reported in the $10,000 to $22,000+ / seat / year range depending on package&lt;/td&gt;
&lt;td&gt;Alpha at $1,499 / mo, or $1,199 / mo billed annually&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data entitlements&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Charged separately by asset class and geography&lt;/td&gt;
&lt;td&gt;Included in tier; no separate data fees&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dedicated infrastructure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enterprise feeds quoted separately&lt;/td&gt;
&lt;td&gt;Professional from $2,500 / mo, dedicated node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Streaming&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Real-time feeds, quoted&lt;/td&gt;
&lt;td&gt;From $4,500 / mo, commercial WebSocket&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transparency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Quote-based throughout&lt;/td&gt;
&lt;td&gt;Self-serve tiers published; commercial tiers quoted&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The reported ranges are wide precisely because the entitlement stack dominates the base licence. Treat any single figure sceptically, including these, and price your own quote against what you are actually entitled to pull.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who should not use each
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do not buy FlashAlpha if&lt;/strong&gt; you need multi-asset coverage, news, macro history, non-US options, or a terminal interface for discretionary users. Workspace or a peer is the right purchase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do not expect Workspace to deliver&lt;/strong&gt; aggregated dealer positioning, point-in-time replay of derived options analytics, SVI parameters with arbitrage flags, or an options research feed whose limits you can see without reading a contract. Those are not what it is for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The realistic answer: both, split by job
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LSEG Workspace&lt;/strong&gt; for cross-asset context, macro conditioning, news, FX and rates, and the discretionary desk's screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FlashAlpha&lt;/strong&gt; for the US options positioning layer feeding models, backtests, screens and alerts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are mid-migration from Eikon, that is also the cheapest moment to scope this properly: you are already auditing entitlements, so it is a good time to check whether the options depth you assumed you had is on the contract, and to price the derived layer separately rather than assuming the terminal covers it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it alongside your Workspace entitlement
&lt;/h2&gt;

&lt;p&gt;Single-expiry GEX on a single-name equity is a Free-tier request:&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="s2"&gt;"https://lab.flashalpha.com/v1/exposure/gex/AAPL?expiration=2026-09-18"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: YOUR_KEY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The full exposure summary is the call worth comparing against a Workspace chain, because it returns the aggregation Workspace does not compute. It is a Growth-tier endpoint, and index symbols such as SPX need Basic or above:&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="s2"&gt;"https://lab.flashalpha.com/v1/exposure/summary/SPX"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: YOUR_KEY"&lt;/span&gt;   &lt;span class="c"&gt;# Growth tier&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then replay it at a minute inside an event you remember, and check the level was actually there at the time:&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="s2"&gt;"https://historical.flashalpha.com/v1/exposure/summary/SPX?at=2026-04-07T14:30:00"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: YOUR_KEY"&lt;/span&gt;   &lt;span class="c"&gt;# Alpha tier&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only the first call is free; the summary needs Growth and the replay needs Alpha. Methodology and stated limitations are in the &lt;a href="https://flashalpha.com/methodology" rel="noopener noreferrer"&gt;whitepaper&lt;/a&gt;; the institutional datasheet is at &lt;a href="https://flashalpha.com/institutional" rel="noopener noreferrer"&gt;/institutional&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;p&gt;All figures are as of August 2026. Where a vendor does not publish pricing, the figure is marked as reported rather than stated.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.lseg.com/en/data-analytics/products/eikon-trading-software" rel="noopener noreferrer"&gt;LSEG, Eikon withdrawal and transition to Workspace&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.vendr.com/marketplace/refinitiv" rel="noopener noreferrer"&gt;Vendr, LSEG / Refinitiv pricing data&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Workspace and FlashAlpha are not competitors in any meaningful sense; they sell different things to the same desk. Workspace wins on breadth, news, FX and rates depth, macro history and global coverage, and its commercial case against Bloomberg is real. It does not compute aggregated dealer positioning, and it cannot replay derived options analytics point-in-time. If your options research needs that layer, the choice is not Workspace or FlashAlpha, it is whether you buy the layer or spend several quarters building it on top of chain data you already pay for.&lt;/p&gt;

</description>
      <category>quant</category>
      <category>api</category>
      <category>finance</category>
      <category>options</category>
    </item>
    <item>
      <title>FlashAlpha vs OptionMetrics IvyDB 2026 - Historical Options Data</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Thu, 20 Aug 2026 10:31:45 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/flashalpha-vs-optionmetrics-ivydb-2026-historical-options-data-31cp</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/flashalpha-vs-optionmetrics-ivydb-2026-historical-options-data-31cp</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://flashalpha.com/articles/flashalpha-vs-optionmetrics-ivydb-historical-options" rel="noopener noreferrer"&gt;flashalpha.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is the comparison I get asked about most by people who actually do research, and it is the one most often described badly. IvyDB is routinely dismissed as "end-of-day only", which is &lt;strong&gt;wrong&lt;/strong&gt;: OptionMetrics has shipped intraday products for years. The real distinction is subtler and more useful, and it comes down to what is stored and how it is delivered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full disclosure:&lt;/strong&gt; I built FlashAlpha. OptionMetrics has been the standard in this field since 1999 and my data does not go back nearly as far. I will be precise about that.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;OptionMetrics IvyDB&lt;/th&gt;
&lt;th&gt;FlashAlpha&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Product shape&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Historical research dataset, delivered in bulk&lt;/td&gt;
&lt;td&gt;Live API; history via the same endpoints across 51 mirrored routes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;History depth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;EOD from January 1996, about 30 years&lt;/td&gt;
&lt;td&gt;Minute resolution, per-symbol windows; longest from 2017-01-03, about 9 years&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Intraday&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes: fixed snapshots at 10:00, 14:00 and 15:45 ET, from January 2018&lt;/td&gt;
&lt;td&gt;Continuous minute resolution, any minute of the session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What is stored&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prices, standardised implied vols, per-contract greeks, signed volume&lt;/td&gt;
&lt;td&gt;Computed aggregates: GEX, DEX, VEX, CHEX, gamma flip, walls, max pain, regime, SVI, VRP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Real-time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No. It is a research archive&lt;/td&gt;
&lt;td&gt;Yes. Near-real-time snapshots, plus commercial streaming&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Delivery&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bulk files, WRDS, Snowflake&lt;/td&gt;
&lt;td&gt;REST, WebSocket, MCP, five SDKs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Geography&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;US plus Canada, Europe, Asia-Pacific and global indices&lt;/td&gt;
&lt;td&gt;US equities / ETFs / indices and CME futures options&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Quote only; discounted academic licence&lt;/td&gt;
&lt;td&gt;Free tier, self-serve tiers, quoted commercial tiers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What IvyDB actually contains, accurately
&lt;/h2&gt;

&lt;p&gt;Correcting the common mischaracterisation, the IvyDB family is broader than one dataset:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IvyDB US&lt;/strong&gt;: a complete end-of-day record of every US exchange-traded equity and index option, including options on ETFs and ADRs, from &lt;strong&gt;January 1996&lt;/strong&gt;. Prices, standardised implied volatilities and option sensitivities, computed consistently across the whole history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IvyDB US Intraday&lt;/strong&gt;: snapshots of option prices and their corresponding volatility calculations at &lt;strong&gt;10:00, 14:00 and 15:45 ET&lt;/strong&gt;, from &lt;strong&gt;January 2018&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IvyDB Signed Volume&lt;/strong&gt;: intraday buy / sell pressure in five- and thirty-minute snapshots plus end-of-day, from &lt;strong&gt;January 2016&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IvyDB ETF&lt;/strong&gt;: separately marketed coverage of options on US-listed ETFs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IvyDB Futures&lt;/strong&gt;: historical futures option prices for US and EU futures markets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IvyDB Canada, Europe, Asia-Pacific and Global Indices&lt;/strong&gt;: international coverage FlashAlpha does not have at all. OptionMetrics also ships IvyDB Beta and IvyDB Implied Dividend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Signed Volume deserves particular note, because it is the IvyDB product closest to what FlashAlpha does. It classifies trading into buy and sell pressure, which is genuinely adjacent to flow analytics, and it goes back to 2016. If your question is "was volume in this name buyer or seller initiated in 2017", IvyDB answers it and FlashAlpha's flow history does not reach that far.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real difference: stored values versus stored inputs
&lt;/h2&gt;

&lt;p&gt;Here is the distinction that actually matters, and it is not depth or resolution.&lt;/p&gt;

&lt;p&gt;IvyDB stores &lt;strong&gt;inputs&lt;/strong&gt;: prices, implied vols, per-contract greeks, signed volume. Excellent inputs, computed with a consistent and well-documented methodology, which is precisely why it is the peer-review standard. But if you want net gamma exposure by strike, a gamma flip level, a call wall, a regime classification, or a charm and vanna exposure profile, &lt;em&gt;you compute those yourself from IvyDB&lt;/em&gt;. The dataset does not carry them.&lt;/p&gt;

&lt;p&gt;FlashAlpha stores &lt;strong&gt;outputs&lt;/strong&gt;: the aggregates themselves, already reduced under an explicit and documented dealer-sign convention, at every minute. That is the entire product.&lt;/p&gt;

&lt;p&gt;Both positions are defensible and the trade-off is real:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Storing inputs preserves your methodological freedom.&lt;/strong&gt; If your dealer-positioning assumptions are your edge, IvyDB lets you express them and FlashAlpha makes you adopt mine. For a fund whose alpha &lt;em&gt;is&lt;/em&gt; the positioning model, that is decisive, and it is the honest reason to choose IvyDB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storing outputs removes a build and a class of look-ahead bugs.&lt;/strong&gt; Recomputing 2019 analytics from 2019 inputs using 2026 code is where point-in-time integrity quietly dies. The value you backtest should be the value that existed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Three snapshots a day versus every minute
&lt;/h2&gt;

&lt;p&gt;IvyDB US Intraday is real, but it is three fixed snapshots: 10:00, 14:00 and 15:45 ET. For a great many research questions that is entirely sufficient, and for term-structure or surface work it is often all you need.&lt;/p&gt;

&lt;p&gt;It is not sufficient for anything whose thesis is about intraday path. A 0DTE gamma study, a question about how positioning shifted through a Fed statement at 14:00, or a signal that fires on a gamma flip crossing during the session, all need the minutes between the snapshots. 15:45 is also a slightly awkward stopping point for anything concerned with the closing auction and end-of-day hedging.&lt;/p&gt;

&lt;p&gt;The framing I would use: &lt;strong&gt;IvyDB samples the day, FlashAlpha traces it.&lt;/strong&gt; Which you need is a property of your research question, not a quality ranking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Research archive versus production feed
&lt;/h2&gt;

&lt;p&gt;This is the difference people notice last and feel most.&lt;/p&gt;

&lt;p&gt;IvyDB is delivered as bulk data: files, WRDS, or Snowflake. That is a good fit for research. You load it, you query it, you write the paper or the backtest. It is not a production feed, and it is not meant to be. There is no real-time IvyDB endpoint you point a live strategy at.&lt;/p&gt;

&lt;p&gt;FlashAlpha is a live API where history is the same API. The endpoints that serve the current gamma flip level serve the one from 2019-08-14T14:22 with an &lt;code&gt;?at=&lt;/code&gt; parameter and a base-URL swap. The practical consequence is that &lt;strong&gt;the code you backtested is the code that trades&lt;/strong&gt;, with no reimplementation step between research and production, and no chance of the two drifting apart.&lt;/p&gt;

&lt;p&gt;If you research on IvyDB and trade on something else, that reimplementation gap is real work and a real source of bugs. That is not a criticism of IvyDB, it is a consequence of it being a research archive, which is what it is for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The academic licence detail worth knowing
&lt;/h2&gt;

&lt;p&gt;OptionMetrics offers academic institutions a substantially discounted IvyDB licence. Academic distributions have historically refreshed on a slower cadence than the nightly corporate feed. OptionMetrics described an annual academic refresh when it extended IvyDB Europe licensing to universities, but treat the exact cadence as something to confirm with your librarian or with OptionMetrics rather than as a current universal rule, because it varies by product and by distribution channel.&lt;/p&gt;

&lt;p&gt;For historical research the lag is irrelevant, which is why it suits universities so well. For anything current it matters: a dataset refreshed on an annual cycle cannot support a study window that includes recent months, and cannot support anything operational. If you are at an institution with IvyDB access and wondering why your data stops well short of today, the refresh cadence is the usual explanation. It is a licence tier, not a fault.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where OptionMetrics wins
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Thirty years of history.&lt;/strong&gt; January 1996, every name. FlashAlpha's archive is 75 symbols, the longest-covered 14 starting 2017-01-03 and most of the rest in 2018. For anything touching the dot-com unwind, 2008, or the 2010 flash crash, IvyDB is the only one of the two that can answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is the peer-review standard.&lt;/strong&gt; If your work will be published or shown to allocators, "we used IvyDB" is understood and accepted without further argument.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Methodological freedom.&lt;/strong&gt; Raw inputs mean your conventions, your filtering, your dealer assumptions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global coverage.&lt;/strong&gt; Canada, Europe, Asia-Pacific and global indices, plus EU futures options. FlashAlpha is US-only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signed volume back to 2016&lt;/strong&gt;, predating FlashAlpha's flow history.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reference-quality standardised surfaces&lt;/strong&gt;, consistent across three decades, which is genuinely hard to do.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snowflake delivery&lt;/strong&gt;, which suits firms whose research stack already lives there.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where FlashAlpha wins
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Continuous minute resolution&lt;/strong&gt; rather than three fixed daily snapshots.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The aggregation is already done&lt;/strong&gt;, with a published convention and stated limitations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is a live feed.&lt;/strong&gt; Research and production share one API and one contract.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Point-in-time by construction&lt;/strong&gt;, because the analytic was computed and stored at the time, not recomputed later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regime, walls, flip levels, VRP z-scores and SVI parameters&lt;/strong&gt; exist as first-class fields rather than as a project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can evaluate it in five minutes&lt;/strong&gt; on a free tier with no card and no procurement.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;OptionMetrics does not publish pricing; IvyDB is quoted per institution and varies with products, history depth and delivery method. Anyone quoting you a specific public IvyDB number is guessing, so this page will not. What is publicly documented is the structure:&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;OptionMetrics IvyDB&lt;/th&gt;
&lt;th&gt;FlashAlpha&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Quote only, per institution&lt;/td&gt;
&lt;td&gt;Published self-serve tiers, quoted commercial tiers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Permanent self-serve free tier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes: 5 requests / day, no card, no expiry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Academic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Substantially discounted; refreshed yearly, not nightly&lt;/td&gt;
&lt;td&gt;No separate academic tier; free tier is open to anyone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-serve&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes, to Alpha at $1,499 / mo (or $1,199 / mo billed annually)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dedicated node&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not applicable, bulk delivery&lt;/td&gt;
&lt;td&gt;Professional from $2,500 / mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Streaming&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not offered, research archive&lt;/td&gt;
&lt;td&gt;From $4,500 / mo, commercial WebSocket&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Who should not use each
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do not buy FlashAlpha if&lt;/strong&gt; your research needs pre-2017 history, non-US markets, per-contract granularity with your own conventions, or publication-standard provenance. Buy IvyDB. If your positioning methodology is itself your edge, buy IvyDB and build on it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do not buy IvyDB if&lt;/strong&gt; you need a real-time feed, continuous intraday resolution, or you want the aggregates without a build. It is an outstanding research archive and a poor production dependency, because it was never meant to be one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The combination that actually makes sense
&lt;/h2&gt;

&lt;p&gt;These two compose unusually well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IvyDB for the long sample.&lt;/strong&gt; Establish that an effect exists across three decades and several regimes, with methodology you control and provenance you can defend.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FlashAlpha for the live implementation.&lt;/strong&gt; Once the effect is established, trade it against a feed that computes the same aggregates every minute and replays them identically.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The reconciliation between them is worth doing on its own merits. Compute your GEX from IvyDB for an overlapping date and compare it to FlashAlpha's. Where they disagree you learn something real, either about my conventions or about yours, and two independent computations that agree is a much stronger position than one you cannot check.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the overlap
&lt;/h2&gt;

&lt;p&gt;Pick a date you already have in IvyDB and pull the same moment from FlashAlpha:&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="s2"&gt;"https://historical.flashalpha.com/v1/exposure/gex/SPY?at=2019-08-14T14:00:00"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: YOUR_KEY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;at&lt;/code&gt; parameter is ET, so &lt;code&gt;14:00:00&lt;/code&gt; lands exactly on one of IvyDB's three intraday snapshots, which makes it a clean reconciliation point. Replay is Alpha tier and served from &lt;code&gt;historical.flashalpha.com&lt;/code&gt;. The &lt;a href="https://flashalpha.com/methodology" rel="noopener noreferrer"&gt;methodology whitepaper&lt;/a&gt; documents the dealer-sign convention and its stated limitations, so you can see exactly which assumptions you would be adopting before you adopt any of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;p&gt;All figures are as of August 2026.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://optionmetrics.com/data-products/" rel="noopener noreferrer"&gt;OptionMetrics, data products&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://optionmetrics.com/united-states-intraday/" rel="noopener noreferrer"&gt;OptionMetrics, IvyDB US Intraday&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://optionmetrics.com/signed-volume/" rel="noopener noreferrer"&gt;OptionMetrics, IvyDB Signed Volume&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://optionmetrics.com/about-us/" rel="noopener noreferrer"&gt;OptionMetrics, about&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wrds-www.wharton.upenn.edu/pages/about/data-vendors/optionmetrics/" rel="noopener noreferrer"&gt;WRDS, OptionMetrics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;IvyDB and FlashAlpha are not really competitors, they are different halves of a research programme. IvyDB gives you thirty years, global coverage, methodological freedom and provenance that survives peer review; it does not give you a live feed, continuous intraday resolution, or the aggregates without a build. FlashAlpha gives you the computed layer every minute since 2017, live and historical through one API; it does not give you 1996, non-US markets, or the freedom to substitute your own conventions. If you are choosing on depth alone you will pick IvyDB, and you may well be right. If you are choosing on whether research and production can share one code path, that is the case for the other side.&lt;/p&gt;

</description>
      <category>quant</category>
      <category>api</category>
      <category>finance</category>
      <category>datascience</category>
    </item>
    <item>
      <title>FlashAlpha vs Bloomberg Terminal 2026 - Options Analytics for Quants</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Thu, 20 Aug 2026 10:28:24 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/flashalpha-vs-bloomberg-terminal-2026-options-analytics-for-quants-1m3l</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/flashalpha-vs-bloomberg-terminal-2026-options-analytics-for-quants-1m3l</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://flashalpha.com/articles/flashalpha-vs-bloomberg-terminal-options-analytics" rel="noopener noreferrer"&gt;flashalpha.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you are comparing these two, you are probably not choosing between them. Most desks that run FlashAlpha also have Bloomberg in the building. The useful question is narrower: &lt;strong&gt;can the terminal you already pay for feed your systematic options research?&lt;/strong&gt; Usually it cannot, and the reason is quotas rather than quality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full disclosure:&lt;/strong&gt; I built FlashAlpha. Bloomberg is a far larger and broader product than mine, and I will be specific about where it wins, because pretending otherwise would waste your time.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Bloomberg Terminal&lt;/th&gt;
&lt;th&gt;FlashAlpha&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary consumer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A person reading a screen&lt;/td&gt;
&lt;td&gt;A model reading an API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Asset class breadth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Everything: equities, rates, FX, credit, commodities, news, chat, execution&lt;/td&gt;
&lt;td&gt;US equity / ETF / index options and CME futures options only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Options analytics&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Per-contract greeks, vol surfaces, pricers (OMON, OVDV, OVME)&lt;/td&gt;
&lt;td&gt;Aggregated dealer positioning: GEX, DEX, VEX, CHEX, gamma flip, call / put wall, max pain, regime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Programmatic access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;BLPAPI bundled with the seat, quota-metered; firm-scale access is a separate product (B-PIPE, Data License)&lt;/td&gt;
&lt;td&gt;REST, commercial WebSocket streaming, MCP server; SDKs for Python, JS, C#, Go, Java&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Published usage limits&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not disclosed by Bloomberg; no programmatic way to check remaining quota&lt;/td&gt;
&lt;td&gt;Published per-tier request limits, returned in response headers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Point-in-time replay&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Historical prices yes; the derived analytics layer, no&lt;/td&gt;
&lt;td&gt;51 analytics routes replayable at any minute in the symbol's window; longest run back to 2017-01-03 via &lt;code&gt;?at=&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;List price&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$31,980 / year per seat (single), $28,320 / seat / year multi-seat, 2-year minimum&lt;/td&gt;
&lt;td&gt;Free tier, self-serve to $1,499 / mo, Professional from $2,500 / mo, Enterprise custom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Permanent self-serve free tier&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No. Trials and demos are sales-led&lt;/td&gt;
&lt;td&gt;Yes. 5 requests / day, no card, no expiry&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The quota problem, which is the whole argument
&lt;/h2&gt;

&lt;p&gt;This is the part that decides it, so it goes first rather than last.&lt;/p&gt;

&lt;p&gt;A Bloomberg seat bundles BLPAPI, the programmatic interface you can drive from Excel or Python. That sounds like it solves systematic access, and for modest jobs it does. But the seat is metered, and the meter is built for a human's incidental data pulls rather than for a research pipeline. The limits consistently documented by university library guides, which are the most reliable public source because Bloomberg itself does not publish them, are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Roughly 500,000 data points per day&lt;/strong&gt;, where one "hit" is a single security / field pair.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No more than 3,500 real-time fields open concurrently.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A monthly limit on unique securities&lt;/strong&gt; derived from a proprietary model. Published university guidance disagrees on the number, ranging from roughly 2,500 to 7,000 unique identifiers per month depending on which institution's guide you read, which is itself the clearest evidence that Bloomberg does not publish it. Intraday data is weighted more heavily than end-of-day.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now put a real research job against that. A single day of per-strike analytics on the US options market touches far more than 5,000 unique contracts, because &lt;em&gt;each strike and expiry is its own identifier&lt;/em&gt;. One liquid underlying alone can carry several thousand live contracts across the chain. A cross-sectional study over a few hundred names does not brush the monthly limit, it exhausts it in an afternoon.&lt;/p&gt;

&lt;p&gt;The second problem is worse, and it is the one quants underrate:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Bloomberg does not state the explicit limits, and there is no programmatic way to discover what your limits are or how much of them you have consumed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To be fair to Bloomberg, the failure is not silent: Excel and the API return explicit codes, &lt;code&gt;#N/A Limit&lt;/code&gt; for the concurrent-subscription ceiling, &lt;code&gt;#N/A Daily Capacity&lt;/code&gt; for the daily cap, &lt;code&gt;#N/A Mth Lmt&lt;/code&gt; for the monthly one. You will know when you hit it.&lt;/p&gt;

&lt;p&gt;The problem is that you can only find the ceiling by hitting it. There is no counter to read &lt;em&gt;before&lt;/em&gt; you start, so a large backfill cannot be planned against its own budget: it runs until it stops, and the stop lands mid-job. A study that ran in March can fail in April because a colleague on the same licence spent the shared allowance first. That is not a data quality problem, it is an operational one, and no amount of budget fixes it while the access model stays per-seat.&lt;/p&gt;

&lt;p&gt;Scoped precisely: &lt;strong&gt;market-wide, high-volume options-chain backfills are operationally unreliable on the Desktop API.&lt;/strong&gt; Smaller and more predictable jobs are fine, and plenty of desks run them happily.&lt;/p&gt;

&lt;p&gt;This is not a criticism of Bloomberg's design. The terminal is licensed to a person, and the quota exists precisely to stop a seat becoming a firm-wide data feed. Bloomberg sells that separately, and openly, which is the next section.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Bloomberg does offer for firm-scale access
&lt;/h2&gt;

&lt;p&gt;It would be wrong to say Bloomberg has no programmatic path. It has two, and they are real products:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;B-PIPE&lt;/strong&gt;: the consolidated, normalised real-time market data feed, licensed for internal applications including non-display and black-box use. This is the correct product if you need Bloomberg's real-time prices inside your own systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data License&lt;/strong&gt;: bulk and REST enterprise delivery for trading, risk, compliance and operations workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are negotiated separately from the terminal seat, priced on data fields, exchanges, redistribution rights and consuming applications, and both require a signed licensing agreement. Neither is included in the $31,980 seat.&lt;/p&gt;

&lt;p&gt;Two things follow. First, if you were hoping the seat you already pay for covers systematic access, it does not, and the enterprise products are a separate budget conversation. Second, and more to the point: &lt;strong&gt;even at full enterprise scale, Bloomberg ships prices, greeks and surfaces, not aggregated dealer positioning.&lt;/strong&gt; B-PIPE gives you the inputs. Whether GEX, gamma flip, or a charm-and-vanna exposure profile exists at the end of the pipeline is still a build you own.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each one actually computes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Bloomberg
&lt;/h3&gt;

&lt;p&gt;Bloomberg's options stack is genuinely strong and aimed at a trader with a screen. &lt;code&gt;OMON&lt;/code&gt; gives the option monitor across the chain. &lt;code&gt;OVDV&lt;/code&gt; gives the volatility surface. &lt;code&gt;OVME&lt;/code&gt; prices and values multi-leg structures. The greeks and implied vols behind them are well-constructed and widely trusted as a reference.&lt;/p&gt;

&lt;p&gt;What it does not do is aggregate the market into a positioning view. There is no single call that returns net gamma exposure by strike under a dealer-sign convention, no gamma flip level, no call wall or put wall, no regime classification, and no charm or vanna exposure aggregate. If you want those from Bloomberg, you pull the chain and build them, which lands you back on the quota.&lt;/p&gt;

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

&lt;p&gt;FlashAlpha computes exactly that derived layer and nothing else. Per-strike GEX, DEX, VEX and CHEX with an explicit, documented dealer-sign convention; gamma flip; call and put walls; max pain; SVI-calibrated surfaces with raw parameters and arbitrage flags; VRP with z-scores and regime conditioning; and 0DTE analytics. One call returns the aggregate rather than the several thousand contracts you would otherwise reduce yourself.&lt;/p&gt;

&lt;p&gt;The narrowness is the point and also the limitation. FlashAlpha has no fundamentals, no news, no chat, no execution, no FX or credit, and no non-US options. It is one layer, deep.&lt;/p&gt;

&lt;h2&gt;
  
  
  History and reproducibility
&lt;/h2&gt;

&lt;p&gt;Bloomberg has decades of price history and it goes far deeper than FlashAlpha's 2017 start. For pre-2017 work, or for anything outside US options, Bloomberg wins outright and it is not close.&lt;/p&gt;

&lt;p&gt;The distinction is what is stored. Bloomberg archives &lt;em&gt;prices&lt;/em&gt;. FlashAlpha archives &lt;em&gt;computed analytics&lt;/em&gt;, at minute resolution, replayable at any minute inside each symbol's coverage window. Coverage is per symbol: the archive holds 75 symbols, 14 of them back to 2017-01-03 (SPY, QQQ, IWM, TSLA, NVDA, MSFT, NFLX, AMZN, GOOG, AMD, INTC, MSTR, T and TLT), most of the rest from 2018, and SPX from 2022. Check &lt;code&gt;/v1/tickers&lt;/code&gt; for the exact window before assuming a date is queryable. That matters for one specific reason: a backtest of a positioning signal needs the positioning value as it stood at 10:47 on a given day, not a reconstruction you assemble later from prices using today's code and today's assumptions. On FlashAlpha the same endpoints serve live and historical through a base-URL swap and an &lt;code&gt;?at=&lt;/code&gt; parameter, so the code you backtested is the code that runs in production.&lt;/p&gt;

&lt;p&gt;You could rebuild that from Bloomberg price history. It is the seven-component build covered in &lt;a href="https://flashalpha.com/articles/build-vs-buy-dealer-positioning-infrastructure" rel="noopener noreferrer"&gt;build vs buy&lt;/a&gt;, and the archive is the part that cannot be compressed by hiring.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Bloomberg wins, plainly
&lt;/h2&gt;

&lt;p&gt;These are not concessions, they are the reasons Bloomberg is on nearly every institutional desk:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Breadth.&lt;/strong&gt; Every asset class, globally, in one place. FlashAlpha covers one slice of one market.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;News and research.&lt;/strong&gt; Bloomberg's newsroom is a genuine product, not a feed reseller. There is no equivalent at any price.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The network.&lt;/strong&gt; Bloomberg chat is where counterparties actually are. That is a moat no data vendor can attack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution and workflow.&lt;/strong&gt; Order management, portfolio analytics, compliance. FlashAlpha is a read-only analytics API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Depth of history and global coverage.&lt;/strong&gt; Decades, everywhere. FlashAlpha is US options since 2017.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is the lingua franca.&lt;/strong&gt; When your risk report disagrees with a counterparty, quoting a Bloomberg screen ends the argument.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bundled and predictable.&lt;/strong&gt; Hardware, software, data, news and support in one number, with no add-on data fees on the seat.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where FlashAlpha wins
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The analytics layer exists.&lt;/strong&gt; Aggregated dealer positioning is pre-computed rather than left as an exercise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Access is designed for machines.&lt;/strong&gt; Published limits, returned in headers, with no undisclosed monthly model to plan around.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Point-in-time replay of the analytics themselves&lt;/strong&gt;, at minute resolution, back to 2017-01-03 on the longest-covered symbols.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost per model, not per human.&lt;/strong&gt; A dedicated node serves your whole research team rather than metering one person's screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can evaluate it today&lt;/strong&gt; without a salesperson, a two-year commitment, or a card.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pricing, with sources
&lt;/h2&gt;

&lt;p&gt;Bloomberg does not publish terminal pricing. The figures below are as reported by &lt;a href="https://connect.neugroup.com/public/blogs/bloomberg-terminals-how-much-more-youll-pay-next-year" rel="noopener noreferrer"&gt;NeuGroup&lt;/a&gt; for 2026 and should be treated as reference points rather than vendor statements. Your negotiated number will differ.&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;Bloomberg Terminal&lt;/th&gt;
&lt;th&gt;FlashAlpha&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Entry&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No free or trial tier&lt;/td&gt;
&lt;td&gt;Free: 5 requests / day, no card, no expiry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-serve&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not available&lt;/td&gt;
&lt;td&gt;Basic and Growth tiers, up to Alpha at $1,499 / mo (or $1,199 / mo billed annually)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Single seat / node&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$31,980 / year (about $2,665 / mo)&lt;/td&gt;
&lt;td&gt;Professional from $2,500 / mo, dedicated node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-seat&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$28,320 / seat / year&lt;/td&gt;
&lt;td&gt;Node serves the team; no per-user metering&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Streaming&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;B-PIPE, negotiated separately&lt;/td&gt;
&lt;td&gt;From $4,500 / mo, commercial WebSocket&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Commitment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Two-year minimum, billed quarterly in advance&lt;/td&gt;
&lt;td&gt;Monthly or annual&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The comparison people reach for is "$2,665 a month against $2,500 a month, roughly the same". That framing is wrong in both directions. A Bloomberg seat buys a person every asset class on earth plus news, chat and execution. A FlashAlpha node buys your &lt;em&gt;models&lt;/em&gt; one analytics layer with no per-user meter. They are not substitutes, and the per-month similarity is a coincidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who should not use each
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Do not buy FlashAlpha if&lt;/strong&gt; you need multi-asset coverage, news, execution, pre-2017 history, non-US options, or your consumer is a discretionary trader who wants a screen. Buy or keep Bloomberg.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do not rely on a Bloomberg seat if&lt;/strong&gt; your consumer is a model, you need aggregated dealer positioning, you need to replay derived analytics point-in-time, or you need a data access path whose limits you can actually see. The seat will not do it, and the enterprise products solve the access problem without solving the analytics one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The realistic answer: both
&lt;/h2&gt;

&lt;p&gt;Nearly every desk running FlashAlpha keeps Bloomberg. The split that works in practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bloomberg&lt;/strong&gt; for discretionary work, cross-asset context, news, counterparty comms, execution, and as the reference number when someone disputes a mark.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FlashAlpha&lt;/strong&gt; as the machine-readable positioning layer feeding models, backtests, screens and alerts, where the quota is published and the history replays.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is a second, underrated benefit: two independent computations that agree is a much stronger position than one you cannot verify. Reconciling a FlashAlpha surface against &lt;code&gt;OVDV&lt;/code&gt; surfaces real problems in both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it against your Bloomberg screen
&lt;/h2&gt;

&lt;p&gt;Single-expiry GEX on a single-name equity is a Free-tier request, so this runs on a new key with no card:&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="s2"&gt;"https://lab.flashalpha.com/v1/exposure/gex/AAPL?expiration=2026-09-18"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: YOUR_KEY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compare that to the same expiry on &lt;code&gt;OMON&lt;/code&gt; and check the per-strike gamma agrees. To pull the whole chain in one call, drop the &lt;code&gt;?expiration=&lt;/code&gt; filter. That is full-chain GEX and needs Growth. ETFs and index symbols such as SPY, QQQ and SPX need Basic or above:&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="s2"&gt;"https://lab.flashalpha.com/v1/exposure/gex/SPY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: YOUR_KEY"&lt;/span&gt;   &lt;span class="c"&gt;# full chain + ETF: Growth tier&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Point-in-time replay is Alpha tier and lives on a separate host. This is the call that has no Bloomberg equivalent:&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="s2"&gt;"https://historical.flashalpha.com/v1/exposure/gex/SPY?at=2026-04-07T14:30:00"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: YOUR_KEY"&lt;/span&gt;   &lt;span class="c"&gt;# Alpha tier&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Methodology and its stated limitations are in the &lt;a href="https://flashalpha.com/methodology" rel="noopener noreferrer"&gt;whitepaper&lt;/a&gt;, and the institutional datasheet is at &lt;a href="https://flashalpha.com/institutional" rel="noopener noreferrer"&gt;/institutional&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;p&gt;All figures are as of August 2026. Where a vendor does not publish pricing, the figure is marked as reported rather than stated.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://connect.neugroup.com/public/blogs/bloomberg-terminals-how-much-more-youll-pay-next-year" rel="noopener noreferrer"&gt;NeuGroup, Bloomberg Terminals: How Much More You'll Pay Next Year&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://guides.library.columbia.edu/bloomberg/downloadlimit" rel="noopener noreferrer"&gt;Columbia University Libraries, Bloomberg data download limits&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.bloomberg.com/professional/support/api-library" rel="noopener noreferrer"&gt;Bloomberg, API Library&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bloomberg is not the competitor a computed-analytics API displaces, and any page claiming otherwise is selling you something. The terminal wins on breadth, news, the network and institutional standing, and it is the right tool when a human is the consumer. It loses when the consumer is a model, for one structural reason: a per-seat licence with an undisclosed, unqueryable quota cannot underwrite a research pipeline. That is a licensing shape, not a quality gap, and it is why the two sit next to each other on most desks rather than replacing one another.&lt;/p&gt;

</description>
      <category>quant</category>
      <category>api</category>
      <category>finance</category>
      <category>options</category>
    </item>
    <item>
      <title>Bitcoin ETF vs CME vs Offshore Options: Which Book Should You Read?</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Mon, 17 Aug 2026 09:40:32 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/bitcoin-etf-vs-cme-vs-offshore-options-which-book-should-you-read-3654</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/bitcoin-etf-vs-cme-vs-offshore-options-which-book-should-you-read-3654</guid>
      <description>&lt;p&gt;The most common mistake in crypto positioning analysis is aggregation. People add CME gamma to ETF gamma to offshore gamma and quote a single "bitcoin GEX" figure. That number is not wrong so much as meaningless, because the hedging flows behind its components are executed in different instruments, by different firms, and never meet.&lt;/p&gt;

&lt;p&gt;The fix is to stop aggregating and start selecting. Here is how.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Four Books
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Spot ETF options&lt;/th&gt;
&lt;th&gt;CME options on futures&lt;/th&gt;
&lt;th&gt;Equity proxies&lt;/th&gt;
&lt;th&gt;Offshore&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Examples&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IBIT, ETHA, FBTC&lt;/td&gt;
&lt;td&gt;BTC=F, ETH=F&lt;/td&gt;
&lt;td&gt;MSTR, COIN, MARA&lt;/td&gt;
&lt;td&gt;Offshore venues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hedged by trading&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ETF shares&lt;/td&gt;
&lt;td&gt;CME futures&lt;/td&gt;
&lt;td&gt;The equity&lt;/td&gt;
&lt;td&gt;Coin or perp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Black-Scholes, spot&lt;/td&gt;
&lt;td&gt;Black-76, forward&lt;/td&gt;
&lt;td&gt;Black-Scholes, spot&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Settlement&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Physical, shares&lt;/td&gt;
&lt;td&gt;Cash&lt;/td&gt;
&lt;td&gt;Physical, shares&lt;/td&gt;
&lt;td&gt;Coin or perp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Structural tilt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Overwriting, dealers long gamma&lt;/td&gt;
&lt;td&gt;Basis and macro hedging&lt;/td&gt;
&lt;td&gt;Convexity and convert arb&lt;/td&gt;
&lt;td&gt;Speculation, short-dated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Expiry ladder&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Weekly, monthly, LEAPS&lt;/td&gt;
&lt;td&gt;Monthly, quarterly&lt;/td&gt;
&lt;td&gt;Weekly, monthly, LEAPS&lt;/td&gt;
&lt;td&gt;Near-continuous&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hours&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;US equity hours&lt;/td&gt;
&lt;td&gt;Nearly 24h&lt;/td&gt;
&lt;td&gt;US equity hours&lt;/td&gt;
&lt;td&gt;24/7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  They Disagree, Measurably
&lt;/h2&gt;

&lt;p&gt;Read at one instant before the US open on 17 August 2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Book&lt;/th&gt;
&lt;th&gt;Net GEX&lt;/th&gt;
&lt;th&gt;Regime&lt;/th&gt;
&lt;th&gt;Spot vs flip&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IBIT (spot ETF)&lt;/td&gt;
&lt;td&gt;+$3.98M&lt;/td&gt;
&lt;td&gt;Positive&lt;/td&gt;
&lt;td&gt;+0.06%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BTC=F (CME)&lt;/td&gt;
&lt;td&gt;−$0.85M&lt;/td&gt;
&lt;td&gt;Negative&lt;/td&gt;
&lt;td&gt;−0.10%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MSTR (proxy)&lt;/td&gt;
&lt;td&gt;+$26.86M&lt;/td&gt;
&lt;td&gt;Positive&lt;/td&gt;
&lt;td&gt;+0.69%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ETHA (spot ETF, ether)&lt;/td&gt;
&lt;td&gt;−$2.00M&lt;/td&gt;
&lt;td&gt;Negative&lt;/td&gt;
&lt;td&gt;−6.71%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Bitcoin dealer gamma was simultaneously &lt;strong&gt;positive&lt;/strong&gt; in the ETF and &lt;strong&gt;negative&lt;/strong&gt; on CME. Both books sat within a tenth of a percent of their own flip, on opposite sides. Any aggregate figure would have averaged these into a number describing neither.&lt;/p&gt;

&lt;p&gt;Divergence between books is normal and informative. It is not a signal that one feed is broken, and it is not an arbitrage. It tells you the two participant populations are positioned differently, which is usually the most interesting thing you can learn about a market.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Decision Rule
&lt;/h2&gt;

&lt;p&gt;Pick the book that governs the hedging flow into &lt;em&gt;your&lt;/em&gt; instrument.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you hold or trade&lt;/th&gt;
&lt;th&gt;Read&lt;/th&gt;
&lt;th&gt;Because&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IBIT, FBTC or another spot BTC ETF&lt;/td&gt;
&lt;td&gt;IBIT gamma&lt;/td&gt;
&lt;td&gt;Dealer hedging lands in ETF shares, which is your tape&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ETHA or ether ETF exposure&lt;/td&gt;
&lt;td&gt;ETHA exposure&lt;/td&gt;
&lt;td&gt;Ether has its own regime and it is often not bitcoin's&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MSTR, COIN or a miner&lt;/td&gt;
&lt;td&gt;MSTR positioning&lt;/td&gt;
&lt;td&gt;Equity hedging plus convert arb, distinct from crypto flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CME futures or options&lt;/td&gt;
&lt;td&gt;BTC=F gamma&lt;/td&gt;
&lt;td&gt;Hedging lands in the futures curve you trade&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spot coin, long horizon&lt;/td&gt;
&lt;td&gt;CME plus offshore&lt;/td&gt;
&lt;td&gt;Closest to the actual coin-hedging channel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spot coin, intraday&lt;/td&gt;
&lt;td&gt;Offshore, with CME as context&lt;/td&gt;
&lt;td&gt;Offshore carries the short-dated flow that moves coin intraday&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When To Read A Second Book
&lt;/h2&gt;

&lt;p&gt;Selecting one primary book does not mean ignoring the others. Three cases justify a second look:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Regime disagreement between ETF and CME.&lt;/strong&gt; When the two flip to opposite signs, the asset is being pulled by two hedging populations at once and realised volatility tends to be higher than either book alone implies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ether diverging from bitcoin.&lt;/strong&gt; On 17 August ETHA sat 6.7% below its flip in clear negative gamma while IBIT sat on its flip in positive gamma. That is a genuine statement about relative fragility, not a wrapper artefact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MSTR as a stress gauge.&lt;/strong&gt; Because it is the largest and most levered book, MSTR often shows exposure build-up before the ETFs do.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Three Pitfalls
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Comparing contracts instead of dollars.&lt;/strong&gt; One CME bitcoin contract is 5 BTC, roughly $317,000 of notional at 63,470. One IBIT contract is 100 shares, roughly $3,600. Contract counts across these venues are not comparable by three orders of magnitude. Always convert to dollars.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing CME greeks off spot.&lt;/strong&gt; CME options are on the future, so they price with Black-76 on the forward. Using a spot index introduces an error that grows with tenor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reading ETF put walls as support.&lt;/strong&gt; When put open interest at a strike dwarfs call open interest by an order of magnitude, that is outright protection buying rather than two-way dealer positioning, and it does not generate the same hedging bid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pulling All Four
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /v1/exposure/summary/IBIT          # spot BTC ETF
GET /v1/exposure/summary/ETHA          # spot ETH ETF
GET /v1/exposure/summary/MSTR          # equity proxy
GET /v1/exposure/gex/BTC%3DF           # CME, Growth plan or higher
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no single bitcoin options book and no single bitcoin dealer gamma number. The four venues are priced differently, hedged in different instruments, and held by different people, which is why they showed opposite signs at the same instant on 17 August 2026. Rather than aggregating them into an average that describes nobody, select the book whose hedging flow lands in the instrument you actually hold, and read the others as context. When the ETF and CME books disagree on regime, treat that as a statement about competing hedging populations, and expect realised volatility to run higher than either book alone would suggest.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://flashalpha.com/articles/bitcoin-etf-options-vs-cme-vs-offshore-where-to-read-positioning" rel="noopener noreferrer"&gt;flashalpha.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>bitcoin</category>
      <category>crypto</category>
      <category>trading</category>
      <category>finance</category>
    </item>
    <item>
      <title>Crypto Options Dealer Positioning: CME Bitcoin, Ether and the ETF Complex</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Mon, 17 Aug 2026 09:40:07 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/crypto-options-dealer-positioning-cme-bitcoin-ether-and-the-etf-complex-2nhg</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/crypto-options-dealer-positioning-cme-bitcoin-ether-and-the-etf-complex-2nhg</guid>
      <description>&lt;p&gt;Most crypto positioning commentary treats "bitcoin options" as one thing. It is not. The same underlying exposure is expressed through at least four different instrument wrappers, each with its own settlement mechanics, pricing model, participant base and hedging channel. Aggregate them naively and you get a number that describes nothing. Read them separately and the disagreements between them become the signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Wrappers Disagree, And That Is The Point
&lt;/h2&gt;

&lt;p&gt;Here is the full crypto complex read at the same instant, before the US open on 17 August 2026. Gamma exposure is computed on settled open interest, so these are structural positions rather than intraday flow.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Instrument&lt;/th&gt;
&lt;th&gt;Wrapper&lt;/th&gt;
&lt;th&gt;Spot&lt;/th&gt;
&lt;th&gt;Regime&lt;/th&gt;
&lt;th&gt;Net GEX&lt;/th&gt;
&lt;th&gt;Gamma flip&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MSTR&lt;/td&gt;
&lt;td&gt;Equity proxy&lt;/td&gt;
&lt;td&gt;93.91&lt;/td&gt;
&lt;td&gt;Positive&lt;/td&gt;
&lt;td&gt;+$26.86M&lt;/td&gt;
&lt;td&gt;93.26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IBIT&lt;/td&gt;
&lt;td&gt;Spot BTC ETF&lt;/td&gt;
&lt;td&gt;35.93&lt;/td&gt;
&lt;td&gt;Positive&lt;/td&gt;
&lt;td&gt;+$3.98M&lt;/td&gt;
&lt;td&gt;35.90&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;COIN&lt;/td&gt;
&lt;td&gt;Equity proxy&lt;/td&gt;
&lt;td&gt;149.55&lt;/td&gt;
&lt;td&gt;Positive&lt;/td&gt;
&lt;td&gt;+$1.41M&lt;/td&gt;
&lt;td&gt;147.17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ETHA&lt;/td&gt;
&lt;td&gt;Spot ETH ETF&lt;/td&gt;
&lt;td&gt;14.28&lt;/td&gt;
&lt;td&gt;Negative&lt;/td&gt;
&lt;td&gt;−$2.00M&lt;/td&gt;
&lt;td&gt;15.23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BTC=F&lt;/td&gt;
&lt;td&gt;CME option on future&lt;/td&gt;
&lt;td&gt;63,470&lt;/td&gt;
&lt;td&gt;Negative&lt;/td&gt;
&lt;td&gt;−$0.85M&lt;/td&gt;
&lt;td&gt;63,531&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read the regime column. Bitcoin exposure held through the spot ETF sits in &lt;strong&gt;positive&lt;/strong&gt; gamma, where dealers dampen moves. The identical exposure held through CME futures sits in &lt;strong&gt;negative&lt;/strong&gt; gamma, where dealers amplify them. Same asset, same moment, opposite hedging behaviour.&lt;/p&gt;

&lt;p&gt;The proximity makes it sharper. BTC=F is trading 63,470 against a flip at 63,531, roughly &lt;strong&gt;0.1% below&lt;/strong&gt; its own zero-gamma level. IBIT is trading 35.93 against a flip at 35.90, about &lt;strong&gt;0.06% above&lt;/strong&gt; its own. Both books are balanced on the knife edge, on opposite sides of it. A move of a fifth of a percent in bitcoin flips one of them and not the other.&lt;/p&gt;

&lt;p&gt;This is not an arbitrage and it is not a data error. Different books can carry genuinely opposite dealer positions because different people trade them for different reasons. The ETF book absorbs covered-call and overwriting flow from long holders; the CME book carries basis and macro-hedging flow from funds. Neither is "wrong". They are describing different populations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Four Wrappers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;CME options on futures&lt;/th&gt;
&lt;th&gt;Spot ETF options&lt;/th&gt;
&lt;th&gt;Equity proxies&lt;/th&gt;
&lt;th&gt;Offshore&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Examples&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;BTC=F, ETH=F&lt;/td&gt;
&lt;td&gt;IBIT, ETHA, FBTC&lt;/td&gt;
&lt;td&gt;MSTR, COIN, MARA&lt;/td&gt;
&lt;td&gt;Offshore venues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Regulated&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes, CFTC&lt;/td&gt;
&lt;td&gt;Yes, SEC / OCC&lt;/td&gt;
&lt;td&gt;Yes, SEC / OCC&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Settlement&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cash, CME reference rate&lt;/td&gt;
&lt;td&gt;Physical, ETF shares&lt;/td&gt;
&lt;td&gt;Physical, shares&lt;/td&gt;
&lt;td&gt;Coin or perp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Black-76 on the forward&lt;/td&gt;
&lt;td&gt;Black-Scholes on spot&lt;/td&gt;
&lt;td&gt;Black-Scholes on spot&lt;/td&gt;
&lt;td&gt;Varies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hedged in&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CME futures&lt;/td&gt;
&lt;td&gt;ETF shares, then coin via AP&lt;/td&gt;
&lt;td&gt;The equity itself&lt;/td&gt;
&lt;td&gt;Coin or perp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Expiry ladder&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Monthly, quarterly&lt;/td&gt;
&lt;td&gt;Weekly, monthly, LEAPS&lt;/td&gt;
&lt;td&gt;Weekly, monthly, LEAPS&lt;/td&gt;
&lt;td&gt;Near-continuous&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Participants&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Funds, CTAs, basis desks&lt;/td&gt;
&lt;td&gt;Advisors, overwriters, retail&lt;/td&gt;
&lt;td&gt;Retail, vol funds, convert arb&lt;/td&gt;
&lt;td&gt;Global, retail-heavy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The row that does most of the work is &lt;strong&gt;"hedged in"&lt;/strong&gt;. A dealer short gamma on BTC=F hedges by trading CME futures. A dealer short gamma on IBIT hedges by trading IBIT shares, and only indirectly touches coin when authorised participants create or redeem. A dealer short gamma on MSTR hedges by trading MSTR stock, which is a leveraged, convertible-laden claim on bitcoin rather than bitcoin itself.&lt;/p&gt;

&lt;p&gt;So the hedging flows land in different places. CME gamma transmits to the futures curve. ETF gamma transmits to ETF share volume. MSTR gamma transmits to a single equity whose relationship to bitcoin is itself unstable. Treating these as one aggregated "crypto GEX" number silently assumes a fungibility of hedging channels that does not exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  The CME Book: Priced On The Forward
&lt;/h2&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;Contract&lt;/th&gt;
&lt;th&gt;Multiplier&lt;/th&gt;
&lt;th&gt;Tick&lt;/th&gt;
&lt;th&gt;Settlement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BTC=F&lt;/td&gt;
&lt;td&gt;Bitcoin, 5 BTC&lt;/td&gt;
&lt;td&gt;$5 / point&lt;/td&gt;
&lt;td&gt;5 ($25.00)&lt;/td&gt;
&lt;td&gt;Cash-settled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ETH=F&lt;/td&gt;
&lt;td&gt;Ether, 50 ETH&lt;/td&gt;
&lt;td&gt;$50 / point&lt;/td&gt;
&lt;td&gt;0.50 ($25.00)&lt;/td&gt;
&lt;td&gt;Cash-settled&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both are quoted in dollars per coin, so the multiplier is simply the contract size and there is no quote-convention trap of the kind that catches out Treasuries and grains. At 63,470 a bitcoin contract is about &lt;strong&gt;$317,000&lt;/strong&gt; of notional.&lt;/p&gt;

&lt;p&gt;These are options on the CME &lt;em&gt;future&lt;/em&gt;, so they are priced with &lt;strong&gt;Black-76&lt;/strong&gt; on the forward, not Black-Scholes on spot. Crypto futures trade in meaningful contango and backwardation, and that basis is a real component of the forward. Pricing these greeks off a spot index introduces an error that grows with tenor.&lt;/p&gt;

&lt;p&gt;CME contract sizes are large. One bitcoin contract is 5 BTC, a few hundred thousand dollars of notional. Open interest counts therefore look small next to offshore venues while representing comparable dollar exposure. In the table above, the entire BTC=F hedging requirement for a 1% move is about 13 contracts, which is $850k of gamma, not a rounding error. Always compare in dollars, never in contracts.&lt;/p&gt;

&lt;p&gt;Expiry structure matters too. CME crypto concentrates in monthly and quarterly cycles rather than the near-continuous ladder offshore venues offer, so gamma builds and releases on an equity-like rhythm. Classic expiry-week pin logic is more applicable here than anywhere else in crypto.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ETF Book: Where The Overwriting Lives
&lt;/h2&gt;

&lt;p&gt;IBIT is now the most consequential regulated bitcoin options book by participation, and it behaves unlike the CME one. Its positive net gamma of &lt;strong&gt;+$3.98M&lt;/strong&gt; against a flip essentially at spot reflects a book dominated by call overwriting: long holders selling upside against ETF positions, which leaves dealers long gamma and therefore mean-reverting.&lt;/p&gt;

&lt;p&gt;The Ether ETF tells the opposite story at the same moment. ETHA carries &lt;strong&gt;−$2.00M&lt;/strong&gt; of net gamma with its flip at 15.23 against a spot of 14.28, meaning spot sits a full &lt;strong&gt;6.7% below&lt;/strong&gt; the flip. That is not a knife edge, that is a book decisively in negative-gamma territory, where dealer hedging amplifies moves in both directions.&lt;/p&gt;

&lt;p&gt;ETHA is also the only instrument in the complex with negative vanna and negative charm exposure right now (−$29.3M and −$176k respectively). The practical reading: a volatility spike makes ETHA dealers &lt;em&gt;sell&lt;/em&gt; delta, amplifying downside, where the same spike in IBIT or MSTR makes dealers buy. If you are looking for the fragile leg of the crypto complex today, the greeks are pointing at ether, not bitcoin.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Proxies: MSTR Is The Largest Crypto Vol Book In Equities
&lt;/h2&gt;

&lt;p&gt;MSTR carries &lt;strong&gt;+$26.86M&lt;/strong&gt; of net gamma. That is &lt;strong&gt;6.7x&lt;/strong&gt; IBIT's and &lt;strong&gt;19x&lt;/strong&gt; COIN's. Its vanna exposure of &lt;strong&gt;+$324M&lt;/strong&gt; is over twenty times COIN's $16.1M. By any exposure measure, the single largest concentration of crypto-linked options risk in the US equity market is not a bitcoin ETF. It is a software company's balance sheet.&lt;/p&gt;

&lt;p&gt;That has a mechanical consequence. Dealer hedging of MSTR gamma requires trading MSTR shares, and the hedging requirement for a 1% move is roughly &lt;strong&gt;286,000 shares&lt;/strong&gt;. MSTR's stock is a levered claim on bitcoin with convertible debt layered on top, so options-driven hedging flow interacts with convert-arb hedging flow in the same tape. This is why MSTR moves are frequently larger than its bitcoin beta alone predicts.&lt;/p&gt;

&lt;p&gt;COIN is the cleaner instrument of the two. Its net gamma is small (+$1.41M) but its &lt;strong&gt;delta&lt;/strong&gt; exposure is large (+$222.7M, larger than MSTR's +$107.2M). Dealers hold a big directional book in COIN and a small convexity book. That combination produces steady hedging pressure rather than the reflexive squeezes MSTR is known for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Offshore Book: Big, And Not Your Hedging Channel
&lt;/h2&gt;

&lt;p&gt;Offshore venues still hold the majority of global crypto options open interest, and any honest account has to say so. But size is not the same as relevance, and the reason is mechanical rather than ideological.&lt;/p&gt;

&lt;p&gt;Offshore books are hedged in coin and in perpetual swaps. If you hold IBIT, no amount of offshore dealer hedging touches your instrument directly. It moves bitcoin, which moves the ETF's net asset value, which authorised participants arbitrage back into the share price. That is a real transmission path, but it is indirect, lagged, and it passes through a creation-redemption mechanism that only operates during US market hours.&lt;/p&gt;

&lt;p&gt;Three characteristics make the offshore book behave differently from anything onshore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A near-continuous expiry ladder.&lt;/strong&gt; Where CME concentrates in monthlies and quarterlies, offshore venues list expiries almost continuously. Gamma never builds into a single dominant date the way it does on CME, so expiry-week pin effects are weaker and more diffuse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coin-margined contracts.&lt;/strong&gt; Some offshore contracts are margined in the underlying coin, which makes the payoff non-linear in a way a dollar-denominated option is not. Exposure computed as though these were dollar-settled is wrong before you start.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;24/7 trading.&lt;/strong&gt; The book never closes, so it absorbs weekend flow that the onshore wrappers cannot. Much of the gap risk that shows up as a Monday move in IBIT was already traded offshore on Saturday.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The practical position: read offshore for the coin, read onshore for the wrapper you hold. Do not add them together.&lt;/p&gt;

&lt;h2&gt;
  
  
  Expiry: The One Week The Wrappers Converge
&lt;/h2&gt;

&lt;p&gt;The wrappers spend most of the month telling different stories. Monthly expiry week is when they partially align, because that is the one date on which CME, the ETFs and the equity proxies all have material gamma rolling off simultaneously.&lt;/p&gt;

&lt;p&gt;Three things happen at once. CME's monthly and quarterly concentration releases, which is the single largest scheduled gamma event in the regulated crypto complex. The ETF overwriting cycle resets, as covered calls sold against IBIT and ETHA positions expire or are rolled up and out. And the equity proxies clear their monthly chains alongside every other US equity.&lt;/p&gt;

&lt;p&gt;The consequence is that the week after monthly expiry frequently has a different volatility character from the week before, and the strike maps you were reading are stale the moment the chains roll. Two practical rules follow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Re-read every wrapper after monthly expiry, not before.&lt;/strong&gt; Walls computed on a chain that is about to expire describe a book that is about to cease existing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expect the ETF dampening to weaken first.&lt;/strong&gt; Overwriters who get assigned are out of the position until they re-establish it, so the long-gamma tilt that suppresses IBIT volatility is at its weakest in the days immediately following expiry.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Five Mistakes That Show Up Constantly
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Aggregating into one "crypto GEX" number.&lt;/strong&gt; The single most common error, and the one that makes everything downstream meaningless. The hedging flows behind each wrapper are executed in different instruments by different firms and never net.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comparing contract counts.&lt;/strong&gt; One CME bitcoin contract is 5 BTC, roughly $317,000 of notional. One IBIT contract is 100 shares, roughly $3,600. Open-interest counts across the two differ by about two orders of magnitude and mean nothing side by side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing CME greeks off spot.&lt;/strong&gt; These are options on the future and price with Black-76 on the forward. At 10% annualised contango, feeding spot instead underprices a one-year at-the-money call by 23.8% and puts delta out by nearly seven percentage points.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reading heavy put open interest as support.&lt;/strong&gt; When puts at a strike outnumber calls by an order of magnitude, that is outright protection buying by holders, not two-way dealer positioning. It does not create the hedging bid that a genuine put wall implies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assuming the ETF book reflects overnight crypto moves.&lt;/strong&gt; IBIT, ETHA, MSTR and COIN options trade US equity hours. The underlying trades continuously. A large weekend move in coin does not appear in ETF exposure until the equity market reopens, so exposure pulled on a Sunday describes Friday's book.&lt;/p&gt;

&lt;h2&gt;
  
  
  How To Read It
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pick the wrapper that matches your risk.&lt;/strong&gt; If you trade IBIT, IBIT gamma is your hedging tape. CME gamma is somebody else's.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regime before levels.&lt;/strong&gt; Positive gamma means dealers dampen; negative means they amplify. Everything else is secondary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat divergence as information about who is positioned&lt;/strong&gt;, not as an arbitrage. The wrappers are not fungible and the hedging flows do not net.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare in dollars, never in contracts&lt;/strong&gt;, especially across CME and the ETFs, where contract sizes differ by orders of magnitude.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch distance to flip, not just sign.&lt;/strong&gt; A book 0.1% from its flip is a different animal from one 6.7% away, even if both read "negative".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Price CME greeks on the forward.&lt;/strong&gt; Black-76, not Black-Scholes. The basis is not noise.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Pulling It Programmatically
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /v1/exposure/summary/IBIT          # spot bitcoin ETF, full greek summary
GET /v1/exposure/gex/MSTR              # equity proxy gamma by strike
GET /v1/exposure/summary/ETHA          # ether ETF - watch the negative vanna
GET /v1/exposure/gex/BTC%3DF           # CME bitcoin gamma by strike
GET /v1/stock/IBIT/summary             # incl. IV term structure
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Equity and ETF symbols (IBIT, ETHA, MSTR, COIN) are ordinary tickers. Futures symbols take the &lt;code&gt;=F&lt;/code&gt; suffix with &lt;code&gt;=&lt;/code&gt; URL-encoded as &lt;code&gt;%3D&lt;/code&gt;, and require the Growth plan or higher. Everything that works for an equity works across the complex: GEX, DEX, VEX, CHEX, levels, max pain, the volatility surface and the exposure summary.&lt;/p&gt;

&lt;p&gt;Crypto dealer positioning is not one book, it is four, and on 17 August 2026 they disagreed about the sign of dealer gamma while bitcoin sat within 0.1% of the CME flip and IBIT within 0.06% of its own. That disagreement is structural, not spurious: each wrapper is priced differently, hedged in a different instrument, and held by a different set of people. Read the wrapper that matches your risk, compare exposure in dollars rather than contracts, price CME greeks on the forward rather than spot, and treat cross-venue divergence as information about who is positioned rather than as a trade.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://flashalpha.com/articles/cme-bitcoin-ether-options-gamma-exposure" rel="noopener noreferrer"&gt;flashalpha.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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