<?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>50 Options Strategies, 6 Years, Real Bid-Ask Prices: Only 10 Had a Positive Mean</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Thu, 17 Sep 2026 05:36:32 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/50-options-strategies-6-years-real-bid-ask-prices-only-10-had-a-positive-mean-15hp</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/50-options-strategies-6-years-real-bid-ask-prices-only-10-had-a-positive-mean-15hp</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; 50 options strategy profiles, priced from a minute-level options archive at end-of-day quotes, SPY/QQQ/IWM, 2020 to 2025. Identical rules: enter at the close after the first trading day of the month, exit ten sessions later, ~35 DTE, buy at ask, sell at bid, $0.65/contract/side. 10 of 42 monthly profiles had a positive mean after costs. The top five all own equity upside in a market that went up. Every number has a downloadable trade ledger.&lt;/p&gt;

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

&lt;p&gt;Mean after costs is average P&amp;amp;L per trade against the value of 100 shares of the ETF. On a $500 ETF that is $50,000, so +31.2 bps ≈ $156 a trade. No risk adjustment: a credit spread and a long call can sit adjacent with very different risk. Mean far from median means a few trades are moving the average.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monthly ETF table, the positive half
&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;Strategy&lt;/th&gt;
&lt;th&gt;Family&lt;/th&gt;
&lt;th&gt;Trades&lt;/th&gt;
&lt;th&gt;Mean (bps)&lt;/th&gt;
&lt;th&gt;Median&lt;/th&gt;
&lt;th&gt;Win rate&lt;/th&gt;
&lt;th&gt;Worst&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Covered call&lt;/td&gt;
&lt;td&gt;Stock overlay&lt;/td&gt;
&lt;td&gt;186&lt;/td&gt;
&lt;td&gt;+76.3&lt;/td&gt;
&lt;td&gt;+171.3&lt;/td&gt;
&lt;td&gt;69.9%&lt;/td&gt;
&lt;td&gt;-1184.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Protective put&lt;/td&gt;
&lt;td&gt;Stock overlay&lt;/td&gt;
&lt;td&gt;188&lt;/td&gt;
&lt;td&gt;+70.2&lt;/td&gt;
&lt;td&gt;+117.8&lt;/td&gt;
&lt;td&gt;61.7%&lt;/td&gt;
&lt;td&gt;-936.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Collar&lt;/td&gt;
&lt;td&gt;Stock overlay&lt;/td&gt;
&lt;td&gt;184&lt;/td&gt;
&lt;td&gt;+43.1&lt;/td&gt;
&lt;td&gt;+106.0&lt;/td&gt;
&lt;td&gt;63.6%&lt;/td&gt;
&lt;td&gt;-759.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Bullish risk reversal&lt;/td&gt;
&lt;td&gt;Ratio/RR&lt;/td&gt;
&lt;td&gt;208&lt;/td&gt;
&lt;td&gt;+41.5&lt;/td&gt;
&lt;td&gt;+66.2&lt;/td&gt;
&lt;td&gt;61.5%&lt;/td&gt;
&lt;td&gt;-719.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Long call&lt;/td&gt;
&lt;td&gt;Directional&lt;/td&gt;
&lt;td&gt;212&lt;/td&gt;
&lt;td&gt;+36.3&lt;/td&gt;
&lt;td&gt;+33.1&lt;/td&gt;
&lt;td&gt;53.8%&lt;/td&gt;
&lt;td&gt;-457.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Vol-carry filtered put spread&lt;/td&gt;
&lt;td&gt;Signal filter&lt;/td&gt;
&lt;td&gt;73&lt;/td&gt;
&lt;td&gt;+16.5&lt;/td&gt;
&lt;td&gt;+28.6&lt;/td&gt;
&lt;td&gt;72.6%&lt;/td&gt;
&lt;td&gt;-224.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Bull call debit spread&lt;/td&gt;
&lt;td&gt;Directional&lt;/td&gt;
&lt;td&gt;185&lt;/td&gt;
&lt;td&gt;+12.2&lt;/td&gt;
&lt;td&gt;+33.5&lt;/td&gt;
&lt;td&gt;59.5%&lt;/td&gt;
&lt;td&gt;-280.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Call diagonal&lt;/td&gt;
&lt;td&gt;Calendar/diagonal&lt;/td&gt;
&lt;td&gt;176&lt;/td&gt;
&lt;td&gt;+10.3&lt;/td&gt;
&lt;td&gt;+39.5&lt;/td&gt;
&lt;td&gt;63.1%&lt;/td&gt;
&lt;td&gt;-364.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Cash-secured put&lt;/td&gt;
&lt;td&gt;Stock overlay&lt;/td&gt;
&lt;td&gt;212&lt;/td&gt;
&lt;td&gt;+9.0&lt;/td&gt;
&lt;td&gt;+50.3&lt;/td&gt;
&lt;td&gt;74.1%&lt;/td&gt;
&lt;td&gt;-2007.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Put ratio spread&lt;/td&gt;
&lt;td&gt;Ratio/RR&lt;/td&gt;
&lt;td&gt;194&lt;/td&gt;
&lt;td&gt;+2.8&lt;/td&gt;
&lt;td&gt;-2.1&lt;/td&gt;
&lt;td&gt;46.9%&lt;/td&gt;
&lt;td&gt;-141.4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ranks 11 to 42 are all negative, ending at -61.1 bps (bearish risk reversal and poor man's covered call) and -74.8 (term-structure conditioned calendar, 4 trades).&lt;/p&gt;

&lt;p&gt;Symmetric butterflies and single-right condors won fewer than one trade in six. The put condor won 5.0%, lowest in the study. Mostly a structure/holding-period mismatch: a debit butterfly earns its value in the final days before expiry, and a ten-session exit on a 35-day option leaves that behind while paying three or four legs of spread.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stricter comparison: six structures, same 133 months
&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;Strategy&lt;/th&gt;
&lt;th&gt;After costs&lt;/th&gt;
&lt;th&gt;At midpoint&lt;/th&gt;
&lt;th&gt;Win rate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Long call&lt;/td&gt;
&lt;td&gt;+31.2&lt;/td&gt;
&lt;td&gt;+37.9&lt;/td&gt;
&lt;td&gt;55.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Bull call debit spread&lt;/td&gt;
&lt;td&gt;+10.4&lt;/td&gt;
&lt;td&gt;+19.8&lt;/td&gt;
&lt;td&gt;58.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Bull put credit spread&lt;/td&gt;
&lt;td&gt;+8.6&lt;/td&gt;
&lt;td&gt;+13.7&lt;/td&gt;
&lt;td&gt;72.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Iron condor&lt;/td&gt;
&lt;td&gt;-9.7&lt;/td&gt;
&lt;td&gt;-0.2&lt;/td&gt;
&lt;td&gt;53.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Call calendar&lt;/td&gt;
&lt;td&gt;-17.2&lt;/td&gt;
&lt;td&gt;-1.3&lt;/td&gt;
&lt;td&gt;33.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Long straddle&lt;/td&gt;
&lt;td&gt;-17.6&lt;/td&gt;
&lt;td&gt;-2.9&lt;/td&gt;
&lt;td&gt;42.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Win rate is not P&amp;amp;L.&lt;/strong&gt; 72.9% wins put the credit spread third. Loss size matters as much as loss frequency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Costs reorder the table.&lt;/strong&gt; Call calendar: -1.3 at midpoint, -17.2 after spread. Iron condor: flat to -9.7. If a strategy only works at midpoint, it does not work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First place is not an edge.&lt;/strong&gt; The ETFs rose an average of +93.6 bps over the same windows. Five of six have a 95% interval for the mean that includes zero; the long call's is roughly -18.5 to +79.5.&lt;/p&gt;

&lt;h2&gt;
  
  
  The spread is the story
&lt;/h2&gt;

&lt;p&gt;Every mirror pair in the dataset has exactly opposite midpoint results and both sides lose after costs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;iron condor / reverse iron condor&lt;/li&gt;
&lt;li&gt;iron butterfly / reverse iron butterfly&lt;/li&gt;
&lt;li&gt;call ratio spread / call backspread&lt;/li&gt;
&lt;li&gt;put ratio spread / put backspread&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Direction of the trade did not decide these outcomes. Crossing the bid-ask four times did.&lt;/p&gt;

&lt;p&gt;The worst offender: poor man's covered call, +53.3 bps at midpoint, -61.1 after costs. Largest cost drag in the dataset. Long-dated deep-ITM calls have wide spreads and this sample crosses them twice in ten sessions. A real PMCC holds the long call for months and rolls only the short, which is not what was tested.&lt;/p&gt;

&lt;h2&gt;
  
  
  Signal filters: one of four did anything
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Filter&lt;/th&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;Trades&lt;/th&gt;
&lt;th&gt;Mean&lt;/th&gt;
&lt;th&gt;vs unfiltered&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Vol-carry put spread&lt;/td&gt;
&lt;td&gt;ATM IV ≥ 1.2 × 20d RV&lt;/td&gt;
&lt;td&gt;73&lt;/td&gt;
&lt;td&gt;+16.5&lt;/td&gt;
&lt;td&gt;-0.9 → +16.5, skipped the worst month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vol-carry iron condor&lt;/td&gt;
&lt;td&gt;Same condition&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;-14.1&lt;/td&gt;
&lt;td&gt;-10.5 → -14.1, worse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skew-conditioned vertical&lt;/td&gt;
&lt;td&gt;25d put IV − 25d call IV ≥ 0.03&lt;/td&gt;
&lt;td&gt;170&lt;/td&gt;
&lt;td&gt;-2.0&lt;/td&gt;
&lt;td&gt;fired almost always, same worst trade&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tail-pricing put spread&lt;/td&gt;
&lt;td&gt;10d put IV − ATM put IV ≥ 0.05&lt;/td&gt;
&lt;td&gt;162&lt;/td&gt;
&lt;td&gt;-1.7&lt;/td&gt;
&lt;td&gt;fired almost always, same worst trade&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Term-structure calendar&lt;/td&gt;
&lt;td&gt;Back 50d call IV − front ≥ 0.02&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;-74.8&lt;/td&gt;
&lt;td&gt;condition almost never held&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The lesson in the bottom three rows: a filter that fires on nearly every window is not a filter. Build the control sample (the windows where it did not fire) before believing the conditional mean.&lt;/p&gt;

&lt;h2&gt;
  
  
  Earnings: 12 events, useful as worked examples only
&lt;/h2&gt;

&lt;p&gt;Four 2025 announcements each for AAPL, MSFT and AMZN. In one session before, out one session after.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Trades&lt;/th&gt;
&lt;th&gt;Mean&lt;/th&gt;
&lt;th&gt;Win rate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Earnings short strangle&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;+96.4&lt;/td&gt;
&lt;td&gt;90.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Post-earnings vol crush&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;+67.1&lt;/td&gt;
&lt;td&gt;66.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Earnings iron condor&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;+41.2&lt;/td&gt;
&lt;td&gt;81.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pre-earnings vol buildup&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;-31.5&lt;/td&gt;
&lt;td&gt;33.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Earnings diagonal&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;-44.3&lt;/td&gt;
&lt;td&gt;33.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Earnings calendar&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;-44.4&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Earnings long straddle&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;-122.5&lt;/td&gt;
&lt;td&gt;25.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Six to twelve trades each on three of the most liquid stocks in one year. This shows how the accounting works, not that it keeps working. No margin model, and a short strangle without one measures a position nobody could hold.&lt;/p&gt;

&lt;h2&gt;
  
  
  The wheel
&lt;/h2&gt;

&lt;p&gt;$100,000 starting cash per account, one contract at a time, held to expiry, assignment on anything finishing ITM, no interest on idle cash, no early assignment. 106 completed cycles.&lt;/p&gt;

&lt;p&gt;SPY 22.4%, QQQ 21.9%, IWM 4.8% total return over six years. Mostly cash the whole time. Compare with holding the ETF and with holding cash at a real rate before concluding anything.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Schedule:&lt;/strong&gt; select from first observed trading day's EOD chain each month, enter next close, exit 10 sessions later. No stops, targets, rolls or hedges.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expirations:&lt;/strong&gt; front 35 calendar days (30–45); back leg 65 (55–80).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strikes:&lt;/strong&gt; delta 50/25/10 means nearest archived absolute delta, rejected beyond 0.10 away. ATM is nearest strike to spot on signal day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quote gates:&lt;/strong&gt; positive uncrossed bid/ask on signal, entry and exit days; signal-day spread ≤ max($0.10, 30% of mid); displayed size covering the trade. Missing later quote excludes and records the trade rather than substituting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dividends:&lt;/strong&gt; ex-div windows excluded for stock overlays and any short call. Early assignment not modelled.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Costs:&lt;/strong&gt; one contract per leg, buy at ask, sell at bid, $0.65/contract/side. Stock legs cross the underlying spread, no commission.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RV:&lt;/strong&gt; sample SD of 20 unadjusted log returns, annualised by √252. IV stored as decimal, so 0.03 is three vol points.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uncertainty:&lt;/strong&gt; 1,000 bootstrap resamples of complete calendar months, three ETFs within a month kept together.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;216 scheduled ETF-month windows, 133 survived for all six headline structures (SPY 54, QQQ 39, IWM 40). Requiring valid entry and exit quotes can bias the surviving sample. Expanded release: 7,265 option-trade simulations, 106 wheel cycles, 42 monthly profiles, 7 earnings profiles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not modelled:&lt;/strong&gt; early assignment, financing, margin, collateral yield, taxes, market impact, daily account path. Retrospective study designed in 2026 with no untouched holdout. End-of-day quotes are aggregated views without a contributing timestamp.&lt;/p&gt;

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

&lt;p&gt;Download packs include raw query responses, selected legs, quote lineage, trade results, exclusions, calculation code and offline reproduction instructions, with file hashes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Article and all 50 profiles: &lt;a href="https://flashalpha.com/articles/options-strategies-ranked-light-backtest-spy-qqq-iwm" rel="noopener noreferrer"&gt;https://flashalpha.com/articles/options-strategies-ranked-light-backtest-spy-qqq-iwm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Historical API docs: &lt;a href="https://flashalpha.com/docs/historical-api" rel="noopener noreferrer"&gt;https://flashalpha.com/docs/historical-api&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Historical playground: &lt;a href="https://flashalpha.com/docs/historical-playground" rel="noopener noreferrer"&gt;https://flashalpha.com/docs/historical-playground&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The archive behind this runs at one-minute resolution back to January 2017, so the obvious next tests are intraday entries and exits, per-leg spread filters at entry, and holding to expiry instead of a fixed ten sessions.&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>finance</category>
      <category>python</category>
      <category>research</category>
    </item>
    <item>
      <title>Every API Response Should Prove Its Own Freshness. Here Is How We Do It for Options Data</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Tue, 15 Sep 2026 12:58:02 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/every-api-response-should-prove-its-own-freshness-here-is-how-we-do-it-for-options-data-2fe8</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/every-api-response-should-prove-its-own-freshness-here-is-how-we-do-it-for-options-data-2fe8</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Options data fails silently. A stale chain, misattributed OI, a one-sided quote solved into a fake IV, a replay that returns the nearest row: none throw an error, all produce a confident number. FlashAlpha's answer is to verify against independent sources several times a day, refuse with a named reason when a check fails, and stamp every response with &lt;code&gt;data_as_of&lt;/code&gt; so freshness is a field you read rather than a claim you accept. Keyless verification at the bottom.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three properties, six layers
&lt;/h2&gt;

&lt;p&gt;Trustworthy data is checked against something independent, fails closed with a machine-readable reason, and carries its own provenance in the response. Six layers deliver that.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Ingest with per-feed liveness
&lt;/h2&gt;

&lt;p&gt;Exchange-grade feeds, instrument mapping resolved before storage so a contract's identity survives symbol reuse and rolls. Every physical feed (equity options, index options, futures, futures options, spot) is tracked on its own row with throughput and session health evaluated every minute. Settled OI confirmed before every open, written idempotently so re-runs cannot double-count. Universe of 6,000+ option roots refreshed as roots list and delist.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Cross-source reconciliation, several times a day
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Compared&lt;/th&gt;
&lt;th&gt;Independent reference&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chain reconciliation&lt;/td&gt;
&lt;td&gt;Every contract's coverage, OI and price, scored per symbol&lt;/td&gt;
&lt;td&gt;Second market-data source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Index spot re-derivation&lt;/td&gt;
&lt;td&gt;Spot implied by the chain via put-call parity, per expiry, outlier-trimmed&lt;/td&gt;
&lt;td&gt;The chain itself (arbitrage identity)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Futures-to-cash parity&lt;/td&gt;
&lt;td&gt;ES, NQ, RTY vs SPX, NDX, RUT cash&lt;/td&gt;
&lt;td&gt;Cost-of-carry basis band&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session volume, two layers&lt;/td&gt;
&lt;td&gt;Live tape vs vendor totals; per-contract accumulator vs its own tape&lt;/td&gt;
&lt;td&gt;Vendor totals, conservation identity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Served-layer conservation&lt;/td&gt;
&lt;td&gt;OI actually served by exposure endpoints, summed per strike&lt;/td&gt;
&lt;td&gt;Truth source, per strike&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Earnings dates&lt;/td&gt;
&lt;td&gt;Rotating sample of upcoming reports&lt;/td&gt;
&lt;td&gt;Second calendar provider&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Recent full sweep: &lt;strong&gt;54,705 contracts across 41 symbols at 99.6% OI agreement&lt;/strong&gt; on comparable contracts.&lt;/p&gt;

&lt;p&gt;The served-layer row is the one most vendors skip. Reconciling what the feed delivered is table stakes. We also reconcile what the API serves: the per-strike OI behind the GEX profile in your response is compared with the reference per strike.&lt;/p&gt;

&lt;p&gt;A reconciliation whose reference returns nothing comparable is itself a failure. The check cannot quietly stop checking.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Serving guards that fail closed
&lt;/h2&gt;

&lt;p&gt;Verification is theatre if degraded data is served anyway. Every refusal is machine-readable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;409 stale_data&lt;/strong&gt; instead of a frozen price on the realised-vol and forecast endpoints:&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="err"&gt;HTTP/&lt;/span&gt;&lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;409&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Conflict&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;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stale_data"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The historical price archive's most recent bar is 2026-07-28 (5 trading days old). Data is stale; refusing to serve a frozen price or fit models on it. Re-hydrate the symbol's history."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"stale_since"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-28"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"stale_trading_days"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&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;&lt;strong&gt;Ghost quotes excluded.&lt;/strong&gt; One-sided or crossed quotes are dropped from IV solving, Greeks and exposure aggregates rather than solved into a fictitious surface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gamma flip certified before publication.&lt;/strong&gt; &lt;code&gt;gamma_flip_status&lt;/code&gt; is &lt;code&gt;available&lt;/code&gt; or names the failed check. No regime label is ever derived from an uncertified level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Isolated computation per request.&lt;/strong&gt; Each request computes on its own snapshot of the store, so numbers in one response are internally consistent and &lt;code&gt;data_as_of&lt;/code&gt; describes exactly the feed deliveries used.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coverage and availability gates.&lt;/strong&gt; Strategy scorers return &lt;code&gt;insufficient_data&lt;/code&gt; on thin history. Settled expiries never contaminate live profiles. A fleet-wide control can withdraw serving for a class or symbol in seconds with the standard &lt;code&gt;no_data&lt;/code&gt; envelope.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Thirty pipelines, one health registry
&lt;/h2&gt;

&lt;p&gt;Every pipeline (feed sessions, ingest, nightly writers, reconciliation monitors, alert delivery, serving loops, across every host) reports status, last-run, staleness and consecutive-failure count into one registry. Dedicated monitors on top: feed liveness every minute, served spot checked for movement every five minutes in session, OI publication confirmed before open, external processors tracked by heartbeat.&lt;/p&gt;

&lt;p&gt;Alerts are edge-triggered and trading-calendar aware. A digest reaches humans twice per trading day whether or not anything is wrong. Silence is never assumed to mean health.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Point-in-time archive with archive_as_of
&lt;/h2&gt;

&lt;p&gt;Stored inputs are never restated. Corrections go in the changelog, never silently under a backtest. A look-ahead guard in the replay engine and a freshness guard on the archive enforce this by construction. Every historical response carries &lt;code&gt;archive_as_of&lt;/code&gt; in the same nine-feed shape as the live stamp. Same engine serves live and replay; parity pinned by test and sampled continuously against production.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. data_as_of on every response
&lt;/h2&gt;

&lt;p&gt;Two fields, added in one place so no endpoint can omit them: &lt;code&gt;endpoint_version&lt;/code&gt; (the deployed build) and &lt;code&gt;data_as_of&lt;/code&gt; (delivery timestamp of each upstream feed the responding node uses, plus node name).&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;764.23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"as_of"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-24T18:49:00.697Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"endpoint_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026.08.25"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data_as_of"&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;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fa2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"equity_feed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-24T18:49:00.512Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"equity_options_feed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-24T18:48:58.204Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"index_feed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"index_options_feed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"futures_feed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"futures_options_feed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"flow_feed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-24T18:49:00.220Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"oi_feed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-21T20:00:00.000Z"&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_feed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-24T18:42:11.000Z"&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;Feeds are stamped by physical pipe, not asset class, because spot and options arrive over different connections. Read each slot against its own cadence:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Feed&lt;/th&gt;
&lt;th&gt;Expected cadence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;equity_feed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Equity/ETF spot&lt;/td&gt;
&lt;td&gt;Seconds, market hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;equity_options_feed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Equity/ETF options&lt;/td&gt;
&lt;td&gt;Seconds, market hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;index_feed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Index spot (SPX, NDX, RUT, VIX)&lt;/td&gt;
&lt;td&gt;Seconds, market hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;index_options_feed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Index options&lt;/td&gt;
&lt;td&gt;Seconds, market hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;futures_feed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Futures prices&lt;/td&gt;
&lt;td&gt;Seconds, futures session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;futures_options_feed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Futures options&lt;/td&gt;
&lt;td&gt;Seconds, futures session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;flow_feed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Classified trade tape&lt;/td&gt;
&lt;td&gt;Seconds, market hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;oi_feed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Settled open interest&lt;/td&gt;
&lt;td&gt;Daily, prior 16:00 ET close&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;macro_feed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;VIX, VVIX, SKEW, MOVE, SPX, Fear and Greed&lt;/td&gt;
&lt;td&gt;Minutes; reports its oldest field&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The example is Monday midday and &lt;code&gt;oi_feed&lt;/code&gt; shows Friday's close. Correct: Monday's settled OI does not exist until Monday settles. Slots a request did not read are &lt;code&gt;null&lt;/code&gt;. &lt;code&gt;macro_feed&lt;/code&gt; deliberately reports its oldest constituent so one lagging series cannot hide.&lt;/p&gt;

&lt;p&gt;Top-level array responses carry the same object in &lt;code&gt;X-Data-As-Of&lt;/code&gt; and &lt;code&gt;X-Endpoint-Version&lt;/code&gt; headers. The Python SDK types it as &lt;code&gt;DataAsOf&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keyless provenance.&lt;/strong&gt; &lt;code&gt;/health&lt;/code&gt;, &lt;code&gt;/livez&lt;/code&gt; and &lt;code&gt;/readyz&lt;/code&gt; on &lt;code&gt;lab.flashalpha.com&lt;/code&gt; return the same &lt;code&gt;data_as_of&lt;/code&gt; object with no API key. Point your own monitoring at it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verified from outside
&lt;/h2&gt;

&lt;p&gt;An external monitor probes every 30 seconds over the public customer path: a real analytics endpoint with a real key (well-formed but wrong counts as failure), the ingest with per-feed liveness, and the historical service. It reads &lt;code&gt;data_as_of&lt;/code&gt; itself and fails any feed behind inside its own session. It also checks via put-call parity that the served book prices the served spot. Results drive flashalpha.com/status with per-component 90-day uptime, above 99.9% on every component at time of writing. The monitoring stack has 5,000+ automated tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify it in sixty seconds
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Feed freshness, no key&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://lab.flashalpha.com/health

&lt;span class="c"&gt;# 2. Public availability, per component, per day, 90-day window&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://lab.flashalpha.com/v1/status

&lt;span class="c"&gt;# 3. Any data call: read data_as_of beside the numbers&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &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_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
     https://lab.flashalpha.com/v1/exposure/gex/SPY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gating in a pipeline, against the feeds your query actually depends on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timezone&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flashalpha&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FlashAlpha&lt;/span&gt;

&lt;span class="n"&gt;fa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FlashAlpha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;gex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;feeds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gex&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data_as_of&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utc&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;age&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;stamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;feeds&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;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stamp&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="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="k"&gt;try&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;now&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromisoformat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stamp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Z&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;+00:00&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;TypeError&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;# A SPY GEX call depends on equity spot and equity options, both of which
# should be seconds old in session. Settled OI follows its own daily cadence.
&lt;/span&gt;&lt;span class="n"&gt;in_session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;equity_feed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;equity_options_feed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;fresh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;minutes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;in_session&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;fresh&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;GEX &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;gex&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;net_gex&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; from node &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;feeds&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;node&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;, build &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;gex&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;endpoint_version&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Feeds behind cadence - hold the signal until they catch up.&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 the status fields already on the analytics: &lt;code&gt;gamma_flip_status&lt;/code&gt; before &lt;code&gt;gamma_flip&lt;/code&gt;, &lt;code&gt;data_quality_score&lt;/code&gt; on the 0DTE path, &lt;code&gt;archive_as_of&lt;/code&gt; on every replay. Your pipeline is then gating on the same signals our monitors gate on.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;data_as_of vs as_of?&lt;/strong&gt; &lt;code&gt;data_as_of&lt;/code&gt; describes the inputs (when each feed last delivered). &lt;code&gt;as_of&lt;/code&gt; describes the output (when the response was generated or the newest contract ticked).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is oi_feed dated to yesterday?&lt;/strong&gt; Settled OI is published once per session, dated to the prior close. That is the newest settled OI that exists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Historical too?&lt;/strong&gt; Yes. &lt;code&gt;archive_as_of&lt;/code&gt; in the same shape, same engine, same guards, archive never restated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Due diligence access?&lt;/strong&gt; Everything verifiable from outside is public. Tolerances, schedules, source pairings and SLA riders are shared under NDA via flashalpha.com/institutional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Data quality reference: &lt;a href="https://flashalpha.com/methodology/data-quality" rel="noopener noreferrer"&gt;https://flashalpha.com/methodology/data-quality&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Status page: &lt;a href="https://flashalpha.com/status" rel="noopener noreferrer"&gt;https://flashalpha.com/status&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Response envelope spec: &lt;a href="https://flashalpha.com/docs/lab-api-overview#response-envelope" rel="noopener noreferrer"&gt;https://flashalpha.com/docs/lab-api-overview#response-envelope&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Playground: &lt;a href="https://flashalpha.com/docs/playground" rel="noopener noreferrer"&gt;https://flashalpha.com/docs/playground&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>api</category>
      <category>datascience</category>
      <category>finance</category>
      <category>devops</category>
    </item>
    <item>
      <title>Trading Gamma Flip Crosses Without Getting Faked Out: regime, unknown, and a Reference Detector in Python</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Mon, 14 Sep 2026 08:53:51 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/trading-gamma-flip-crosses-without-getting-faked-out-regime-unknown-and-a-reference-detector-in-366p</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/trading-gamma-flip-crosses-without-getting-faked-out-regime-unknown-and-a-reference-detector-in-366p</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; &lt;code&gt;regime&lt;/code&gt; is spot versus the same snapshot's &lt;code&gt;gamma_flip&lt;/code&gt;, and only when that level is certified. &lt;code&gt;unknown&lt;/code&gt; means one of three things: no level, an unverified level, or spot sitting on the flip. Classify a cross by the regime &lt;em&gt;after&lt;/em&gt; it, and only once the label has committed to a side with the level still where it was. Code at the bottom.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three fields, read as a unit
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;code&gt;gamma_flip&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;gamma_flip_status&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;regime&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;number&lt;/td&gt;
&lt;td&gt;&lt;code&gt;available&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;positive_gamma&lt;/code&gt; / &lt;code&gt;negative_gamma&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Certified level, certified side. The only row you build a regime rule on.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;number&lt;/td&gt;
&lt;td&gt;&lt;code&gt;available&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;unknown&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Certified level, spot inside the certified window around it. You are at the flip.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;number&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;sensitive_root&lt;/code&gt;, &lt;code&gt;uncertain_root_path&lt;/code&gt;, &lt;code&gt;quality_budget&lt;/code&gt;, &lt;code&gt;uncertain_gamma_variance&lt;/code&gt;, &lt;code&gt;insufficient_local_coverage&lt;/code&gt;, &lt;code&gt;insufficient_quote_quality&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;unknown&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unverified level. Root exists but failed the named check. Context only, never a side.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;null&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;no_boundary&lt;/code&gt;, &lt;code&gt;stored_sign_mismatch&lt;/code&gt;, others&lt;/td&gt;
&lt;td&gt;&lt;code&gt;unknown&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No supportable boundary. Nothing to trade against.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Reading &lt;code&gt;gamma_flip&lt;/code&gt; alone is the easiest mistake to make.&lt;/p&gt;

&lt;h2&gt;
  
  
  How regime is computed
&lt;/h2&gt;

&lt;p&gt;Within one response, spot and the flip come from the same snapshot: same chain, same &lt;code&gt;underlying_price&lt;/code&gt;, same &lt;code&gt;as_of&lt;/code&gt;. If the level is certified, spot at or above it is &lt;code&gt;positive_gamma&lt;/code&gt;, below it is &lt;code&gt;negative_gamma&lt;/code&gt;. No smoothing, no carry-forward, no inference from an unverified level.&lt;/p&gt;

&lt;p&gt;Which chain depends on the endpoint:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Chain&lt;/th&gt;
&lt;th&gt;Carries&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/v1/exposure/zero-dte/{symbol}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Selected expiry only (today by default; &lt;code&gt;expiry=&lt;/code&gt; for 1DTE/2DTE)&lt;/td&gt;
&lt;td&gt;flip, status, regime, positional fields&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/v1/stock/{symbol}/summary&lt;/code&gt; (&lt;code&gt;exposure&lt;/code&gt; block)&lt;/td&gt;
&lt;td&gt;Every live expiry&lt;/td&gt;
&lt;td&gt;flip, status, regime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/v1/exposure/levels/{symbol}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Every live expiry&lt;/td&gt;
&lt;td&gt;flip, status (no regime label)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST /v1/screener&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Every live expiry&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;gamma_flip_status&lt;/code&gt; as a filter, e.g. &lt;code&gt;eq available&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same routes on &lt;code&gt;historical.flashalpha.com&lt;/code&gt; with &lt;code&gt;?at=&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Same as live, point-in-time&lt;/td&gt;
&lt;td&gt;Same as live&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 0DTE label and the whole-book label can legitimately disagree at the same instant. Pick the one that matches what you trade and stay on it. Taking the level from one endpoint and the regime from another compares two different books.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Certified&lt;/strong&gt; means: at least 75% of OI on the path from spot to the level carries usable gamma, expiry-day quotes carry more time value than spread, and scaling any single strike's gamma by 0.75 or 1.25 leaves the zero-crossing within 0.1% of spot (0.25% on a bounded retry). Levels that fail are still shown with the failing check and regime &lt;code&gt;unknown&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three meanings of unknown
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;No level&lt;/strong&gt; (&lt;code&gt;gamma_flip&lt;/code&gt; null). Aggregate gamma keeps one sign across the search band, or the reconstruction disagrees with stored net-GEX sign. Stand down from any flip-based rule. &lt;code&gt;net_gex&lt;/code&gt; still gives a coarse read of aggregate exposure sign.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unverified level&lt;/strong&gt; (status is a check name). Root exists but failed coverage, quote-quality or single-strike stress. Use it as a level to watch (median unverified root in the validation set is ~0.5% from spot). Do not compare it with spot yourself to manufacture a regime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At the flip&lt;/strong&gt; (status &lt;code&gt;available&lt;/code&gt;, regime &lt;code&gt;unknown&lt;/code&gt;). Certified level, spot inside the certified window, one strike's quote could put it either side. This is the transition zone where crosses happen. Wait. On the 0DTE endpoint, &lt;code&gt;distance_to_flip_sigmas&lt;/code&gt; and &lt;code&gt;spot_to_flip_pct&lt;/code&gt; show how deep in the zone you are.&lt;/p&gt;

&lt;p&gt;Downstream fields follow the same rule: when regime is &lt;code&gt;unknown&lt;/code&gt;, everything conditioned on regime returns null (GEX and vanna conditioned blocks, VRP regime label, short-put-spread, short-strangle, iron-condor and net harvest scores). Positional fields on the 0DTE endpoint (&lt;code&gt;spot_vs_flip&lt;/code&gt;, &lt;code&gt;spot_to_flip_pct&lt;/code&gt;, &lt;code&gt;distance_to_flip_dollars&lt;/code&gt;, &lt;code&gt;distance_to_flip_sigmas&lt;/code&gt;) stay populated for unverified levels because they describe where the root is, not which side dealers are on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pre-cross or post-cross regime?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Post-cross.&lt;/strong&gt; The label describes the hedging environment you are entering, which governs how price behaves from here. Above the flip dealers are long gamma and dampen moves; below it they are short gamma and amplify them. A positive-to-negative cross is a breakout because the post-cross environment amplifies. The pre-cross regime tells you what you left.&lt;/p&gt;

&lt;p&gt;A naive "label changed between two polls" rule fails for two reasons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The level can cross spot.&lt;/strong&gt; The flip is recomputed from the live book every snapshot. OI or gamma shifting at a nearby strike moves the level across a stationary price and the label flips with no breakout. Compare &lt;code&gt;gamma_flip&lt;/code&gt; on both snapshots, require &lt;code&gt;available&lt;/code&gt; on both, and treat a level move above ~0.25% of spot as a relocation. In validation replay, certified levels moved at most 0.32% of spot between consecutive minutes while spot moved under 0.1%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;unknown is the transition zone.&lt;/strong&gt; Around the level the label reads &lt;code&gt;unknown&lt;/code&gt; for one or more snapshots before committing. A cross is confirmed only when the post-cross label is a side and differs from the last committed side. For hysteresis, &lt;code&gt;distance_to_flip_sigmas&lt;/code&gt; gives a band in units of remaining expected move. 0.3 sigma of follow-through is a reasonable starting point; tune to your holding period.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reference cross detector
&lt;/h2&gt;

&lt;p&gt;State machine against the 0DTE endpoint. Keeps last committed side, ignores unverified levels, treats &lt;code&gt;unknown&lt;/code&gt; as waiting, rejects relocations, requires sigma follow-through.&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;time&lt;/span&gt;

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

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;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;API&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/v1/exposure/zero-dte/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HEADERS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&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="n"&gt;d&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="n"&gt;reg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;regime&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;as_of&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;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;as_of&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;spot&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;underlying_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;flip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gamma_flip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gamma_flip_status&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;reg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;label&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sigmas&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reg&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;distance_to_flip_sigmas&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CrossDetector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;MAX_LEVEL_MOVE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0025&lt;/span&gt;   &lt;span class="c1"&gt;# rule of thumb: larger = the level moved, not spot
&lt;/span&gt;    &lt;span class="n"&gt;MIN_FOLLOW_THROUGH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;  &lt;span class="c1"&gt;# sigma beyond the level before we call it
&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_side&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;     &lt;span class="c1"&gt;# last committed regime
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_flip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;     &lt;span class="c1"&gt;# flip at that commit
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_flip_spot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&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="c1"&gt;# Only certified levels participate. Unverified: watch, never classify.
&lt;/span&gt;        &lt;span class="k"&gt;if&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;flip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;or&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;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;available&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;no_certified_level&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;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;label&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unknown&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;at_flip_waiting&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;   &lt;span class="c1"&gt;# transition zone: spot inside the certified window
&lt;/span&gt;
        &lt;span class="n"&gt;side&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;label&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;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_side&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_side&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_flip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_flip_spot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;side&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;flip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;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;spot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;initialised&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;side&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_side&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_flip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_flip_spot&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;flip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;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;spot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;no_change&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

        &lt;span class="c1"&gt;# The label committed to the other side. Did spot cross, or did the level move?
&lt;/span&gt;        &lt;span class="k"&gt;if&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;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;flip&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;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_flip&lt;/span&gt;&lt;span class="p"&gt;)&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;spot&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;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MAX_LEVEL_MOVE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_side&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_flip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_flip_spot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;side&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;flip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;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;spot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;level_relocated&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;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;sigmas&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="ow"&gt;and&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;sigmas&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;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MIN_FOLLOW_THROUGH&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cross_pending_follow_through&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_side&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_flip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_flip_spot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;side&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;flip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;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;spot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;breakout_down&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;side&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;negative_gamma&lt;/span&gt;&lt;span class="sh"&gt;"&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;breakout_up&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;det&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CrossDetector&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&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="nf"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;det&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;breakout&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;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;as_of&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;flip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;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;flip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;spot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="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;spot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What it never does: carry a stale level forward, compare spot with an unverified level, read &lt;code&gt;unknown&lt;/code&gt; as a side. It classifies by the side it just committed to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backtesting
&lt;/h2&gt;

