Estimating Nonnegative Risk-Neutral Densities from Option Prices
Summary
The document examines negative values produced when estimating a risk-neutral density from the second differences of same-maturity option prices across adjacent strikes. The example uses S&P 500 call quotes and shows that even a finite-difference estimate based on bid, offer, or average prices can be negative. The question suggests that variation in bid-offer spreads across strikes may contribute to the problem, but the response does not establish a specific cause or quantify the spread’s effect.
One proposed approach is to fit a polynomial to the estimated density values by minimizing squared errors while constraining fitted values to be nonnegative at the observed points. Kernel regression is offered as another possible smoothing method. These are general fitting suggestions rather than a complete calibration recipe: the answer does not specify polynomial order, boundary treatment, quote cleaning, or how to enforce broader distributional conditions such as normalization. The methods can reduce negative fitted estimates, but model choice and noisy option quotes remain limitations.
Key ideas
- Finite differences of option prices can yield negative density estimates when quotes are noisy or irregular.
- A polynomial fit can minimize deviations from observed estimates while constraining fitted values to be nonnegative.
- Kernel regression is another suggested way to smooth density estimates.
- The response does not specify how to select smoothing parameters or enforce all probability-density conditions.
Tags
Full text
# How to handle bid-offer spread causing negative estimations of risk-neutral densities from option prices?
# How to handle bid-offer spread causing negative estimations of risk-neutral densities from option prices?
I have attempted to estimate the risk-neutral probability density, from CBOE options prices on S&P500 from 2010 to 2016, using the following approximation from Hull (2018).
For call options on a given date with equal maturity, prices $c_1,c_2,c_3$ and strikes $K_1 = K_2-\delta, K_2,K_3=K_2+\delta$.
$ \hat{g}(S_T=K) = e^{-r*(T-t)}\frac{c_1+c_3-2 * c_2}{\delta^2} \quad (1)$
For some reason, this expressions returns a negative value for some strikes.
Here is an example from my dataset:
```
dtmyears libor3m bid offer cp_flag strike g
.032 .0025063 188.9 192.3 "C" 925 .
.032 .0025063 164.1 167.4 "C" 950 .
.032 .0025063 139.2 142.6 "C" 975 4.54e-17
.032 .0025063 114.4 117.8 "C" 1000 -.00016 <---- Why is it negative?
.032 .0025063 89.6 92.9 "C" 1025 .00048
.032 .0025063 64.9 68.3 "C" 1050 .00032
.032 .0025063 41.2 43.9 "C" 1075 .00336
.032 .0025063 19.6 21.6 "C" 1100 .0112
.032 .0025063 4.8 6.3 "C" 1125 .01616
.032 .0025063 .3 1.1 "C" 1150 .00752
```
In the example above, i have calculated $g(S_T = 1000)$ as follows (ignoring discounting):
$ \hat{g}(S_T=1000) =\frac{142.6+92.9-2*117.8}{25^2}=-.00016$
This occurs both for puts and calls in all years, and both for bids, offers and averages of these.
I suspect, that this is caused by differences in spread between the strikes.
Is it possible to incorporate the bid-offer spread in $(1)$, such that the effect is eliminated?
## Answer by Daneel Olivaw (score 2, accepted)
https://quant.stackexchange.com/a/38900
You could for example parametrize your risk-neutral density $\hat{g}(S_T=x)$ as a polynomial:
$$ \hat{g}(S_t=x)=\sum_ia_ix^i$$
and solve the program for a chosen polynomial order $n =\max i$:
$$\begin{align} & \min_{(a_i)}\left[\sum_k\left(\sum_i a_ix_k^i-\hat{g}(S_t=x_k)\right)^2\right] \\[3pt] & \ \forall \ k, \ \sum_ia_ix_k^i\geq0 \end{align}$$
You can also use more tailored solutions to your problem such as kernel regression.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.