Skip to content

How to Compare Implied and Historical Volatility on the Same Horizon

Original question

Can you explain the difference between historical volatility and implied volatility, and why option traders care about both?
Historical volatility measures how much past returns varied over a chosen window. Implied volatility is the model volatility that reproduces an observed option price. Historical volatility depends on the return sample and annualisation convention. Implied volatility depends on the option’s strike, maturity, quote and pricing inputs.

Compute the historical estimate and invert the option quote

For daily adjusted prices S0,…,SnS_0,\ldots,S_n, calculate log returns xi=log⁡(Si/Si−1)x_i=\log(S_i/S_{i-1}). With A=252A=252 trading days per year, a sample estimate is

σ^hist=A1n−1∑i=1n(xi−xˉ)2.\widehat\sigma_{\mathrm{hist}}=\sqrt{A}\sqrt{\frac{1}{n-1}\sum_{i=1}^n(x_i-\bar x)^2}.
The square-root annualisation is a convention motivated by additive variance under uncorrelated returns. It is a standard way to quote the daily estimate even if your subsequent forecasting model allows time-varying volatility.
For a call quote CmktC_{\mathrm{mkt}}, solve CBS(S,K,r,τ,σ)−Cmkt=0C_{\mathrm{BS}}(S,K,r,\tau,\sigma)-C_{\mathrm{mkt}}=0. Black–Scholes vega is positive for positive S,K,τ,σS,K,\tau,\sigma, giving a unique finite positive solution when the call lies strictly between its zero-volatility value and upper price bound. A bracketed root finder works well if you verify the price and inputs first.
Suppose the last 21 daily log returns have a sample standard deviation of 1.00%1.00\%. Then historical volatility is about 0.01252=15.9%0.01\sqrt{252}=15.9\% annualised. Now take a 30-calendar-day, at-the-money European call on a non-dividend-paying 100100 stock, with zero rates and a premium of 2.752.75. Its implied volatility is about 24.05%24.05\%. If earnings fall within those 30 days, the comparison gives you a reason to check the scheduled event and compare nearby expirations. Also inspect bid and ask implied volatility. A wide market can make the apparent gap quite sensitive to the quote you choose.
For comparison on the option's horizon, convert an annual volatility σ\sigma to a horizon standard deviation using στ\sigma\sqrt{\tau} under the constant-variance convention. If comparing realized variance with an option-based expectation, line up the actual dates and square the standard deviations before making a variance comparison. A trailing month of returns describes a period that has ended. A one-month option refers to the period ahead, which may include an earnings release or another event absent from the trailing window. Matching horizons makes the numbers comparable without turning their difference into a forecast error.

When solving for implied volatility, first check that the option quote lies within its no-arbitrage price bounds under the specified inputs. Away from degenerate cases, the Black–Scholes price increases with volatility, which makes the inversion one-dimensional. Bid and ask prices can imply different volatilities. In a wide market it is more honest to report the corresponding interval than to claim that the midpoint volatility is known precisely. Match the option's maturity, strike and dividend assumptions before using a difference between historical and implied numbers as a research signal.

Compute a historical estimate and solve for implied volatility

from math import sqrt from scipy.optimize import brentq from scipy.stats import norm maturity = 30 / 365 def at_money_call(vol): d1 = 0.5 * vol * sqrt(maturity) return 100 * (2 * norm.cdf(d1) - 1) historical_vol = 0.01 * sqrt(252) implied_vol = brentq(lambda vol: at_money_call(vol) - 2.75, 1e-8, 3) print(historical_vol, implied_vol)
The volatility surface tool shows why it matters which strike and expiry you take the implied volatility from.

Interactive example

Move volatility and expiry in Black–Scholes

This European call uses strike 100, a continuously compounded risk-free rate of 5% and zero dividends. The benchmark spot is 100.

Price at spot 100 is 10.45 · delta 0.637
Call prices across spot prices compared with the expiry payoff01020307085100115130Spot priceValue
  • Call price today
  • Expiry payoff