&lt;p&gt;Point the same detector at &lt;code&gt;historical.flashalpha.com&lt;/code&gt; with &lt;code&gt;?at=2026-09-10T14:30:00&lt;/code&gt; (ET wall-clock, same clock as stored data) and step forward a minute at a time. Same calculation, same certification, same statuses. Expect the same &lt;code&gt;unknown&lt;/code&gt; stretches and unverified levels you see live, especially in the last half hour of an expiry day. A backtest on an always-populated, always-certified level overstates signal availability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four anti-patterns
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Carrying the last known flip forward when the current one is null.&lt;/li&gt;
&lt;li&gt;Treating &lt;code&gt;unknown&lt;/code&gt; as bearish.&lt;/li&gt;
&lt;li&gt;Comparing spot with an unverified level to manufacture a regime.&lt;/li&gt;
&lt;li&gt;Taking the level from one endpoint and the regime from another.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Playground: &lt;a href="https://flashalpha.com/docs/playground" rel="noopener noreferrer"&gt;https://flashalpha.com/docs/playground&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Methodology: &lt;a href="https://flashalpha.com/methodology" rel="noopener noreferrer"&gt;https://flashalpha.com/methodology&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Certification gates and validation numbers: &lt;a href="https://flashalpha.com/articles/gamma-flip-stability-why-levels-disappear-near-close" rel="noopener noreferrer"&gt;https://flashalpha.com/articles/gamma-flip-stability-why-levels-disappear-near-close&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;API key: &lt;a href="https://flashalpha.com/pricing" rel="noopener noreferrer"&gt;https://flashalpha.com/pricing&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>api</category>
      <category>finance</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Why We Made Our Gamma Flip Nullable (And Two Thirds of Chains Now Return Null)</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Fri, 11 Sep 2026 13:58:43 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/why-we-made-our-gamma-flip-nullable-and-two-thirds-of-chains-now-return-null-38be</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/why-we-made-our-gamma-flip-nullable-and-two-thirds-of-chains-now-return-null-38be</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; FlashAlpha's &lt;code&gt;gamma_flip&lt;/code&gt; is now nullable. It publishes only when the option book passes three checks (local coverage, expiry-day quote quality, single-strike sensitivity). When it fails, you get &lt;code&gt;null&lt;/code&gt; plus a machine-readable &lt;code&gt;gamma_flip_status&lt;/code&gt;. Roughly one chain in three publishes. Across 647,574 stress trials, zero published levels moved more than 0.1% of spot.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;The gamma flip is a regime boundary. Above it dealers are net long gamma and dampen moves; below it they are net short and amplify them. Systematic desks gate strategies on which side spot sits.&lt;/p&gt;

