On 19 February 2020 the VIX, the index that reads the expected volatility of the S&P 500 out of option prices, closed at 14.4. Over the next 21 trading days the S&P 500 moved with an annualised volatility of 84 per cent. It is the largest miss of the last ten years, and it is the exception. On five days out of six in that decade, the VIX was higher than the volatility that actually followed.
The first post in this series covered what volatility is. This one is about the two versions of it that come up in practice, historical and implied, and why the difference between them is where most of the useful information lives. Anyone who trades options, or who holds anything and wants to know how much it might move against them, ends up looking at both.

Historical volatility
Historical volatility is a description of the past. You take the daily returns of an asset over some window, typically 20, 50 or 100 trading days, work out their standard deviation, and scale that to an annual figure. If the result is 30 per cent, the asset has been moving, on a one-standard-deviation basis, by about 30 per cent a year over that window. The calculation itself is short, and I go through it line by line in a later post, with a worked example on a year of Bitcoin after that.
What it is useful for is understanding the thing you are about to trade. Before I model any asset or any derivative, the first study I do is always this one. I want to know how the animal actually behaves: how big a normal day is, how big a bad day is, and how often the bad days come. Everything about position size and where to put a stop follows from that, and there is no shortcut that lets you skip it. Comparing the historical figure across different windows also tells you whether conditions are changing, since a 20-day figure that is well above the 100-day one means the recent past has been rougher than the longer past.
Implied volatility
Implied volatility is not a description of anything that has happened. It is a reading of what the options market is currently expecting. The price of an option depends on the price of the underlying asset, the strike, the time to expiry, the interest rate and the volatility, and all of those except the last one are known. So you can take the price the market is quoting, run the pricing model backwards, and find the volatility that the price implies. That is where the name comes from. I set out how the calculation works and then do it on a real Bitcoin option in two later posts.
Because it comes from prices people are actually paying, implied volatility is a fair measure of sentiment. When it rises, people are paying more for options, which means they are more worried, or more excited, about the size of the coming moves. When it falls, they expect a quiet period. It also feeds straight back into pricing: a higher implied volatility makes every option on that asset more expensive, calls and puts alike.
The difference in one table
| Historical volatility | Implied volatility | |
|---|---|---|
| Direction | Backward-looking, from past prices | Forward-looking, from current option prices |
| Source | A price series | The options market |
| Main use | Understanding risk, sizing positions, spotting regime changes | Pricing options, reading sentiment, finding mispriced contracts |
| Behaviour | Fixed for a given window and set of prices | Changes with every tick of the options market |
Why you look at both
On their own, each number is of limited use. Together, they tell you whether the market’s expectations are reasonable. If implied volatility is well above the historical figure, options are expensive relative to how the asset has actually been behaving, and the market is either anticipating an event, an earnings release say, or a central bank meeting, or is simply nervous. If implied is well below historical, options are cheap relative to recent experience, and someone buying protection is getting it at a discount.
That gap is the basis of a whole family of strategies. Selling options when implied volatility is high and expected to fall back towards historical levels is the most common, and buying them when the reverse is true is the mirror image. Volatility arbitrage in its various forms is the same idea with more machinery attached. All of it depends on having both numbers and understanding what each one can and cannot tell you.
There is a third figure worth knowing, which is realised volatility: what the volatility actually turned out to be over the life of an option, measured after the fact. Comparing that with what was implied at the start tells you whether the market overestimated or underestimated the risk, and doing that comparison repeatedly over time is one of the better ways to learn how a particular market tends to err.
What ten years of the VIX show
The VIX is the cleanest public example of implied volatility. Cboe calculates it from S&P 500 options and expresses it the same way as historical volatility, as an annualised percentage, over the next 30 calendar days, which is about 21 trading days. That means it can be checked against what happened. I took every trading day from December 2016 to October 2026 for which both numbers exist, 2,468 of them, and compared the VIX on each day with the realised volatility of the S&P 500 over the following 21 trading days, using the index closes published by the St Louis Fed.
The VIX averaged 18.7 over the period. The volatility that followed averaged 15.1, and the trailing 21-day historical figure averaged almost exactly the same. On 2,063 of the 2,468 days, 84 per cent, the VIX was at or above what the index then delivered, and the typical gap was 4.6 points.
The pattern held in very different years. In 2017, the calmest year in the sample, the VIX averaged 11.1 against 6.7 realised. In 2023 it was higher on every single day. The years in which it was caught out most often were 2018 and 2022, the two years in which sharp falls began from calm conditions.
| Year | Average VIX | Average realised volatility, next 21 trading days | Days the VIX was higher |
|---|---|---|---|
| 2017 | 11.1 | 6.7 | 99% |
| 2018 | 16.6 | 16.1 | 60% |
| 2019 | 15.4 | 11.1 | 84% |
| 2020 | 29.3 | 27.2 | 75% |
| 2021 | 19.7 | 12.8 | 95% |
| 2022 | 25.6 | 23.9 | 63% |
| 2023 | 16.9 | 12.5 | 100% |
| 2024 | 15.6 | 12.5 | 81% |
| 2025 | 19.0 | 15.5 | 85% |
| 2026, to early October | 18.2 | 12.8 | 95% |
Which of the two forecasts better
If what you want is a number for how much the S&P 500 will move over the next month, the VIX is the better of the two. Its correlation with the volatility that followed was 0.60, against 0.50 for the trailing 21-day historical figure, and its errors were smaller: 9.2 points against 10.4, measured as root mean square. So it is the better forecast, and a biased one. It is too high most of the time, and the market knows it.
Why the VIX is usually too high
The gap is not a mistake nobody has noticed. It is the price of insurance. Most buyers of S&P 500 options are protecting portfolios, and they pay more than the expected cost because the bad months are very bad. The chart shows the shape of the bargain.

