The SPY Volatility Cone: 8 Years of Realized Vol Percentiles (2018-2026) | FlashAlpha

The SPY Volatility Cone: 8 Years of Realized Vol Percentiles (2018-2026)

A SPY volatility cone built from 8 years of historical closes (2018-2026): realized volatility percentiles at 1-month, 3-month, 6-month and 1-year windows, with ATM implied vol percentiles alongside. Median 1-month realized vol is 11.8% while median ATM IV is 14.0% - the volatility risk premium, visible in one table. Includes the method and API calls to rebuild it.

T
Tomasz Dobrowolski Quant Engineer
Jul 21, 2026
16 min read
Volatility DataStudy VolatilityCone RealizedVol HistoricalData Quant

"IV is 18" means nothing by itself. Eighteen is cheap in a crash and absurdly rich in a 2024-style grind. The volatility cone fixes the frame: for each horizon, it shows where realized volatility has actually lived - minimum, quartiles, extremes - so any live IV quote can be placed in its historical distribution instantly. Here is the SPY cone, built from FlashAlpha Historical price data covering May 2018 through March 2026, a window that contains Volmageddon's aftermath, the Covid crash, the 2022 bear, and two of the calmest grind years on record.

Method
  • Prices: 413 weekly SPY closes (Friday 16:00 ET, or Thursday on holiday weeks), May 2018 to March 2026, from /v1/stock/{symbol}/summary point-in-time replays
  • Realized vol: rolling standard deviation of weekly log returns, annualized (×√52), at 4, 13, 26, and 52-week windows
  • Implied side: ATM IV sampled at the same 413 closes for the percentile comparison
  • Sampling note: weekly closes make this a close-to-close cone; a daily-bar version via /v1/stock/{symbol}/prices runs the same way with ~5x the observations (call shown below)

The Cone

Annualized realized volatility of SPY, in percent, by rolling window:

Window Min 5th pct 25th pct Median 75th pct 95th pct Max (when)
1 month (4w) 1.2 3.9 7.6 11.8 18.9 37.6 94.9 (Apr 2020)
3 months (13w) 3.8 7.0 10.5 14.0 20.0 29.4 57.9 (May 2020)
6 months (26w) 8.3 9.3 12.1 14.4 21.0 40.1 43.1 (Jul 2020)
1 year (52w) 10.2 11.5 13.3 17.0 21.0 31.1 32.9 (Feb 2021)

The cone shape is the classic one: short windows have wild dispersion (1-month realized has printed everything from 1.2% to 94.9%), long windows compress toward the long-run mean (1-year realized has never left the 10-33 band in eight years). That is exactly why comparing a 1-week IV to a 1-year average is meaningless - each horizon needs its own distribution.

The Premium, In One Comparison

ATM implied vol sampled at the same 413 weekly closes:

Series 25th pct Median 75th pct 95th pct
ATM implied vol 10.6 14.0 19.5 29.9
1-month realized vol 7.6 11.8 18.9 37.6

Two things worth staring at. First, the medians: implied has run ~2 vol points above short-horizon realized for eight years - the structural volatility risk premium that every premium-selling strategy ultimately harvests. Second, the 95th percentiles flip (29.9 implied vs 37.6 realized): in genuine crises, realized vol overshoots what the options market was pricing. Sellers collect the middle of the distribution and pay the tail - the same asymmetry we measured at the daily horizon in the 0DTE straddle study.

How to Use the Cone

  • Entry filter for vol selling: today's 1-month ATM IV above the cone's 75th percentile for 1-month realized (18.9) means you are being paid above-median rates for the risk. Below the 25th (7.6), premium selling is picking up pennies.
  • Entry filter for vol buying: long-vol structures priced when IV sits under the realized median are the only ones that do not need a crisis to break even.
  • Reality check on forecasts: any model forecasting 6-month vol outside 9-43 is forecasting something SPY has not done in eight years - possible, but it should have to argue for it.

Rebuild It (Daily Resolution)

# 2000 daily OHLC bars in one call
curl -H "X-Api-Key: YOUR_API_KEY" \
  "https://historical.flashalpha.com/v1/stock/SPY/prices?days=2000"
import httpx, numpy as np, pandas as pd

r = httpx.get("https://historical.flashalpha.com/v1/stock/SPY/prices",
              params={"days": 2000}, headers={"X-Api-Key": "YOUR_API_KEY"})
bars = pd.DataFrame(r.json()["bars"]).set_index("date")
ret = np.log(bars["close"]).diff()
for w in (21, 63, 126, 252):          # 1m / 3m / 6m / 1y in trading days
    rv = ret.rolling(w).std() * np.sqrt(252) * 100
    print(w, rv.quantile([.05, .25, .5, .75, .95]).round(1).tolist())
Honest limitations. This cone is built from weekly closes, so it understates intraweek path (a daily-bar or Yang-Zhang version reads a few points differently - see Yang-Zhang vs Close-to-Close). Windows overlap, so percentiles describe the distribution of experiences, not independent draws. And eight years contains exactly one true crash - the right tail is one event's signature, not a law.

Related Articles

Historical API · Alpha tier · from $1,199/mo
Build your own cone for any covered symbol
Daily bars, minute-level quotes, and point-in-time IV since January 2017 - one API key, fully reproducible.
View pricing →

Frequently Asked Questions

A volatility cone plots the historical distribution of realized volatility (min, quartiles, max) at several measurement windows - 1 month, 3 months, 6 months, 1 year. Short windows show wide dispersion and long windows converge toward the long-run mean, giving the chart its cone shape. Traders use it to judge whether today's implied volatility is high or low relative to what the underlying has actually delivered at that horizon.
From 2018 to 2026, SPY's median realized volatility was about 11.8% at a 1-month window, 14.0% at 3 months, 14.4% at 6 months, and 17.0% at 1 year. The interquartile range at 1 month was roughly 7.6% to 18.9%. Extremes ranged from 1.2% (calmest month) to 94.9% (the Covid crash window in April 2020).
Yes, most of the time. In this 8-year sample the median ATM implied vol (14.0%) sat about 2 points above the median 1-month realized vol (11.8%) - the volatility risk premium. The exception is crises: at the 95th percentile, realized (37.6%) exceeds implied (29.9%), meaning options underpriced the true tail when it arrived.

Conclusion

The cone turns "is vol high?" from an opinion into a lookup. SPY's eight-year answer: implied usually pays you ~2 points over realized, short-horizon vol lives mostly between 8 and 19, and roughly once a decade the right tail rewrites the chart. Keep the table above open next to a live IV feed and every vol trade starts with a percentile, not a feeling. The price series behind it is one API call - historical docs here.

Live Market Pulse

Get fast visibility into market shifts with full-chain analytics over low-latency REST and MCP polling.

Intelligent Screening

Screen millions of option pairs per second using your custom EV rules, filters, and setups.

Export-Ready

Export structured signals to your own execution stack or broker integration - FlashAlpha delivers the analytics, you keep control of order routing.

Join the Community

Discord

Engage in real time conversations with us!

Twitter / X

Follow us for real-time updates and insights!

GitHub

Explore our open-source SDK, examples, and analytics resources!