&lt;p&gt;Late in a 0DTE session, time value decays into the bid-ask spread. A contract quoted 0.40 by 0.50 at noon might be 0.05 by 0.15 at 15:45. The spread stayed a dime; time value collapsed below it. The gamma you back out of that midpoint is a property of whichever quote printed, not of the market. Feed it into a zero-gamma solver and you get a precise-looking number that jumps hundreds of points minute to minute.&lt;/p&gt;

&lt;p&gt;We measured it. On a real SPX 0DTE session, an ungated level crossed spot &lt;strong&gt;five times in thirteen minutes&lt;/strong&gt; on an underlying that moved 0.03%. Each crossing implied a full regime inversion. Nothing had changed.&lt;/p&gt;

&lt;p&gt;Smoothing does not fix this. The quantity is bistable, not noisy. Averaging two attractors gives a number between them that describes neither. The honest fix is to detect when the book cannot support a level and decline to publish one.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the flip is computed
&lt;/h2&gt;

&lt;p&gt;We reprice every contract's gamma across candidate underlying prices and solve for where aggregate dealer gamma crosses zero. That yields a continuous price, not the nearest listed strike, and reconciles against the &lt;code&gt;net_gex&lt;/code&gt; in the same response.&lt;/p&gt;

&lt;p&gt;Finding a root is easy. Publishing it requires passing three gates.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three gates
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gate&lt;/th&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Threshold&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Local coverage&lt;/td&gt;
&lt;td&gt;OI between spot and candidate level (multiplier-weighted) must carry a gamma the model can represent. Unpriced positions stay in the denominator.&lt;/td&gt;
&lt;td&gt;≥ 75%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quote quality (expiry day)&lt;/td&gt;
&lt;td&gt;Same-day OI in that corridor must have two-sided quotes whose midpoint carries more time value than the full spread.&lt;/td&gt;
&lt;td&gt;≥ 75%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sensitivity certificate&lt;/td&gt;
&lt;td&gt;Scale each strike's gamma by 0.75 and 1.25, one at a time. Bounded interval certificate verifies the perturbed book still crosses zero near the published level and no nearer crossing appears.&lt;/td&gt;
&lt;td&gt;≤ 0.1% of spot&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A feasible-peak scenario is included where positive stress would otherwise remove a represented leg from the inverse model, so a boundary cannot look easier to certify because an opposing leg vanished.&lt;/p&gt;

