Protocol first
Instruments, grids, engine settings, references, tolerances, seeds and the rules for classifying disagreements were fixed in a written protocol before any result was generated. Later changes are listed as deviations with reasons.
How it works
- Own references with no QuantLib code: closed forms, a CRR tree, a Crank-Nicolson PDE and a seeded Monte Carlo, each validated against parities, limits and its theoretical convergence order.
- Every QuantLib engine is compared with a reference it shares no code with, on grids that include deep in and out of the money, one-day and ten-year maturities, sigma 0.01 and 1.0, zero and negative rates.
- Each disagreement is re-run at 2x and 4x resolution (4x and 16x samples for Monte Carlo) and classified by fixed rules.
- Identities such as put-call parity and in-out parity are checked per engine.
Example finding
The Leisen-Reimer tree converges at first order with an even number of steps, with errors several orders of magnitude above the neighbouring odd counts (0.2439 at 50 steps vs 0.000214 at 51). This and a related precision issue were reported to QuantLib.
Coverage
| instrument | engines compared |
|---|---|
| European | analytic, CRR, LR, FD, FD damped, Monte Carlo, own CRR / PDE / MC |
| American | BAW approximation, own CRR |
| Barrier | analytic, CRR, FD, Monte Carlo, own PDE / MC |
| Digital | analytic, FD, own PDE / MC |