eSSVI (Extended SSVI)

Overview

Extends SSVI with maturity-dependent skew via a \(\rho(\theta)\) term structure. Adds 4 parameters globally and enables realistic calendar skew evolution across maturities.

Model

The total variance formula is the same as SSVI but with \(\rho \to \rho(\theta)\):

\[w(k;\theta) = \frac{\theta}{2}\left[1 + \rho(\theta)\,\varphi(\theta)\,k + \sqrt{\left(\varphi(\theta)\,k + \rho(\theta)\right)^2 + 1 - \rho(\theta)^2}\right]\]

with the skew term structure

\[\rho(\theta) = \mathrm{clip}\left(\rho_0 + \rho_1 \left(\frac{\theta}{\theta_{\mathrm{ref}}}\right)^\alpha,\; -1,\; 1\right)\]

and curvature \(\varphi(\theta) = \eta / \sqrt{\theta}\). Here \(\theta_{\mathrm{ref}}\) is a reference ATM total variance (typically the median across slices) that normalises the power law.

Parameters

Parameter

Meaning

Constraint

\(\rho_0\)

base skew level

\(|\rho_0| < 1\)

\(\rho_1\)

skew term-structure slope

bounded

\(\alpha\)

power-law exponent

bounded

\(\eta\)

curvature scale

\(\eta > 0\)

\(\theta\)

slice ATM total variance (fixed input)

\(\theta > 0\)

\(\theta_{\mathrm{ref}}\)

reference ATM total variance (fixed input)

\(\theta_{\mathrm{ref}} > 0\)

Usage

import numpy as np
from pysvi import get_model, calibrate_slice

model = get_model("essvi")
theta = float(np.nanmin(df_slice["iv"] ** 2 * df_slice["maturity"]))
params = calibrate_slice(df_slice, model, theta=theta, theta_ref=theta)
# params: {'rho0', 'rho1', 'alpha', 'eta', 'theta', 'theta_ref', 'rho_theta', 'forward'}

Arbitrage behaviour

Inherits SSVI’s per-slice butterfly guarantee for each fixed \(\theta\); NO_BUTTERFLY / NO_CALENDAR numerical checks available — see Arbitrage freeness.

References

  • Hendriks, S., Martini, C. (2019). “The extended SSVI volatility surface.” Journal of Computational Finance.