&lt;p&gt;The certificate is deliberately limited: discrete scenarios only. It does not prove robustness to simultaneous multi-strike changes or every future condition. No temporal smoothing, no carrying yesterday's level forward.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the last hour is where levels vanish
&lt;/h2&gt;

&lt;p&gt;Gate two is the one that bites into the close, and the mechanism is just time. Extrinsic value decays through the afternoon; the spread does not. Once spread exceeds remaining time value, the midpoint is market-maker spread, not a volatility view.&lt;/p&gt;

&lt;p&gt;Stated plainly: the hour when 0DTE traders most want a gamma flip is the hour when the data least supports one. Any platform showing a confident level at 15:50 on expiry day is either using a different definition or not checking.&lt;/p&gt;

&lt;p&gt;Also note: open interest does not guarantee a two-sided market. Under FlashAlpha's quote policy a one-sided market, or a contract inside its final minute, produces an OI-only snapshot with gamma and IV both zero. That is intended, not lost data, and those legs never reach the gamma-to-vol inversion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reason codes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;code&gt;gamma_flip_status&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;available&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Passed every check. Use it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;insufficient_quote_quality&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Expiry-day quotes are spread-dominated. Most common into the close.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sensitive_root&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A single strike could move the level beyond tolerance. Root exists but is not robust.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;insufficient_local_coverage&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Too much OI between spot and the level has no usable gamma.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;no_boundary&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Aggregate gamma keeps one sign across the search band. No nearby flip.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stored_sign_mismatch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Repriced book disagrees with stored net-GEX sign. Reconstruction not trustworthy.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Treat any unrecognised value as unavailable; the list can grow.&lt;/p&gt;

