# Implied Volatility from Heston Model

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?

Quantitative Finance Asked on August 3, 2020

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).

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

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 ...
plot_vol_surface(heston_vol_surface)


Correct answer by StackG on August 3, 2020

## Related Questions

### simulate volatility surface

1  Asked on November 27, 2020 by therealcode

### Creating daily rebalancing stock portfolios based on analyst recommendations

0  Asked on November 26, 2020 by mr-sandwich

### How can the increments of a CIR process be derived?

1  Asked on November 19, 2020 by john-smith

1  Asked on November 12, 2020 by mbz0

### Where can I get some Inflation Option example quotes (year-on-year and zero-coupon)

1  Asked on October 21, 2020 by kiann

### Is there a good backtesting package in R?

3  Asked on October 17, 2020 by alonch7

### How to deal with missing stock returns?

1  Asked on October 14, 2020 by johncena12345678

### On Girsanov Theorem to switch from Risk-Neutral to Stock Numeraire

1  Asked on September 27, 2020 by jan-stuller

### Market Maker option’s pricing with reference spot

1  Asked on September 18, 2020 by dum03

### FX Carry Trade and how to calculate it

0  Asked on September 12, 2020 by zgz

### Difference between Order Expire and Order Done for Day (DFD)

1  Asked on August 21, 2020 by abnv

### How to download full daily historical data of MSCI AC Asia Index

1  Asked on August 13, 2020 by monicam

### Implied Volatility from Heston Model

1  Asked on August 3, 2020