Skip to content
All library documents

Interpolating Implied Volatility Across Option Delta

Article Quant Q&A · Author: Alex

Summary

The document describes a practical problem in constructing an option volatility surface from implied volatilities quoted at different deltas. Direct interpolation in delta space can be awkward because call and put deltas fall on opposite sides of the axis, even though their at-the-money points should meet. The author’s proposed workaround is to transform delta into a moneyness-like variable based on the normal quantile, interpolate volatility in that coordinate, and convert back when needed.

The question asks whether an R package can handle this workflow or generate a full surface from delta-volatility observations. It provides no answer, package recommendation, validation, or pricing method. Consequently, it identifies the interpolation challenge and a candidate coordinate transformation but does not establish that the approach is appropriate across option conventions, expiries, or market regimes.

Key ideas

  • Call and put deltas occupy opposite sides of the delta axis, complicating direct interpolation.
  • The author proposes transforming delta with a normal quantile before fitting a spline.
  • The intended output is a volatility surface from observed delta and implied-volatility pairs.
  • The document leaves package choice and the best interpolation method unresolved.

Tags

Full text
# Interpolate option volatility in delta space in R


# Interpolate option volatility in delta space in R












I have a bunch of deltas and option implied vols at those deltas. I would like to interpolate them in R. Interpolating them in delta space seems difficult, since normally you would like the ATM calls and puts to paste together, but in delta space they will be on opposite ends of the x-axis (delta). I was thinking of simply doing the following:

```
# first convert everything to moneyness type measure
sample_delta = c(seq(-.5, -.05, by=.05), seq(.05, .55, by=.05))
sample_vols = runif(n = length(sample_delta)) # some made up vols
d1 = ifelse(sample_delta < 0, qnorm(sample_delta +1), qnorm(sample_delta))
s = spline(d1, sample_vols)
```

The issue is that I have to go back and forth converting between `d1` and `delta` when at the end of the day I just want things to be in standardized delta space. Does R have any packages to do this? For example `quantmod` or something of the sort.

To make things more clear: Given a bunch of deltas and implied vols, I would like to generate an entire vol surface. What is the best way to do this?

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.