Project 09Quant

Bass local vol

A tested Python replication of Conze and Henry-Labordère (2021) on the SPX option chain of 15 Aug 2019: fixed-point calibration to three expiries, exact large-step Monte Carlo, Asian pricing and vega hedging.

Status
Public repo · MIT
Role
Solo: MSc summer research project with Prof. Julio Backhoff-Veraguas
Period
Summer 2026
Stack
Python · NumPy and SciPy · Jupyter · pytest
Method
Theorem 2.1 fixed point, exact large-step Monte Carlo, hat-bump vega Greeks checked against bump-and-revalue

The problem

The Bass local-volatility model is a martingale whose law at each listed expiry is a prescribed marginal, here read off the SPX smile. Conze and Henry-Labordère show how to calibrate it by a fixed point and simulate it with one Gaussian draw per expiry, with no time stepping. I implemented their paper, Bass Construction with Multi-Marginals: Lightspeed Computation in a New Local Volatility Model (2021), on real option data as an MSc summer research project at the University of Vienna.

What I built

  • End to end. Put–call-parity forwards, OTM smiles, Breeden–Litzenberger marginals, the Theorem 2.1 fixed point, local volatility, exact large-step Monte Carlo, Asian and forward-start pricing, hat-bump vega Greeks (Eqs. 9–15) with a nine-call vega hedge, and the Bass2 general-kernel operator (Theorem 6.1).
  • A numerical fix. The original notebook used 24-node Gauss–Hermite quadrature for every heat-kernel convolution. On the kinked maps of a real smile this broke the martingale property (conditional drift up to 1.2% of the forward). An exact convolution of the piecewise-linear maps restores it.
  • Checks. Greeks agree with bump-and-revalue within 0.2% (Asian) and 1.3% (calls); the 9×9 vanilla vega matrix has full rank.

Results

evidence
17.8 → 1.8max |z| of the conditional drift, quadrature vs exact convolution
count
10 and 12fixed-point iterations per interval, down from 254 and 499
count
55tests on synthetic inputs, including Black–Scholes recovery, in CI

One historical snapshot: SPX close of 15 Aug 2019 (spot 2847.60), expiries Sep 2019, Dec 2019 and Jun 2020; ± is one standard error.

Results
Check Exact convolution Original quadrature
Fixed-point iterations (two intervals) 10 and 12 254 and 499
60,000-path repricing of 9 calls, max abs error 1.89e-4 2.53e-4
3-fixing ATM Asian call, full smile (index points) 106.02 ± 0.51 105.86 ± 0.51
Martingale check, max abs z 1.8 17.8

With the original numerics the package reproduces the original notebook bit for bit. It is a replication for research, not a production pricer.

Research only; not investment advice.