Estimating SPX Option Implied Volatility from Historical Distributions
Summary
The document explores an empirical approach to estimating fair implied volatilities for SPX options. It proposes using a proxy for future volatility, such as VIX, to select similar historical observations, fitting a distribution to those observations, and treating distribution cumulative probabilities as option deltas. Implied volatilities are then chosen to match those deltas.
The author reports trying several distribution families and both raw and logarithmic strikes, with mixed results. The resulting volatility curves can contain discontinuities and spikes, especially for near-term expirations. Median filtering and shifting the fitted distribution toward the risk-neutral drift improve some cases but do not fully address the problem; selecting the smaller volatility where delta relationships are non-monotonic is another heuristic. These are experiments seeking feedback, not a validated pricing method, and the note provides no out-of-sample performance evidence or definitive solution.
Key ideas
- Similar historical volatility-proxy readings can be used to select observations for an empirical distribution.
- The proposed method maps fitted distribution probabilities to option deltas and solves for matching implied volatilities.
- Different distribution families and strike transformations produce mixed curve quality.
- Median filtering and drift adjustment reduce some irregularities but leave unresolved issues.
- The document presents exploratory heuristics rather than a tested pricing framework.
Tags
Full text
# Determing "fair" implied volatilities for SPX options # Determing "fair" implied volatilities for SPX options I'm trying to come up with a method to calculate fair IVs for SPX options based on historical data. I can't find much information on this so here's how I've thought to do it: - Determine a metric for approximating future volatility. This could be as simple as using the current VIX value or could be any desired method. - Identify days with the N most similar historical values of the metric. So if the VIX were used as the metric and the current day has a VIX reading of 14, you might end up selecting all days where the VIX was between 13.5 and 14.6. - Fit a distribution to those days. I tried a few but only got somewhat reasonable results with skewed Cauchy, asymmetric laplace, and metalog. I would have tried the skewed Student's T distribution but I can't find a Python package that has a fit function. I tried both the raw and log strikes and got similar results. - I treat the cdf values from the distribution as option deltas and solve for IVs that match the deltas. Certain contracts have a non-monotonic relationship between deltas and IV, so I just use the smaller of the IVs when that happens. If I don't do that, I get an even messier result. - The issue is that I'm getting breaks in the IVs. I'm able to partially solve that by applying a median filter, but it's too severe for many longer dated contracts. I think the issue is caused by the fact that the mean/median of the historical data is different than the expected drift based on Black-Scholes (takes into account the risk free rate and dividend yield), but even if I adjust for that by just sliding the distribution to the expected drift, it helps but doesn't completely resolve the issue. Here are some metalog examples, the first two where it looks pretty good and two where it doesn't. So basically it gets messy at under a month out (the other distributions hold up better for later expirations but don't look as nice for near term expirations), but note that without the median filter, even the first two would have big spikes near the current SPX value. The only other thing I can think to do is use np.polyfit to create smooth curves but then I'd have to figure out how to tune the number of degrees, which might be different for every expiration. There is some information out there about fitting distributions to returns but I couldn't find anything relating this to setting IVs. I would at least expect to have smooth curves even if the first two steps above were misguided, but I'm getting getting discontinuous curves instead. I'm hoping someone can provide feedback or hopefully a better approach.
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.