&lt;p&gt;When the flip is withheld, &lt;code&gt;regime&lt;/code&gt; reads &lt;code&gt;unknown&lt;/code&gt; and everything conditioned on regime returns null: GEX and vanna conditioned blocks, VRP regime label, short-put-spread, short-strangle, iron-condor and net harvest scores. Standalone fields keep working: &lt;code&gt;net_gex&lt;/code&gt;, IV, RV, VRP spread, calendar-spread score.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validation
&lt;/h2&gt;

&lt;p&gt;Thresholds were set on 4,575 frozen historical books across SPXW, SPY, QQQ, IWM, NVDA, TSLA and META at 0, 7 and 28 DTE, validated against an independent implementation, with two holdouts acquired after the rules were fixed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Population&lt;/th&gt;
&lt;th&gt;Captures&lt;/th&gt;
&lt;th&gt;Published&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Development&lt;/td&gt;
&lt;td&gt;2,412&lt;/td&gt;
&lt;td&gt;663&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Holdout&lt;/td&gt;
&lt;td&gt;1,083&lt;/td&gt;
&lt;td&gt;251&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intraday holdout&lt;/td&gt;
&lt;td&gt;1,080&lt;/td&gt;
&lt;td&gt;699&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4,575&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1,613&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The model produced 3,486 numeric roots; 1,613 passed publication. 64.74% of the corpus withheld.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stress sweep:&lt;/strong&gt; 647,574 single-strike trials. 294,508 had numeric results on both sides; none moved beyond 0.1% of spot. Largest move 0.0999981%. 2,630 lost publications and 2,080 gained were tracked separately, not counted as zero movement. A separate certificate replay covered 319,405 variants including 22,267 feasible-peak scenarios, with no tolerance violations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live session open:&lt;/strong&gt; sampled every 45 seconds for 25 minutes. SPY full chain, SPY 0DTE and SPX full chain published on all 34 samples, zero spot crossings, max consecutive move 0.24%. SPX 0DTE published 23 of 34; every published value held its side of spot.&lt;/p&gt;

