Papers
Topics
Authors
Recent
Search
2000 character limit reached

Jäckel’s LBR Algorithm

Updated 2 May 2026
  • Jäckel’s LBR Algorithm is a high-precision and high-speed method to compute implied volatility using a re-parameterized Black formula.
  • It applies region-dependent rational approximations for efficient initial guesses across four option moneyness regimes.
  • Householder’s cubic refinement yields sub-microsecond timings and full machine precision across various GPU and CPU backends.

Jäckel’s "Let’s Be Rational" (LBR) algorithm is a high-precision, high-speed method for computing implied volatility (IV) in the context of European options pricing under the Black-76 and Black-Scholes(-Merton) models. The approach leverages a re-parameterization of the standard Black formula and applies region-adapted rational approximations as initial guesses, followed by cubic-order Householder refinement. The algorithm’s design targets element-wise, batched, and GPU-accelerated workflows, as implemented in fast-vollib’s open-source Python library, with available backends in NumPy/Numba, PyTorch, JAX, and CUDA-fused kernels (Saqur, 29 Apr 2026).

1. Mathematical Formulation and Re-parameterization

The LBR algorithm operates in the “forward” (Black-76) variable space, before translating results to Black-Scholes coordinates. For given spot price SS, strike KK, risk-free rate rr, dividend yield qq, time to expiry tt, and undiscounted market call price CmktC_{\mathrm{mkt}}, define the forward price F=SeqtF = S\,e^{-qt} and discounted factor D=ertD = e^{-rt}. The Black-76 call price is

CB76(σ)=D[FΦ(d1)KΦ(d2)]C_{\mathrm{B76}}(\sigma) = D\, [\, F\,\Phi(d_1) - K\,\Phi(d_2)\,]

where

d1,2=ln(F/K)±12σ2tσtd_{1,2} = \frac{\ln(F/K) \pm \tfrac{1}{2}\sigma^2 t}{\sigma\sqrt{t}}

The implied volatility KK0 is uniquely determined by KK1. Jäckel’s method re-parameterizes this root-finding problem in terms of normalized variables:

  • KK2,
  • KK3,
  • KK4,

with the transformed function:

KK5

The solution KK6 to KK7 directly gives the implied volatility KK8.

2. Region-dependent Rational Approximations

Jäckel partitions the KK9 plane—encoding moneyness and normalized call price—into four regimes, assigning a specific rational function rr0 to each for an initial guess rr1:

Regime rr2 Definition rr3 Structure
1. Near-the-money (small rr4) rr5 rr6
2. Moderate wings rr7 rr8
3. Deep out-of-the-money rr9 qq0
4. Extreme wings / deep ITM qq1 qq2

All coefficients are verbatim from Jäckel 2015, as implemented in the fast-vollib library (Saqur, 29 Apr 2026). The algorithm determines the regime via a sequence of inexpensive threshold tests in qq3 as a function of qq4.

3. Region Thresholds and Algorithmic Switches

The switch between rational approximation regimes proceeds by comparing qq5 to regime thresholds qq6, qq7, and qq8:

  • If qq9: regime 1,
  • Else if tt0: regime 2,
  • Else if tt1: regime 3,
  • Else: regime 4.

These thresholds are inexpensive functions of tt2, derived as approximate constant-tt3 or constant-tt4 curves and require only a few floating-point operations to evaluate.

4. Householder(3) Refinement

After computing the regime-appropriate tt5, the algorithm applies two iterations of Householder’s third-order method:

  1. At each step, evaluate tt6, its first three derivatives tt7 at the current tt8.
  2. Compute the residual tt9 and update using

CmktC_{\mathrm{mkt}}0

where CmktC_{\mathrm{mkt}}1, CmktC_{\mathrm{mkt}}2, CmktC_{\mathrm{mkt}}3 with respect to CmktC_{\mathrm{mkt}}4. Only two iterations are necessary to reach machine precision due to the accuracy of the initial guess.

5. Implementation Details and Backends

The fast-vollib library provides four source-identical backends for the LBR algorithm:

  • NumPy + Numba: CPU batch processing ({\tt jackel_iv_black}).
  • PyTorch (torch.compile): Tensors on CPU/GPU ({\tt jackel_iv_black_torch}).
  • JAX (jax.jit): DeviceArray-accelerated routines ({\tt jackel_iv_black_jax}).
  • Triton single-pass GPU kernel: All steps fused into a single kernel, keeping all intermediates in registers and eliminating Python-level loops or branching ({\tt jackel_iv_triton}).

Each backend implements all logic “element-wise,” enabling compiler-level vectorization or fusion, and a dispatch layer ({\tt fast_implied_volatility_black(backend=...)}) selects the variant dynamically (Saqur, 29 Apr 2026).

6. Performance and Accuracy

The LBR algorithm delivers sub-microsecond per-option timings and achieves double-precision (approximately CmktC_{\mathrm{mkt}}5) accuracy uniformly across strikes and maturities. The regime-specific rational starting guess CmktC_{\mathrm{mkt}}6 lands within a few units in the fourth decimal of the true solution across all regions. As a result, only two Householder(3) steps—each conferring local error CmktC_{\mathrm{mkt}}7—are required. This achieves both ultrafast execution and full machine precision. In contrast, Newton or Halley solvers with less accurate initializations may drift in deep wings, requiring additional iterations or sacrificing digits of accuracy (Saqur, 29 Apr 2026).

7. Context and Applications

Jäckel’s LBR algorithm, as realized in fast-vollib’s jackel module, is intended as a drop-in, high-performance alternative to existing py_vollib and py_vollib_vectorized packages. The implementation is compatible with European option pricing under Black-76, Black-Scholes, and Black-Scholes-Merton models, with full batched and GPU-accelerated support. This positions the LBR method as an optimal choice for research and production settings demanding both speed and accuracy in large-scale IV computations for option chains (Saqur, 29 Apr 2026).

Definition Search Book Streamline Icon: https://streamlinehq.com
References (1)

Topic to Video (Beta)

No one has generated a video about this topic yet.

Whiteboard

No one has generated a whiteboard explanation for this topic yet.

Follow Topic

Get notified by email when new papers are published related to Jäckel’s LBR Algorithm.