Choosing Log-Moneyness for Implied Volatility Surfaces
Summary
The document distinguishes calculating implied volatility from choosing coordinates for interpolation and display. To calculate implied volatility from market prices, supply the actual spot, strike, maturity, rates, and dividend yield required by the pricing model; transforming strike into log-moneyness is not a substitute for the strike input. Once volatilities are calculated, a surface intended to interpolate in log-moneyness should use log-moneyness and volatility as its interpolation coordinates.
The answer notes that market quotes may already be supplied by strike or by log-moneyness, depending on their source. It also distinguishes spot-based from forward-based log-moneyness, which can matter across maturities. Plotting coordinates are only a visual choice, though sparse points can make plotted lines misleading. This guidance applies to simple interpolation; parameterized models such as SVI, SABR, or Heston impose their own conventions. The discussion is conceptual and provides no empirical comparison or detailed interpolation procedure.
Key ideas
- Use actual market inputs when calculating implied volatility from option prices.
- Interpolate on log-moneyness when that is the chosen surface coordinate.
- Distinguish interpolation coordinates from plotting coordinates.
- Choose between spot and forward log-moneyness with maturity effects in mind.
- Model-based surfaces follow the parameterization's conventions.
Tags
Full text
# Creating Implied Volatility surface using log moneyness
# Creating Implied Volatility surface using log moneyness
When creating the implied volatility surface using $\left(T,log\left(\frac{K}{S_0}\right)\right)$ as $(x,y)$ axis, do the inputs for the implied vol calculation need to be logged too? In other words, when using `py_vollib` to calculate the IV, does the K input need to be changed? Or is it only scaled afterwards for plotting. In python that would be:
```
from py_vollib_vectorized import vectorized_implied_volatility
import numpy as np
import matplotlib.pyplot as plt
"""
Version 1:
"""
T = np.linspace(0.5,2,10)
K = np.linspace(60,120,10)
r=0.05
q=0.02
S_0 = 100
call_prices = np.empty(100)
flag=[]
i=0
while i <100:
call_prices[i] = np.random.normal(10,2)
if call_prices[i]<3:
continue
if call_prices[i] <7:
flag.append('c')
else:
flag.append('p')
i+=1
Ti,Ki = np.meshgrid(T,K)
T=Ti.flatten()
K=Ki.flatten()
imp_vol = vectorized_implied_volatility(call_prices,S_0,K,T,r,flag,q,model='black_scholes_merton',return_as='numpy')
imp_vol=imp_vol.reshape(10,10)
# moneyness scale
Ki = np.log(Ki / S_0)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(Ti, Ki, imp_vol, cmap='viridis')
"""
Version 2:
"""
r=0.05
q=0.02
S_0 = 100
T = np.linspace(0.5,2,10)
# Changing K
eps=0.0001
K = np.log(np.linspace(60,120,10)/(S_0+eps))
call_prices = np.empty(100)
flag=[]
i=0
while i <100:
call_prices[i] = np.random.normal(10,2)
if call_prices[i]<3:
continue
if call_prices[i] <7:
flag.append('c')
else:
flag.append('p')
i+=1
Ti,Ki = np.meshgrid(T,K)
T=Ti.flatten()
K=Ki.flatten()
imp_vol = vectorized_implied_volatility(call_prices,np.log(S_0),K,T,r,flag,q,model='black_scholes_merton',return_as='numpy')
imp_vol=imp_vol.reshape(10,10)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(Ti, Ki, imp_vol, cmap='viridis')
```
```
## Answer by jherek (score 1)
https://quant.stackexchange.com/a/77898
Both ways are possible, and are not the same thing. There is a difference between using log-moneyness (or some other convention) for the input quotes, and using log-moneyness (or some other convention) for interpolation. You argue there may be a third possibility for plotting/presentation.
For equities, input quotes are typically strike based. But this is not always the case depending on where exactly this input comes from. BBG or intermediate systems may give you vols by log-moneyness as input directly.
As the question being asked only mentions creating a vol surface in log-moneyness, the most logical would be to use log-moneyness for both. This means you interpolate your quotes on log-moneyness. So yes, you would use (log(K/S), vol_K) as input to your interpolator.
This is different from interpolating on (K, vol_K).
There is also the question of forward log-moneyness vs. spot log-moneyness which will play a role across option maturities.
The plotting question is not so relevant, as it is really just a visual representation and should not distort the true interpolation being used. You have the choice to use log axis or not there, but be careful plotting lines with a sparse number of points. It may distort the reality.
Finally, the question applies only if your vol representation is a simple interpolation. In some cases, there is a underlying model, which will have its own convention (for example SVI, SABR, Heston). In the latter case, there is no choice on how to interpolate.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.