&lt;p&gt;Availability drops. Reliability of what is published does not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost:&lt;/strong&gt; on a 19,524-leg SPXW chain, local p99 latency was ~96 to 109 ms, 1.36 to 1.55x the pre-change baseline, excluding DB and production middleware. Not a deployed latency promise. Validation summary JSON is linked from the original article.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling it in code
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;gamma_flip&lt;/code&gt; is nullable. Branch on it. Python, JavaScript, .NET, Go and Java SDKs all expose &lt;code&gt;gamma_flip_status&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="n"&gt;fa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FlashAlpha&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="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="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;levels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exposure_levels&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;flip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;levels&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;gamma_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;if&lt;/span&gt; &lt;span class="n"&gt;flip&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Do not substitute a strike crossing or the last known value.
&lt;/span&gt;    &lt;span class="c1"&gt;# The reason tells you whether to retry later or stand down.
&lt;/span&gt;    &lt;span class="n"&gt;reason&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;levels&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;gamma_flip_status&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;No supported flip right now (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;); regime is unknown.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Gamma flip &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;flip&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;, regime &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;levels&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;regime&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="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;Two anti-patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do not carry the last known flip forward. A stale boundary is exactly the error the gates prevent.&lt;/li&gt;
&lt;li&gt;Do not treat &lt;code&gt;unknown&lt;/code&gt; as bearish. It is absence of information, not a negative-gamma reading.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One exception: &lt;code&gt;polarity=flow&lt;/code&gt; on the flow endpoints returns a crossing of the dealer-position-signed per-strike profile. Different quantity, different method, no certificate. Do not compare the two.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backtesting
&lt;/h2&gt;

