TailClark#

class chainladder.TailClark(growth='loglogistic', truncation_age=None, attachment_age=None, projection_period=12)[source]#

Allows for extraploation of LDFs to form a tail factor.

Added in version 0.6.4.

Parameters:
growth: {‘loglogistic’, ‘weibull’}

The growth function to be used in curve fitting development patterns. Options are ‘loglogistic’ and ‘weibull’

truncation_age: int

The age at which you wish to stop extrapolating development

attachment_age: int (default=None)

The age at which to attach the fitted curve. If None, then the latest age is used. Measures of variability from original ldf_ are retained when being used in conjunction with the MackChainladder method.

projection_period: int

The number of months beyond the latest available development age the ldf_ and cdf_ vectors should extend.

Attributes:
ldf_:

ldf with tail applied.

cdf_:

cdf with tail applied.

tail_: DataFrame

Point estimate of tail at latest maturity available in the Triangle.

theta_: DataFrame

Estimates of the theta parameter of the growth curve.

omega_: DataFrame

Estimates of the omega parameter of the growth curve.

elr_: DataFrame

The Expected Loss Ratio parameter. This only exists when a sample_weight is provided to the Estimator.

scale_: DataFrame

The scale parameter of the model.

norm_resid_: Triangle

The “Normalized” Residuals of the model according to Clark.

Examples

Clark’s method fits a parametric growth curve to the percent of ultimate loss reported at each age, so a single fit both smooths the in-triangle development and extrapolates it beyond the edge of the triangle. The choice of growth curve is the key judgment because the two supported families have fundamentally different right tails:

  • loglogistic decays polynomially (a power-law tail). The unreported fraction shrinks slowly with age, so material development persists to very old ages, as is typical of excess casualty and other long-tailed business.

  • weibull decays exponentially. The growth curve flattens quickly, implying development is essentially complete shortly beyond the edge of the triangle.

dev = cl.Development().fit_transform(cl.load_sample("raa"))
log = cl.TailClark(growth="loglogistic").fit(dev)
wei = cl.TailClark(growth="weibull").fit(dev)
print(log.ldf_.values[0, 0, 0, :].round(3))
print(wei.ldf_.values[0, 0, 0, :].round(3))
print(round(float(log.tail_.iloc[0, 0]), 3))
print(round(float(wei.tail_.iloc[0, 0]), 3))
[2.999 1.624 1.271 1.172 1.113 1.042 1.033 1.017 1.029 1.023 1.189]
[2.999 1.624 1.271 1.172 1.113 1.042 1.033 1.017 1.014 1.009 1.014]
1.216
1.022

Inside the triangle, where the observed factors constrain both curves, the two fits barely differ. Beyond age 120 only the assumed shape of the curve matters: the loglogistic projects 21.6% of additional development while the weibull projects 2.2%. The gap is not noise. It is the direct consequence of the loglogistic’s power-law decay continuing to release losses for decades, while the weibull’s exponential decay extinguishes development almost immediately.

Because the loglogistic tail dies out so slowly, Clark recommends establishing a truncation age at which losses can be considered fully developed rather than extrapolating indefinitely. Capping the same loglogistic fit at age 240 gives a more defensible provision:

trunc = cl.TailClark(growth="loglogistic", truncation_age=240).fit(dev)
print(round(float(trunc.tail_.iloc[0, 0]), 3))
1.127

To assess whether the selected growth curve is consistent with the data, review the norm_resid_ attribute: residuals scattered randomly around zero indicate an adequate fit, while systematic patterns by age suggest the other family, a different development estimator, or a truncated projection should be considered.

fit(X, y=None, sample_weight=None)[source]#

Fit the model with X.

Parameters:
X: Triangle-like

Set of LDFs to which the tail will be applied.

y: Ignored
sample_weightTriangle-like

Exposure vector used to invoke the Cape Cod method.

Returns:
self: object

Returns the instance itself.

transform(X)[source]#

Transform X.

Parameters:
X: Triangle

Triangle must contain the ldf_ development attribute.

Returns:
X_new: Triangle

New Triangle with tail factor applied to its development attributes.

Inherited Methods

TailClark.fit_transform

Fit to data, then transform it.

TailClark.get_metadata_routing

Get metadata routing of this object.

TailClark.get_params

Get parameters for this estimator.

TailClark.pipe

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

TailClark.set_backend

Converts triangle array_backend.

TailClark.set_output

Set output container.

TailClark.set_params

Set the parameters of this estimator.

TailClark.to_json

Serializes triangle object to json format

TailClark.to_pickle

Serializes triangle object to pickle.