What (One-liner)
A pension/insurance liability book against its assets on a real sovereign spot curve — liability PV and Fisher-Weil duration, the Redington duration gap, the funding ratio with its ±100bp sensitivity, and the hedge ratio of a duration overlay.
How to use
Drag ldi_funding_gap_v1 into Canvas, pick a liability profile (level annuity by default), set the annual payment and horizon, enter the asset value and asset duration, optionally a hedge overlay (notional + duration), choose the discount curve (UK gilts nominal by default), and run — it self-fetches the official curve (BoE GLC, Fed GSW, ECB AAA, or Japan MoF). Wire it upstream of risk_management or an ALM institution_composite to give the LDI/duration seats their quantitative face.
Core formula
PV_L = Σ CF_i · e^{−r(t_i)·t_i} # spot curve, continuous compounding
D_L(FW) = Σ t_i · CF_i · e^{−r(t_i)·t_i} / PV_L # Fisher-Weil duration
gap = D_A − D_L # negative = assets shorter
FR = A / PV_L, FR±100bp: liability full reval, asset A·e^{∓D_A·0.01}
hedge = N_hedge·D_hedge / (PV_L·D_L)Assumptions & applicability
Assumptions: continuous-compounding discounting (annually-compounded sources converted via ln(1+r), declared in curve_meta); parameterised level-payment liability; asset side = value + duration; linear spot interpolation with flat extrapolation.
Applicable: GBP/USD/EUR/JPY liability books on the official curves; funding-ratio and duration-gap posture reading; hedge-ratio bookkeeping.
Not applicable: Solvency II SCR (EIOPA shock schedule ≠ flat ±100bp), key-rate/twist risk, longevity/inflation basis, intraday hedging.
Input / Output contract
Inputs: liability_profile, liability_annual, liability_years, asset_value, asset_duration, curve (boe_nominal / boe_real / gsw_nominal / ecb / jp_mof), hedge_notional, hedge_duration.
Output (v2, time-series native): metrics (the 12 keys above, = the last row) plus series — every metric as a daily series over the curve panel (dates/dates_ord/n_dates), plus curve_meta (source, as-of, staleness, tenor range, compounding normalisation, par-approximation flag). A curve that cannot be fetched returns status: unavailable with the reason — it never fabricates a curve.
Known limitations
- The ±100bp bound is asymmetric by construction: the liability leg is fully revalued while the asset leg uses the duration approximation (asset cashflows are not supplied). 1a. The series revalues TODAY'S static book on each historical date — a liability-revaluation what-if lens (declared
curve_meta.asset_side = static_book), not a portfolio backtest. 1b. Series depth = what the curve source adapter holds (BoE adapter currently carries 2025→present; GSW/MoF carry decades) — declared viacurve_meta.date_min/n_dates, never padded. jp_mofsupplies par yields used as a spot approximation — flagged incurve_meta.par_yield_approx.- Parallel shifts only; key-rate/twist exposures are out of scope.
- Curves are official daily estimates with a publication lag;
curve_meta.age_daysandstalereport it honestly.