&lt;p&gt;The same calculation and gates run in point-in-time historical replay. A strategy tested on historical levels sees the same gaps it will see live. A backtest on an always-populated level would overstate signal availability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify it yourself
&lt;/h2&gt;

&lt;p&gt;Every book in the validation set is a stored session on the historical API. Replay the same symbol and timestamp, perturb the per-strike surface, recompute.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Playground: &lt;a href="https://flashalpha.com/docs/playground" rel="noopener noreferrer"&gt;https://flashalpha.com/docs/playground&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Methodology: &lt;a href="https://flashalpha.com/methodology" rel="noopener noreferrer"&gt;https://flashalpha.com/methodology&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;API key: &lt;a href="https://flashalpha.com/pricing" rel="noopener noreferrer"&gt;https://flashalpha.com/pricing&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>api</category>
      <category>finance</category>
      <category>python</category>
      <category>datascience</category>
    </item>
    <item>
      <title>GEXBot vs FlashAlpha: Beyond GEX to Quant Research</title>
      <dc:creator>tomasz dobrowolski</dc:creator>
      <pubDate>Fri, 11 Sep 2026 13:55:10 +0000</pubDate>
      <link>https://dev.to/tomasz_dobrowolski_35d32c/gexbot-vs-flashalpha-beyond-gex-to-quant-research-4112</link>
      <guid>https://dev.to/tomasz_dobrowolski_35d32c/gexbot-vs-flashalpha-beyond-gex-to-quant-research-4112</guid>
      <description>&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; FlashAlpha publishes this comparison. The recommendation rests on the documented workflows below, not on any claim of superior trading returns. Public pages and discovery endpoints were checked on 9 September 2026. Prices are USD on monthly billing, before discounts. Paid feeds were not benchmarked against each other.&lt;/p&gt;

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

&lt;p&gt;If you need a streaming GEX feed and nothing else, GEXBot Quant at $350/month is cheaper. If you need to build and operate a research system (features, backtests, screening, position evaluation, production delivery), FlashAlpha supplies documented components for each stage. Comparing the price of one GEX request leaves most of the product out.&lt;/p&gt;

&lt;h2&gt;
  
  
  Endpoint breadth that works together
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Research capability&lt;/th&gt;
&lt;th&gt;FlashAlpha API examples&lt;/th&gt;
&lt;th&gt;What you can build&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Exposure and positioning&lt;/td&gt;
&lt;td&gt;GEX, DEX, VEX, CHEX, levels, summaries&lt;/td&gt;
&lt;td&gt;Spot, directional, vol and decay sensitivity in one feature set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Volatility and risk premium&lt;/td&gt;
&lt;td&gt;Realised vol, skew, term structure, VRP, SVI parameters&lt;/td&gt;
&lt;td&gt;Test how vol pricing interacts with positioning; inspect model params&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intraday flow&lt;/td&gt;
&lt;td&gt;Effective-OI exposure, dealer-risk shift, simulator state, unusual-flow signals&lt;/td&gt;
&lt;td&gt;Compare settled vs estimated intraday exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Screening and events&lt;/td&gt;
&lt;td&gt;Filters, ranking, custom formulas, earnings calendar&lt;/td&gt;
&lt;td&gt;Universe-wide candidate selection with event context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Position analysis&lt;/td&gt;
&lt;td&gt;Multi-leg Greeks, expiry P&amp;amp;L and breakevens&lt;/td&gt;
&lt;td&gt;Evaluate the structure before trading it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Historical replay&lt;/td&gt;
&lt;td&gt;Timestamp-selected replay of live analytics back to January 2017&lt;/td&gt;
&lt;td&gt;Historical feature datasets with the same response shapes as live&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Tier gating: Basic includes DEX/VEX/CHEX, max pain and position analysis. Growth adds the broader live toolkit. Alpha adds historical replay and advanced research inputs.&lt;/p&gt;

