CaseOutstanding#

class chainladder.CaseOutstanding(paid_to_incurred=None, paid_n_periods=-1, case_n_periods=-1, groupby=None)[source]#

Deterministic development from prior-lag case reserves.

Estimates incremental paid amounts and case-reserve runoff as fractions of the prior lag’s carried case reserve. Like MunichAdjustment and BerquistSherman, this is useful when case reserves should inform paid ultimates. A triangle with both paid and incurred columns is required.

The incremental paid_ldf_ patterns are not multiplicative link ratios; the estimator also builds origin-specific implied multiplicative ldf_ so standard IBNR methods can be applied.

Added in version 0.8.0.

Parameters:
paid_to_incurred: tuple or list of tuples

A tuple representing the paid and incurred columns of the triangles such as ('paid', 'incurred')

paid_n_periods: integer, optional (default=-1)

number of origin periods to be used in the paid pattern averages. For all origin periods, set paid_n_periods=-1

case_n_periods: integer, optional (default=-1)

number of origin periods to be used in the case pattern averages. For all origin periods, set case_n_periods=-1

Attributes:
ldf_: Triangle

Implied multiplicative loss development patterns (by paid/incurred column); each origin period has its own pattern.

cdf_: Triangle

The estimated (multiplicative) cumulative development patterns.

case_to_prior_case_: Triangle

Case-to-prior-case incremental ratios by origin (for review).

case_ldf_: Triangle

Selected case-to-prior-case ratios averaged across origins.

paid_to_prior_case_: Triangle

Paid-to-prior-case incremental ratios by origin (for review).

paid_ldf_: Triangle

Selected paid-to-prior-case ratios averaged across origins.

Examples

On usauto, incremental paid in 12–24 is about 84% of case outstanding at lag 12 (first entry in paid_ldf_ at development 24–36):

import numpy as np

tri = cl.load_sample("usauto")
model = cl.CaseOutstanding(
    paid_to_incurred=("paid", "incurred")
).fit(tri)
print(np.round(model.paid_ldf_.values[0, 0, 0, :4], 4))
[0.8428 0.71   0.7084 0.6968]

Implied multiplicative ldf_ differ by accident year; the 1998 origin paid pattern is shown below (compare to volume-weighted chainladder).

import numpy as np

tri = cl.load_sample("usauto")
model = cl.CaseOutstanding(
    paid_to_incurred=("paid", "incurred")
).fit(tri)
print(np.round(model.ldf_["paid"].values[0, 0, 0, :4], 4))
[1.7925 1.2056 1.0956 1.0457]

Review origin-level paid_to_prior_case_ and case_to_prior_case_ when tuning paid_n_periods and case_n_periods; fitted selections appear in paid_ldf_ and case_ldf_.

import numpy as np

tri = cl.load_sample("usauto")
model = cl.CaseOutstanding(
    paid_to_incurred=("paid", "incurred")
).fit(tri)
print(np.round(model.case_to_prior_case_.values[0, 0, 0, :4], 4))
print(np.round(model.case_ldf_.values[0, 0, 0, :4], 4))
[0.5378 0.5541 0.5253 0.4981]
[0.534  0.5638 0.5296 0.49  ]
fit(X, y=None, sample_weight=None)[source]#

Fit the model with X.

Parameters:
XTriangle

Triangle with paid and incurred columns for paid_to_incurred.

yIgnored
sample_weightIgnored
Returns:
selfobject

Returns the instance itself.

transform(X)[source]#

If X and self are of different shapes, align self to X, else return self.

Parameters:
XTriangle

The triangle to be transformed

Returns:
X_newNew triangle with transformed attributes.

Inherited Methods

CaseOutstanding.fit_transform

Fit to data, then transform it.

CaseOutstanding.get_metadata_routing

Get metadata routing of this object.

CaseOutstanding.get_params

Get parameters for this estimator.

CaseOutstanding.pipe

Apply func(self, *args, **kwargs).

CaseOutstanding.set_backend

Converts triangle array_backend.

CaseOutstanding.set_output

Set output container.

CaseOutstanding.set_params

Set the parameters of this estimator.

CaseOutstanding.to_json

Serializes triangle object to json format

CaseOutstanding.to_pickle

Serializes triangle object to pickle.