Pricing models

Each model is QuantLib’s model with a chain in front of the parameters and a list where a parameter may switch. The third column of the tables says which parameters may switch; the rest are common to all regimes.

Mathematics

Each model has a page with its dynamics, the reduction, the closed form for a two-regime chain and the Python that evaluates it next to the library’s price: Models: mathematics and Python.

Class

Mathematics and Python

SwitchingVasicek

Vasicek

SwitchingVasicekJumps

Vasicek with jumps

SwitchingCoxIngersollRoss

Cox–Ingersoll–Ross

SwitchingHullWhite

Hull–White

SwitchingG2

G2++

SwitchingIntensityBasket

Intensity basket

SwitchingBlackScholesProcess

Black–Scholes

SwitchingMerton76Process

Merton jump diffusion

SwitchingVarianceGammaProcess

Variance gamma

SwitchingHestonModel

Heston

SwitchingBatesModel

Bates

SwitchingEquityRates

Equity with stochastic rates

SwitchingCEVProcess

CEV

SwitchingHestonVolOfVol

Heston with a switching volatility of variance

Short-rate models

rl.SwitchingVasicek(chain, r0, a, b, sigma)

QuantLib Vasicek(r0, a, b, sigma): dr = a (b - r) dt + sigma dW. b and sigma may switch. Bonds, bond options, swaptions, caps and Bermudans; as an intensity, survival probabilities and CDS.

rl.SwitchingVasicek(chain, r0=0.03, a=0.5, b=[0.06, 0.02], sigma=[0.015, 0.008])
rl.SwitchingVasicekJumps(chain, r0, a, b, sigma, jumpIntensity, jumpMean)

Vasicek with compound-Poisson jumps of exponential size (mean jumpMean) at intensity jumpIntensity, which may switch along with b and sigma. The reduction is exact. QuantLib has no jump short-rate model; the frozen limit is checked against the affine closed form.

rl.SwitchingCoxIngersollRoss(chain, r0, theta, k, sigma)

QuantLib CoxIngersollRoss(r0, theta, k, sigma): dr = k (theta - r) dt + sigma sqrt(r) dW. theta may switch. Bonds and Bermudan swaptions on the rate grid; as an intensity, survival probabilities and CDS.

rl.SwitchingHullWhite(chain, termStructure, a, sigma)

QuantLib HullWhite(termStructure, a, sigma) with sigma switching. termStructure is a flat rate, a callable t -> discount factor or a QuantLib YieldTermStructureHandle. The fitted drift uses the stationary-average variance, so the averaged model reproduces the curve exactly and the expansion adds the switching corrections.

ts = ql.YieldTermStructureHandle(ql.FlatForward(today, 0.03, ql.Actual365Fixed()))
hw = rl.SwitchingHullWhite(chain, ts, a=0.5, sigma=[0.02, 0.006])
rl.SwitchingG2(chain, termStructure, a, sigma, b, eta, rho)

QuantLib G2(termStructure, a, sigma, b, eta, rho); sigma, eta and rho may switch. Bonds, bond options and caps by the characteristic-function engines; swaptions and Bermudans on the two-factor grid.

rl.SwitchingIntensityBasket(models)

Several intensities (Vasicek or CIR) driven by one chain, with independent diffusions. ZeroCouponBond is the joint survival probability and CreditDefaultSwap a first-to-default swap; defaultCorrelation(t) measures the dependence the common regime creates. The frozen limit factorises into the marginal survivals.

A Vasicek intensity is Gaussian, so it is negative with positive probability and the survival probability can exceed one when the volatility is large against the level; the engines raise an IntensityWarning when it does. A CIR intensity stays nonnegative.

basket = rl.SwitchingIntensityBasket([rl.SwitchingVasicek(chain, 0.02, 0.5, [0.01, 0.06], 0.003),
                                      rl.SwitchingVasicek(chain, 0.02, 0.5, [0.01, 0.06], 0.003)])
basket.defaultCorrelation(5.0)

Equity models

rl.SwitchingBlackScholesProcess(chain, S0, r, q, sigma)

QuantLib BlackScholesMertonProcess with sigma switching. Vanilla, digital, Asian, barrier and American options; the two-regime characteristic function is available in closed form (Symbolic).

rl.SwitchingHestonModel(chain, S0, r, q, v0, kappa, theta, sigma, rho)

QuantLib HestonModel with the long-run variance theta switching. The reduction is exact; vega is the derivative in v0.

rl.SwitchingHestonVolOfVol(chain, S0, r, q, v0, kappa, theta, xi, rho)

Heston with the volatility of variance xi switching. The switched operators do not reduce exactly, so this model is priced by rl.FirstOrderFDEngine() on a (log S, v) grid, n = (nx, nv).

rl.SwitchingMerton76Process(chain, S0, r, q, sigma, jumpIntensity, logJumpMean, logJumpVol)

QuantLib Merton76Process; sigma and jumpIntensity may switch.

rl.SwitchingBatesModel(chain, S0, r, q, v0, kappa, theta, sigma, rho, jumpIntensity, logJumpMean, logJumpVol)

QuantLib BatesModel; theta and jumpIntensity may switch.

rl.SwitchingVarianceGammaProcess(chain, S0, r, q, sigma, nu, theta)

QuantLib VarianceGammaProcess; all three parameters may switch.

rl.SwitchingCEVProcess(chain, S0, r, q, sigma, beta)

QuantLib CEVProcess with sigma switching, priced in the first-order tier on a grid. Frozen limit: AnalyticCEVEngine. Written on the forward the price is an exact mixture of CEV prices; see CEV.

Hybrid models

rl.SwitchingEquityRates(equity, rates, rho=0.0)

An equity (SwitchingBlackScholesProcess or SwitchingHestonModel) with stochastic rates (SwitchingVasicek or SwitchingHullWhite) on one chain, so that the discount and the return are dependent through the regime path. rho is the equity–rate Brownian correlation, allowed for the Black–Scholes equity. Vanilla options by Lewis’s formula with the discounted characteristic function; American options by rl.SwitchingFDEngine() on a (log S, r) grid, n = (nx, nr), for the Black–Scholes equity with Vasicek rates. Frozen limit: AnalyticBSMHullWhiteEngine, AnalyticHestonHullWhiteEngine.

hybrid = rl.SwitchingEquityRates(rl.SwitchingBlackScholesProcess(chain, 100.0, 0.03, 0.01, [0.35, 0.15]),
                                 rl.SwitchingVasicek(chain, 0.03, 0.4, [0.06, 0.01], [0.02, 0.008]), rho=0.3)
option.setPricingEngine(rl.NumericalSwitchingEngine(hybrid, regime=1))