&lt;p&gt;The benefit is less analytics infrastructure to build and maintain. IV solving, exposure aggregation, surface fitting and historical retrieval are separate engineering tasks when you start from raw chains. Your team still owns hypothesis, validation and execution. A subscription does not supply a profitable strategy.&lt;/p&gt;

&lt;p&gt;GEXBot also has APIs, research analytics and higher-order Greeks. The argument here is the combined workflow, not that GEXBot is chart-only.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example workflow
&lt;/h2&gt;

&lt;p&gt;Question: does volatility risk premium behave differently across dealer-positioning regimes?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Build historical features.&lt;/strong&gt; Query historical GEX, VEX, CHEX and VRP for the same symbol and timestamp. Join with your outcome data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate.&lt;/strong&gt; Time-split, out-of-sample test, retain inputs and engine version. This part is yours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screen live candidates.&lt;/strong&gt; Filter and rank the universe, then drill into exposure, flow and vol endpoints for the selected symbols.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluate and monitor.&lt;/strong&gt; Post proposed legs to the position-Greeks and P&amp;amp;L endpoints, then poll live metrics over REST or scope streaming.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GEXBot's GEX feeds can be an input to this system. Their price does not account for the rest of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Historical replay is the live API with a timestamp
&lt;/h2&gt;

&lt;p&gt;This is the part developers care about. The Historical API is not a separate product with its own schema. More than 50 live routes are mirrored on the historical host with the same paths, fields and units, minute by minute back to January 2017. Add an &lt;code&gt;at&lt;/code&gt; timestamp, keep your API key.&lt;/p&gt;

&lt;p&gt;Live and historical share one analytics engine. Automated parity tests compare every Greek between the two paths so they cannot drift. A feature built against the live response works unchanged against the archive. Moving a backtest to production is a base URL swap, not a rewrite.&lt;/p&gt;

&lt;p&gt;Replay runs today's engine over inputs as they were known at the requested minute. An engine improvement on live is the same improvement in your next backtest. Every response carries &lt;code&gt;data_as_of&lt;/code&gt;, &lt;code&gt;archive_as_of&lt;/code&gt; and &lt;code&gt;endpoint_version&lt;/code&gt;, so a study can state exactly which inputs and engine produced it.&lt;/p&gt;

&lt;p&gt;GEXBot Quant's documented history is a rolling 90-day download for eligible REST tickers. Its feed guide states the additional Quant tickers and explicit-expiry streams are not in REST history at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  From notebook to production
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SDKs: Python, JS, C#, Go, Java (github.com/FlashAlpha-lab)&lt;/li&gt;
&lt;li&gt;Hosted Claude MCP connector (OAuth)&lt;/li&gt;
&lt;li&gt;Commercial infrastructure:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Offering&lt;/th&gt;
&lt;th&gt;From&lt;/th&gt;
&lt;th&gt;What it buys&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Professional&lt;/td&gt;
&lt;td&gt;$2,500/mo&lt;/td&gt;
&lt;td&gt;Dedicated node, reserved throughput&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Streaming&lt;/td&gt;
&lt;td&gt;$4,500/mo&lt;/td&gt;
&lt;td&gt;Dedicated node, streaming compute, scoped data licence, 500 concurrent subscriptions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;Reserved capacity, multi-region, custom metrics&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are scoped separately from Alpha, for internal research and trading only. No redistribution or embedding rights. Streaming is in commercial early access. FlashAlpha publishes methodology and security documentation; it does not claim SOC 2 or ISO 27001.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which tier
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Quota&lt;/th&gt;
&lt;th&gt;Start here if&lt;/th&gt;
&lt;th&gt;Move up when&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free, $0&lt;/td&gt;
&lt;td&gt;5/day&lt;/td&gt;
&lt;td&gt;Prototyping a single-expiry equity GEX call&lt;/td&gt;
&lt;td&gt;You need ETFs/indexes or more exposure metrics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Basic, $79&lt;/td&gt;
&lt;td&gt;250/day&lt;/td&gt;
&lt;td&gt;Periodic index/ETF exposure, DEX/VEX/CHEX, max pain, position analysis&lt;/td&gt;
&lt;td&gt;You need full-chain GEX, 0DTE, futures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Growth, $299&lt;/td&gt;
&lt;td&gt;2,500/day&lt;/td&gt;
&lt;td&gt;Live apps combining full-chain exposure, CME futures, flow, vol, screening&lt;/td&gt;
&lt;td&gt;You need historical replay, SVI/VRP, full screener&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alpha, $1,499&lt;/td&gt;
&lt;td&gt;No daily cap&lt;/td&gt;
&lt;td&gt;Historical research plus advanced live analytics&lt;/td&gt;
&lt;td&gt;You need dedicated capacity or streaming&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Capacity maths: three requests every five minutes over a 390-minute session is 234 calls, inside Basic. One call every 15 seconds is 1,560; two is 3,120 and exceeds Growth. Aggregate endpoints reduce call counts. Alpha removes the daily cap, not concurrency limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where GEXBot remains a good choice
&lt;/h2&gt;

&lt;p&gt;Classic ($50) for supported GEX feeds, State ($150) for classified profiles, Orderflow ($250) for flow views, Quant ($350) for WebSockets plus recent history. Research at $100 standalone or $50 add-on gives broad on-demand analytics including vol and higher-order Greeks.&lt;/p&gt;

&lt;p&gt;Classic's aggregation runs up to 90 days out; FlashAlpha Basic's GEX is single-expiry.&lt;/p&gt;

&lt;p&gt;Other checks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Coverage.&lt;/strong&gt; Public GEXBot discovery on 9 September returned 60 regular plus 51 Quant identifiers, some WebSocket-only. FlashAlpha publishes 6,000+ equity/ETF coverage, not independently counted here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Futures.&lt;/strong&gt; GEXBot converts index/ETF levels to futures. FlashAlpha Growth calculates from native options-on-futures. Different underlying markets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streaming.&lt;/strong&gt; GEXBot publishes 09:30 to 16:00 ET with a default 150 hub/group limit. Two metrics on separate hubs with spot can cost four memberships per ticker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Methodology.&lt;/strong&gt; GEXBot's classified models and FlashAlpha's structural/flow calculations are not interchangeable. Check expiry scope, signs, units and timestamps before reading a difference as a data-quality issue.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Recommendation
&lt;/h2&gt;

&lt;p&gt;Choose FlashAlpha when you need to build and operate an options research system across multiple analytics families. Growth for the live application, Alpha for the historical and advanced layer, commercial plans for dedicated infrastructure.&lt;/p&gt;

&lt;p&gt;Start with the endpoints your hypothesis needs, check their output, history and access gates, then pick the tier. For a specific GEXBot profile or an economical standalone GEX stream, GEXBot's packages remain worth considering.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API docs: &lt;a href="https://flashalpha.com/docs/api" rel="noopener noreferrer"&gt;https://flashalpha.com/docs/api&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Pricing: &lt;a href="https://flashalpha.com/pricing" rel="noopener noreferrer"&gt;https://flashalpha.com/pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Historical API: &lt;a href="https://flashalpha.com/docs/historical-api" rel="noopener noreferrer"&gt;https://flashalpha.com/docs/historical-api&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Institutional: &lt;a href="https://flashalpha.com/institutional" rel="noopener noreferrer"&gt;https://flashalpha.com/institutional&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

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