abdulaziz abdujalilov RUTashkent
Quant model validation · 2026

pricing-crosscheck: validating QuantLib pricing engines

Pricing libraries agree on easy cases. Model risk lives at the edges: one-day maturities, sigma of 1.0, negative rates, spot a hair from the barrier. pricing-crosscheck measures where engines disagree, by how much, and why.

27k+grid points
4instrument types
8documented findings
1issue reported upstream

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

instrumentengines compared
Europeananalytic, CRR, LR, FD, FD damped, Monte Carlo, own CRR / PDE / MC
AmericanBAW approximation, own CRR
Barrieranalytic, CRR, FD, Monte Carlo, own PDE / MC
Digitalanalytic, FD, own PDE / MC

← back to all work