Heston Vanilla Option Pricing with Characteristic-Function Integrals
Summary
The document presents Fourier integral representations for European vanilla call pricing under the Heston stochastic-volatility model. One representation expresses the call through two probability terms whose characteristic functions depend on the current log price and variance. A second representation gives the call as discounted spot value minus an integral involving the risk-neutral characteristic function, with parameters tied to variance mean reversion, long-run variance, volatility of variance, and correlation.
It also states the risk-neutral dynamics for the asset and variance and lists alternative formulations in the literature. A numerical implementation is included in the source, but the formulas and code are not a complete calibration or production guide. Correct use depends on consistent notation, risk-neutral inputs, numerical integration choices, and handling of complex logarithms and square roots. The document focuses on calls; put prices can be obtained through put-call parity under the same assumptions.
Key ideas
- Heston option prices can be written as integrals involving the model’s characteristic function.
- The model couples asset returns and mean-reverting variance through correlated shocks.
- The call value depends on rates, dividends, initial variance, and variance-process parameters.
- Several mathematically equivalent Fourier pricing representations are available.
- Numerical use requires careful parameter conventions and stable integration.
Tags
Full text
# Heston Model Option Price Formula
# Heston Model Option Price Formula
What is the formula for the vanilla option (Call/Put) price in the Heston model?
I only found the bi-variate system of stochastic differential equations of Heston model but no expression for the option prices.
## Answer by user16651 (score 8, accepted)
https://quant.stackexchange.com/a/18686
In the Heston Model we have \begin{align} C(t\,,{{S}_{t}},{{v}_{t}},K,T)={{S}_{t}}{{P}_{1}}-K\,{{e}^{-r\tau }}{{P}_{2}} \end{align} where, for $j=1,2$
\begin{align} & {{P}_{j}}({{x}_{t}}\,,\,{{v}_{t}}\,;\,\,{{x}_{T}},\ln K)=\frac{1}{2}+\frac{1}{\pi }\int\limits_{0}^{\infty }{\operatorname{Re}\left( \frac{{{e}^{-i\phi \ln K}}{{f}_{j}}(\phi ;t,x,v)}{i\phi } \right)}\,d\phi \\ & {{f}_{j}}(\phi \,;{{v}_{t}},{{x}_{t}})=\exp [{{C}_{j}}(\tau ,\phi )+{{D}_{j}}(\tau ,\phi ){{v}_{t}}+i\phi {{x}_{t}}] \\ \end{align}
and
\begin{align} & {{C}_{j}}(\tau ,\phi )=(r-q)i\phi \,\tau +\frac{a}{{{\sigma }^{2}}}{{\left( ({{b}_{j}}-\rho \sigma i\phi +{{d}_{j}})\,\tau -2\ln \frac{1-{{g}_{j}}{{e}^{{{d}_{j}}\tau }}}{1-{{g}_{j}}} \right)}_{_{_{_{{}}}}}} \\ & {{D}_{j}}(\tau ,\phi )=\frac{{{b}_{j}}-\rho \sigma i\phi +{{d}_{j}}}{{{\sigma }^{2}}}\left( \frac{1-{{e}^{{{d}_{j}}\tau }}}{1-{{g}_{j}}{{e}^{{{d}_{j}}\tau }}} \right) \\ \end{align}
where \begin{align} & {{g}_{j}}=\frac{{{b}_{j}}-\rho \sigma i\phi +{{d}_{j}}}{{{b}_{j}}-\rho \sigma i\phi -{{d}_{j}}} \\ & {{d}_{j}}=\sqrt{{{({{b}_{j}}-\rho \sigma i\phi )}^{2}}-{{\sigma }^{2}}(2i{{u}_{j}}\phi -{{\phi }^{2}})} \\ & {{u}_{1}}=\frac{1}{2}\,,\,{{u}_{2}}=-\frac{1}{2}\,,\,a=\kappa \theta \,,\,{{b}_{1}}=\kappa +\lambda -\rho \sigma \,,\,{{b}_{2}}=\kappa +\lambda \,,\ {{i}^{2}}=-1 \\ \end{align} Other representations:
- Carr-Madan (1999)
- Lewis (2000)
- Attari (2004)
- Gatheral (2006)
- Albercher (2007)
## Answer by Appliqué (score 1)
https://quant.stackexchange.com/a/70029
The Heston model is given by the following equations in a risk-neutral measure: $$ dS_t = (r - q)S_t dt + \sqrt{V_t} S_t dW_t, \\ dV_t = \kappa(\theta - V_t)dt + \sigma_V \sqrt V_t dZ_t,\\ dS_t dW_t = \rho dt. $$
The call formula from (Lipton, 2002) is as follows:
$$ C(K, T) = S_0 e^{-qT} - \frac{Ke^{-rT}}{\pi} \int\limits_0^\infty \mathfrak{Re}\left[ e^{(iu+\frac 1 2)k} \phi_T(u - \tfrac i 2)\right] \frac{du}{u^2 + \tfrac 1 4}, \\ k = \ln(S_0 / K) + (r-q)T, $$ where $\phi_T$ is the characteristic function. For Heston model: $$ \phi_T(u) = \exp[A(u) + B(u)V_0],\\ A(u) = \frac{\kappa \theta}{\sigma_V^2} \left[(\beta-d)T - 2\ln \left(\frac{ge^{-dT} - 1}{g-1} \right) \right],\\ B(u) = \frac{\beta-d}{\sigma_V^2}\left( \frac{1-e^{-dT}}{1-ge^{-dT}} \right), \\ d = \sqrt{\beta^2 - 4\hat \alpha \gamma},\\ g = \frac{\beta-d}{\beta+d},\\ \hat\alpha = -\frac 1 2 u(u+i), \quad \beta = \kappa - iu\sigma_v \rho, \quad \gamma = \frac 1 2 \sigma_V^2 $$ The code in Python is below:
```
import numpy as np
import scipy.integrate
r = 0.02
q = 0.01
s = 100.0
v = 0.04
kappa = 1.0
theta = 0.04
sigma_v = 0.2
rho = -0.7
k = 100.0
tau = 1.0
def phi(u, tau):
alpha_hat = -0.5 * u * (u + 1j)
beta = kappa - 1j * u * sigma_v * rho
gamma = 0.5 * sigma_v ** 2
d = np.sqrt(beta**2 - 4 * alpha_hat * gamma)
g = (beta - d) / (beta + d)
h = np.exp(-d*tau)
A_ = (beta-d)*tau - 2*np.log((g*h-1) / (g-1))
A = kappa * theta / (sigma_v**2) * A_
B = (beta - d) / (sigma_v**2) * (1 - h) / (1 - g*h)
return np.exp(A + B * v)
def integral(k, tau):
integrand = (lambda u:
np.real(np.exp((1j*u + 0.5)*k)*phi(u - 0.5j, tau))/(u**2 + 0.25))
i, err = scipy.integrate.quad_vec(integrand, 0, np.inf)
return i
def call(k, tau):
a = np.log(s/k) + (r-q)*tau
i = integral(a, tau)
return s * np.exp(-q*tau) - k * np.exp(-r*tau)/np.pi*i
call(k, tau)
```
- (Lipton, 2002): The Vol Smile Problem, RiskShown 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.