Reconstructing CBOE Single-Name 25-Delta Skew from Options Data
Summary
The document investigates how to reproduce CBOE’s discontinued single-name 30-day normalized skew field using historical options data. It describes the target as the 25-delta put implied volatility minus the 25-delta call implied volatility, divided by at-the-money implied volatility, with near and next expirations blended to a constant 30-day maturity. The author reports trying vendor Greeks, fixed-moneyness estimates, delta interpolation from end-of-day quotes, and a forward-based Black-76 approach. Each produced AAPL values that were higher and noisier than the CBOE series.
The author rules out several suspected causes, including far-out-of-the-money liquidity filters, applying the full index-level SKEW formula, and a rare underlying-price outlier. Using closing trade prices instead of quote midpoints substantially reduced the gap in one test, suggesting a difference in volatility inputs or vendor conventions, but this remains a partial observation. The document is a troubleshooting question, not a verified reconstruction: it offers no complete legacy-feed specification and leaves open whether CBOE applied additional smoothing near the target delta.
Key ideas
- The described single-name skew field compares 25-delta put and call implied volatility relative to at-the-money implied volatility.
- The target uses a constant-maturity blend of listed expirations to reach 30 days.
- The author reports that several quote-based and forward-based methods produced higher, noisier AAPL estimates than CBOE’s values.
- Trade-price implied volatility reduced the discrepancy in one contract test, but the observation does not establish the production methodology.
- The document does not resolve whether CBOE used local smoothing or provide a complete feed specification.
Tags
Full text
# Replicating CBOE's discontinued norm_25d_skew_30 field using Thetadata historical options data # Replicating CBOE's discontinued norm_25d_skew_30 field using Thetadata historical options data I'm trying to reproduce CBOE's discontinued daily options summary feed's per-symbol skew field (norm_25d_skew_30, confirmed via the actual flat-file column header) using Thetadata as the historical options data source, and after several implementation attempts I'm still running consistently higher and noisier than the real CBOE values. Target formula (confirmed via the flat-file field name and consistent with the formula CBOE describes in their 2010 SKEW Index whitepaper, adapted to a 2-point 25-delta version rather than the full BKM portfolio-replication index): ``` norm_25d_skew_30 = [IV(25-delta put) - IV(25-delta call)] / IV(ATM) ``` constant-maturity blended to exactly 30 days between the near and next listed expirations, using standard VIX-style time interpolation. What I've tried, in order: Used Thetadata's pre-computed delta/IV from their bulk greeks endpoint, snapping to whichever real listed strike is closest to 25-delta. Abandoned delta, used fixed moneyness (spot ±7%) with self-solved IV from EOD bid/ask midpoints. Self-solved IV and delta from EOD bid/ask midpoints at every listed strike, then linear-interpolated in delta-space to the exact theoretical 25-delta point. Same as #3, but using a forward price (derived via put-call parity at the strike where |call_mid - put_mid| is minimized, per CBOE's own published forward-price rule) instead of raw spot, with Black-76 for the IV/delta solve — this correctly absorbs dividend/carry effects without a separate dividend parameter. Result across all four attempts: AAPL skew30, mean running ~0.10-0.18 vs. CBOE's actual ~0.02-0.04 for the same period — roughly 4-5x too high — and noticeably noisier day-to-day (in one clean 28-day date-matched test, our std was about 7x larger than CBOE's, despite a directionally similar shape). What I've ruled out: Liquidity/spread filtering of far-OTM strikes (zero effect — those strikes were never in the 2-point interpolation bracket anyway) The full BKM/SKEW-Index formula applied to the single name (tested directly — produces a value in the 100-150 index-scale range, confirming this is a different statistic, not what the norm_25d_skew_30 field actually is) A specific data-quality bug in Thetadata's underlying_price field (found one real, rare outlier day, but it's far too infrequent to explain a persistent multi-year mean-level gap) One partially-confirmed lead: switching my IV solve from quote midpoint to the EOD trade/close price closed about 85% of the gap on one specific test contract (AAPL, 165 call, 30ish DTE) — Thetadata's own Greeks endpoint apparently solves IV from trade price, not quote midpoint, while CBOE's published whitepaper methodology explicitly specifies quote midpoint. So there may be a real, unresolved tension between "match Thetadata's own numbers" and "match CBOE's documented methodology." My questions: - Has anyone successfully reproduced CBOE's discontinued single-name skew fields (or the related iv30/iv90 style fields from the same legacy feed) using a different vendor's raw options data? What was the key gotcha? - Is there a known reason a correctly-implemented 2-point 25-delta risk reversal would still run persistently smoother (much lower day-to-day variance) than CBOE's number, even after the methodology and forward-price derivation are correct. I'm wondering if CBOE's real production pipeline uses some local averaging/smoothing near the 25-delta point rather than pure 2-strike linear interpolation, even though the field is still called "25d." Any pointers to a more complete technical spec for CBOE's legacy daily options summary feed (not the public SKEW Index whitepaper, which is for a different, index-level product) would be hugely appreciated. Happy to share code/sample data if useful.
Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.