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_weightis 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:
loglogisticdecays 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.weibulldecays 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.
Inherited Methods
|
Fit to data, then transform it. |
|
Get metadata routing of this object. |
|
Get parameters for this estimator. |
|
Apply |
|
Converts triangle array_backend. |
|
Set output container. |
|
Set the parameters of this estimator. |
|
Serializes triangle object to json format |
|
Serializes triangle object to pickle. |