Implied Volatility from Heston Model

Quantitative Finance Asked on August 3, 2020

When one construct surface for Implied volatilities using Heston model from different Strike prices and Maturities, we get a surface where long dated volatilities are smaller than the short dated ones.

Is there any business reason for such shape?

One Answer

This is definitely not generally true

HestonModel's behaviour is controlled by several parameters, but looking at the equation for variance in the Heston model we see that the long term vol is determined by the $theta$ term, variance will tend to equal this because if it goes above the drift pulls it back down, and vice versa (ie. it's mean-reverting).

Heston equations

So, if initial variance v0 is lover than $theta$, long term IV will be higher than short-term IV. Below is a snippet that generates a vol surface demonstrating this

Example Heston surface using the above parameters

import QuantLib as ql
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def plot_vol_surface(vol_surface, plot_years=np.arange(0.1, 2, 0.1), plot_strikes=np.arange(80, 120, 1)):
    fig = plt.figure()
    ax = fig.gca(projection='3d')

    X, Y = np.meshgrid(plot_strikes, plot_years)
    Z = np.array([vol_surface.blackVol(float(y), float(x)) 
                  for xr, yr in zip(X, Y) 
                      for x, y in zip(xr,yr) ]
                 ).reshape(len(X), len(X[0]))

    surf = ax.plot_surface(X,Y,Z, rstride=1, cstride=1, linewidth=0.1)

    fig.colorbar(surf, shrink=0.5, aspect=5)

spot = 100
rate = 0.0

today = ql.Date(1, 7, 2020)

calendar = ql.NullCalendar()
day_count = ql.Actual365Fixed()
spot_quote = ql.QuoteHandle(ql.SimpleQuote(spot))

# Set up the flat risk-free curves
riskFreeCurve = ql.FlatForward(today, rate, day_count)
flat_ts = ql.YieldTermStructureHandle(riskFreeCurve)
dividend_ts = ql.YieldTermStructureHandle(riskFreeCurve)

# Create new heston model
v0 = 0.01; kappa = 1.0; theta = 0.04; rho = -0.3; sigma = 0.4

heston_process = ql.HestonProcess(flat_ts, dividend_ts, spot_quote, v0, kappa, theta, sigma, rho)
heston_model = ql.HestonModel(heston_process)

# How does the vol surface look at the moment?
heston_handle = ql.HestonModelHandle(heston_model)
heston_vol_surface = ql.HestonBlackVolSurface(heston_handle)

# Plot the vol surface ...

Correct answer by StackG on August 3, 2020

Add your own answers!

Related Questions

Question about using Ito’s lemma in Gamma PnL

1  Asked on October 27, 2021 by arshdeep


Comparison of Carhart alphas (four-factor model)

2  Asked on October 27, 2021 by gauthier-golin


Historical SPX Intraday data with volume

2  Asked on October 27, 2021 by tim-kim


Value Option with Forward Volatilities

2  Asked on October 27, 2021 by maths-student-g


Lead-lag bivariate VAR model

1  Asked on October 27, 2021


List of ticker-symbols of European countries

3  Asked on October 27, 2021 by syed-riaz-mahmood-ali


Ask a Question

Get help from others!

© 2022 All rights reserved. Sites we Love: PCI Database, MenuIva, UKBizDB, Menu Kuliner, Sharing RPP