Claims development and stochastic reserve estimation, from the triangle to the predictive distribution.
reservingmodels is the single place to reach for claims-reserving work. The
deterministic engine — chain-ladder development, completion factors, the
Bornhuetter–Ferguson / Benktander / Cape Cod methods, and Mack's analytic
standard errors — is re-exported from actuarialpy, where those triangle
primitives already live because the projection and pricing packages build on
them. On top of them this package adds the stochastic layer: the
over-dispersed-Poisson bootstrap of England & Verrall, which produces the full
predictive distribution of the unpaid claims, plus residual diagnostics for
checking the model before you trust the numbers.
A fitted BootstrapODP exposes .sample(size, rng), so it plugs straight into
risksim as a portfolio component —
reserve risk aggregated with prospective underwriting risk, with no dependency
between the two packages.
pip install reservingmodelsRequires Python 3.10 or newer. Pulls in actuarialpy for the shared triangle
primitives.
import reservingmodels as rv
triangle = rv.datasets.taylor_ashe() # a cumulative K x K triangle
# --- deterministic: the point estimate (re-exported chain ladder) ---------- #
cl = rv.ChainLadder.fit(triangle)
print(cl.project(triangle)) # per-origin ultimate and IBNR
print(cl.mack_standard_errors(triangle)) # Mack (1993) analytic SE
# --- stochastic: the predictive distribution ------------------------------- #
boot = rv.BootstrapODP.fit(triangle)
dist = boot.reserve_distribution(size=100_000, rng=42)
print(f"reserve (point) : {dist.point_reserve:,.0f}")
print(f"prediction error : {dist.prediction_error():,.0f}")
print(f"75th / 99th pct : {dist.quantile(0.75):,.0f} / {dist.quantile(0.99):,.0f}")
print(f"TVaR(99%) : {dist.tvar(0.99):,.0f}")
print(dist.to_frame().round(0)) # per-origin + total exhibit
# --- reserve risk as a capital component ----------------------------------- #
import risksim as rs
port = rs.Portfolio([rs.PortfolioItem("reserve_risk", boot)]) # .sample seam
sim = port.simulate(100_000, rng=7)
print(f"portfolio TVaR : {rs.metrics.tvar(sim.gross_losses, 0.99):,.0f}")- Triangles and deterministic methods — re-exported from
actuarialpy:ChainLadder,completion_factors,apply_completion,develop_ultimate(chain-ladder, Bornhuetter–Ferguson, Benktander, Cape Cod),make_completion_triangle, and Mack'smack_standard_errors. These are aliases, not copies —rv.ChainLadder is actuarialpy.ChainLadder. - Stochastic reserving —
BootstrapODP, the semiparametric ODP bootstrap (estimation error by residual resampling, process error by a gamma draw), andReserveDistributionfor percentiles, VaR, TVaR, and a per-origin exhibit. - Diagnostics —
pearson_residuals,residual_summary, andcalendar_year_effectsfor checking the ODP assumptions. - The
risksimseam —BootstrapODP.sample(size, rng)makes the reserve a portfolio component;risksimaggregates it with other risks. - The Experience seam —
reservingmodels.integrations.actuarialpybuilds a triangle (and a fitted bootstrap) from a claims-listingactuarialpy.Experience.
The full API reference and worked examples live at openactuarial.org/reservingmodels.html.
reservingmodels shares the ecosystem conventions — tidy tables, explicit
parameterizations, reproducible random-number handling — and composes across
package seams:
| Package | Role |
|---|---|
| actuarialpy | Calculation primitives the workflow packages build on (incl. triangle mechanics and Mack) |
| experiencestudies | Experience reporting, actual-vs-expected, claimant and concentration analysis |
| projectionmodels | Claim, premium, and expense projection over a renewal horizon |
| ratingmodels | Manual and experience rating, credibility, indication, GLM relativities |
| reservingmodels | Claims development and stochastic reserving: chain ladder, BF, Mack, ODP bootstrap |
| lossmodels | Severity and frequency fitting, aggregate loss distributions |
| extremeloss | Extreme-value tails: POT/GPD, GEV, return levels, splicing |
| risksim | Portfolio Monte Carlo, dependence, reinsurance contracts, risk measures |
Install everything at once with pip install openactuarial.
git clone https://github.com/OpenActuarial/reservingmodels
cd reservingmodels
python -m pip install -e ".[dev]"
pytest
ruff check src testsCI runs the same gate on Python 3.10–3.14 across Linux and Windows.
All ecosystem packages are pre-1.0: minor releases may change APIs, and every release is documented in CHANGELOG.md. Current per-package API stability is tracked at openactuarial.org/stability.html.
MIT — see LICENSE.