On half the days the VIX was more than 4.6 points above what followed. But the average gap was only 3.6 points, because the misses on the other side are large. On one day in twenty, realised volatility beat the VIX by more than 7.3 points, and on one day in a hundred by more than 31. The worst cases are the ones people remember: 14.4 on 19 February 2020, followed by 84.3; 17.1 on 25 March 2025, followed by 49.3 as markets absorbed the US tariff announcements of early April; 16.4 on 3 December 2018, followed by 31.7; 11.1 on 26 January 2018, followed by 26.1.
For anyone selling options, that is the whole business in two numbers: a small amount collected on most days, and an occasional loss many times larger. Whether it pays depends almost entirely on position size, which is why the volatility sellers who stay in business size their positions for the worst month, not the average one. I described how a systematic fund sets size by risk rather than conviction in the piece on systematic macro.
Does waiting for a wide gap help?
A natural refinement is to sell only when implied is well above historical. The data support it less than you might expect. On the 198 days when the VIX was more than 10 points above the trailing 21-day figure, it ended above the volatility that followed 90 per cent of the time, by 7.1 points on average. On the 349 days when it was below the trailing figure, it still ended above 78 per cent of the time. The premium is nearly always there. A wide gap makes it somewhat larger and somewhat more reliable, not certain.
On 4 November 2026 the VIX closed at 16.6, down from 20.8 the day before. The S&P 500’s realised volatility over the 21 trading days to 3 November was 11.4. A gap of about five points is close to the ten-year median, which says only that options are priced as they usually are, with the usual premium. It says nothing about which way the next month will go.
What neither of them promises
Historical volatility assumes the recent past is a guide to the near future, and it is, until it isn’t. It will not warn you about a regime change, and the first you will know of one is when the 20-day figure jumps. Implied volatility is a collective expectation, and collective expectations are often wrong, sometimes badly. Neither is a forecast. They are two different ways of putting a number on uncertainty, one from what has happened and one from what people are paying for, and the honest use of them is side by side.
Checking it yourself
Both series are free from the St Louis Fed. FRED’s S&P 500 series covers the last ten years, which is why the comparison starts in late 2016. In Python:
import numpy as np
import pandas as pd
base = "https://fred.stlouisfed.org/graph/fredgraph.csv?id="
vix = pd.read_csv(base + "VIXCLS", index_col=0, parse_dates=True, na_values=".").iloc[:, 0]
spx = pd.read_csv(base + "SP500", index_col=0, parse_dates=True, na_values=".").iloc[:, 0].dropna()
r = np.log(spx).diff()
fwd = r.rolling(21).std().shift(-21) * np.sqrt(252) * 100 # the next 21 trading days
df = pd.concat({"vix": vix, "fwd": fwd}, axis=1).dropna()
gap = df["vix"] - df["fwd"]
print((gap >= 0).mean(), gap.median(), gap.mean())
print(df.corr())
The first print line gives the share of days on which the VIX was at or above what followed, the median gap and the average gap; the second gives the correlations. Change the window, the start date or the measure of volatility and the figures move a little, which is a good reason to run the check yourself before relying on anyone’s numbers, mine included.