Using Delta Grids to Estimate Risk-Neutral Option Moments
Summary
The document discusses numerical estimation of Bakshi, Kapadia, and Madan risk-neutral variance, skewness, and kurtosis from option prices. Because the theoretical integrals span a continuum of out-of-the-money calls and puts while market quotes exist only at discrete strikes, the cited empirical method interpolates implied volatility across a grid of option deltas and then maps those delta points back to strikes using Black–Scholes relationships.
Delta provides a measure of how far an option is in or out of the money, making the sampling scheme less dependent on the underlying asset’s price scale and potentially more consistent across maturities and markets. The paper’s implementation approximates the required integrals with the trapezoidal rule. The answer offers intuition for the interpolation choice but does not provide Python code, explain all integration details, or quantify the resulting numerical error; estimates therefore depend on quote quality, interpolation choices, and the finite strike coverage available.
Key ideas
- Risk-neutral moment integrals require option prices across a continuum of strikes, while observed option quotes are discrete.
- Interpolating implied volatility on a delta grid gives a moneyness-oriented sampling scheme.
- Delta-based grids can make sampling more consistent across assets with different price scales.
- Interpolated delta points are converted back to strikes before evaluating the moment integrals.
- The cited empirical procedure uses trapezoidal numerical integration, with accuracy dependent on inputs and coverage.
Tags
Full text
# BKM risk neutral moments in python # BKM risk neutral moments in python I am trying to compute the BKM implied moments (Bakshi, Kapadia and Madan 2003) in python by following this paper: Neumann, Skiadopoulos: Predictable Dynamics in Higher Order Risk-Neutral Moments: Evidence from the S&P 500 Options, Journal of Financial and Quantitative Analysis (JFQA), 2013, p947-977 link which in page 7 and 8, describe the integrals for variance, skewness and kurtosis by equations (8), (9) and (10). In page 8 part B. Empirical implementation, the authors go on about their methodology of extracting the implied moments. What I don't understand is: a) Why they have to interpolate across the implied volatilities as a function of delta (by creating an artificial 'delta grid'), and just to convert these deltas back to the respective strikes afterwards via BS? They say the integrals require 'a continuum of OTM call and put options across strikes', and that we only observe discrete strike prices, hence the reason for using 'delta space'. Why does interpolating in delta space make it any more 'continuous'? b) From page 9 of the paper: `Then, we compute the constant maturity moments [equations (5), (6), (7)] by evaluating the integrals in formulae (8), (9), and (10) using trapezoidal approximation.` How do you evaluate those definite integrals in python? I am stuck staring at those 3 integrals not knowing how to continue in python. Example (part of eq (8)): ## Answer by KT8 (score 2) https://quant.stackexchange.com/a/70508 I think the reason to interpolate using a delta grid is twofold. First, note that the delta of an option (or lets talk about a given strike) gives you some information about how OTM/ITM the option is. Using strikes without checking the deltas could imply that for some maturity you could choose a nice strikes-grid to sample, but however for another set of variable choices that grid would not be so useful or representative, therefore leading to numerical errors in your code. This leads to the second reason, which is related to the first one. From the coding point of view, implementing a sampling routine can be made much more robust using a delta-grid as compared to a strike-based choice. Think about it this way: no matter what are your variable choices, the order of magnitude of the underlying price (which could range from pennies to thousands of dollars for a stock, or could be 1.10-1.20 for some FX, while being 500 for another, etc). If you implement a routine using deltas, then the interpolation mechanism/routine would not care about this issue, as it's defined in terms of delta no matter the underlying, which is actually a quantity that means something (as I said, it gives you an idea on how much an option is ITM/OTM). Therefore, your code does not need you to hard-code a solution on how to interpolate depending on the underlying level, etc. Regarding question b), I suggest you look for some library that allows you to compute those integrals. Unfortunately, I am not as familiarized with those as to suggest one. I think scipy should have some routines, maybe you could take a look at them. Edit: I did not see Kermittfrog comment on this. Thant links points directly to it, so I recommend you go through it.
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.