No-Arbitrage Constraints for Delta-Based Volatility Surfaces
Summary
This question asks how to transform implied volatilities indexed by strike and expiry into a surface indexed by delta and expiry. It highlights an apparent ambiguity: two options at the same expiry can appear to have nearly identical deltas while carrying different implied volatilities, which would assign conflicting values to one point on the transformed surface.
The example supplies two call strikes, volatilities, and computed deltas that are almost equal. The accepted answer identifies the quoted combination as arbitrage: under the stated setup, the higher-strike call would cost more than the lower-strike call, enabling a trader to sell the expensive call and buy the cheaper one. Calls must be decreasing in price as strike rises, so prices violating that condition cannot form a valid arbitrage-free surface.
The answer gives a basic monotonicity check, not a full interpolation method. Other no-arbitrage constraints and practical surface construction details are not discussed.
Key ideas
- Transforming a strike-based volatility surface to delta coordinates can appear ambiguous when distinct options share nearly the same delta.
- The example’s call prices violate the requirement that call prices decrease as strike increases.
- Buying the lower-strike call and selling the more expensive higher-strike call would exploit the stated price inversion.
- The response addresses this specific arbitrage issue but does not explain a complete surface interpolation procedure.
Tags
Full text
# Transforming the volatility surface from strikes to delta
# Transforming the volatility surface from strikes to delta
If I have a bunch of different strikes along with different expiries and their corresponding implied volatility, how do reconstruct this as delta and expiry vs IV?
Where I am confused is that you could have 2 different options with the same delta and expiry, but 2 different implied volatilities. Meaning, you would 2 different z-values at same (x, y) coordinate, then you wouldn't be able to feasibly interpolate. How is this reconciled?
You can see this from the code below:
```
import numpy as np
from scipy.stats import norm
S = 100
r = 0.05
T = 60 / 365
K1 = 102
sigma1 = 0.2
K2 = 110
sigma2 = 0.808
d1 = norm.cdf((np.log(S / K1) + (r + 0.5 * sigma1**2) * T) / (sigma1 * np.sqrt(T)))
d2 = norm.cdf((np.log(S / K2) + (r + 0.5 * sigma2**2) * T) / (sigma2 * np.sqrt(T)))
print(f"Delta = {d1:.4f}")
print(f"Delta = {d2:.4f}")
# Delta = 0.4593
# Delta = 0.4594
```
## Answer by LongTimeLurker (score 2, accepted)
https://quant.stackexchange.com/a/81890
The above scenario admits arbitrage. The higher strike option has a higher price than the lower strike option. You can sell the high strike option, and buy the low strike option for a riskless profit.
One of the no arbitrage conditions is that prices for a call option needs to be strictly decreasing as strike increases. If you remain within this limitation, the issue you describe will not occur.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.