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.
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.
| 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.
Links
- RepositoryOpen: Repository
Research only; not investment advice.