reserving.MackBootstrap
Mack’s bootstrap for the lifetime and one-year views (England, Verrall
Usage
reserving.MackBootstrap()and Wüthrich 2019, Appendix 1): the scaled bias-adjusted residuals of the link ratios are resampled into pseudo factors, and each future cumulative value, to the last age (fit) or over the coming year (one_year), is drawn from the one before C (the observed latest value for the first) with mean f* C and Mack’s variance sigma**2 * abs(C)**(2 - alpha). The lifetime view’s standard deviation approximates Mack’s analytic standard error. Beside OdpBootstrap (variance scale times the mean increment), it gives the one-year view under Mack’s process: with the volume-weighted chain ladder and no tail, its standard deviation is MackFit.claims_development_result()’s (Merz and Wüthrich) within Monte Carlo error. The residuals are centred by default (centre_residuals), so the mean CDR is Merz and Wüthrich’s zero and the lifetime mean reserve the chain ladder’s, and EVW’s Table 4 expected reserves agree. Uncentred, as EVW’s Appendix 1 is written, the pool’s non-zero mean biases the pseudo factors: the mean CDR is about -0.2 (RAA), -0.04 (GenIns) and +0.18 (ABC) times its standard deviation, the lifetime mean reserve about +17%, +0.7% and -0.8% off the chain ladder’s, and the one-year standard deviation up to 1.3% wide on RAA. Simulation i uses random stream i of seed for every segment in turn.
Parameters
n_sims: int = 10000-
Number of simulations; positive.
seed: int = 0-
Seed of the simulation streams, from 0 to
2**64 - 1. process: (gamma, lognormal, residuals, normal, none) = "gamma"-
Process error on each next cumulative value: Gamma or lognormal (negated for a negative mean) or normal, with Mack’s mean and variance; the mean plus a resampled residual times the standard deviation, which carries the residuals’ mean and variance; or none for parameter error only.
average: (volume, simple, regression) = "volume"-
How Mack’s model averages the link ratios (its alpha).
sigma_interpolation: (log - linear, mack) = "log-linear"-
How a sigma behind a single link ratio is filled in.
centre_residuals: bool = True-
Subtract the residuals’ mean before resampling them, so that the pseudo factors are unbiased, the mean CDR is about zero and the lifetime mean reserve is the chain ladder’s.
Falseresamples them uncentred, as EVW’s Appendix 1 is written.
Raises
Examples
>>> from prospicio.reserving import ChainLadder, Mack, MackBootstrap, Triangle
>>> tri = Triangle.from_long(
... [2020] * 4 + [2021] * 3 + [2022] * 2 + [2023],
... [12, 24, 36, 48, 12, 24, 36, 12, 24, 12],
... [100.0, 150.0, 165.0, 170.0, 110.0, 170.0, 180.0, 120.0, 175.0, 130.0],
... )
>>> fit = MackBootstrap(n_sims=2000, seed=42).one_year(tri, "values", ChainLadder())
>>> fit.model‘mack’
>>> fit.cdr.variance() ** 0.5 < Mack().fit(tri, "values").total_standard_errorTrue
Attributes
| Name | Description |
|---|---|
| average | How Mack’s model averages the link ratios. |
| centre_residuals | Whether the residuals are centred before they are resampled. |
| n_sims | Number of simulations. |
| process |
Process error: "gamma", "lognormal", "residuals",
|
| seed | Seed of the simulation streams. |
| sigma_interpolation | How a sigma behind a single link ratio is filled in. |
average
How Mack’s model averages the link ratios.
average: str
centre_residuals
Whether the residuals are centred before they are resampled.
centre_residuals: bool
n_sims
Number of simulations.
n_sims: int
process
Process error: "gamma", "lognormal", "residuals",
process: str
"normal" or "none".
seed
Seed of the simulation streams.
seed: int
sigma_interpolation
How a sigma behind a single link ratio is filled in.
sigma_interpolation: str
Methods
| Name | Description |
|---|---|
| fit() | The lifetime view: bootstraps one measure column in every segment of |
| one_year() | The one-year view of any reserving method under Mack’s process, as |
fit()
The lifetime view: bootstraps one measure column in every segment of
Usage
fit(triangle, column)a cumulative triangle, each with its own Mack model and residuals, into one joint distribution of the reserves (EVW’s Appendix 1). Each simulation resamples the residuals into pseudo factors and draws every cumulative value from the latest observed one to the last age, each from the one before, with Mack’s mean and variance; an origin’s reserve is its last drawn value less its latest. Mack’s model has no tail here, so development past the oldest age is not simulated. The standard deviation approximates Mack’s analytic standard error (Mack.fit); the mean is the chain ladder’s reserve with centre_residuals (the default), about 17% above it on RAA without.
Parameters
triangle: Triangle-
Cumulative, with any number of segments and any development grain, every origin observed from the first age to its latest with no negative value.
column: str
Returns
MackBootstrapFit
Raises
ValueError- As Mack.fit, if an origin has a gap before its latest age, or if a cumulative value is negative.
Examples
>>> from prospicio.reserving import MackBootstrap, Triangle
>>> tri = Triangle.from_long(
... [2020] * 4 + [2021] * 3 + [2022] * 2 + [2023],
... [12, 24, 36, 48, 12, 24, 36, 12, 24, 12],
... [100.0, 150.0, 165.0, 170.0, 110.0, 170.0, 180.0, 120.0, 175.0, 130.0],
... )
>>> fit = MackBootstrap(n_sims=2000, seed=42).fit(tri, "values")
>>> fit.reserves.components()[(‘2020’,), (‘2021’,), (‘2022’,), (‘2023’,)]
>>> abs(fit.reserves.mean() / fit.chain_ladder.total_reserve - 1) < 0.05True
one_year()
The one-year view of any reserving method under Mack’s process, as
Usage
one_year(triangle, column, method, exposure=None)OdpBootstrap.one_year: each simulation draws the cells of the coming twelve months from Mack’s bootstrap, each from the one before with the same pseudo factors, appends them to the triangle, refits method and records CDR = opening ultimate - closing ultimate. Mack’s model has no tail here: development past the oldest age moves only through method’s refitted tail.
Parameters
triangle: Triangle-
Cumulative, with any number of segments and any development grain, every origin observed from the first age to its latest with no negative value.
column: strmethod: (ChainLadder, ExpectedLoss, BornhuetterFerguson, Benktander or CapeCod)-
The method refitted at the start and at the end of the year.
exposure: str = None- The exposure column; required by the expected-loss methods, not taken by ChainLadder.
Returns
OneYearFit-
With
model == "mack".
Raises
TypeError-
If method is not one of the classes above.
ValueError- As OdpBootstrap.one_year and Mack.fit, and if a cumulative value is negative.