Skip to contents

The Cape Cod (Stanard-Buhlmann) method: Bornhuetter-Ferguson with each origin's apriori estimated from the triangle itself, as chainladder-python's CapeCod (validation/reference/reserving_expected_loss_python.csv).

Usage

cape_cod_fit(ptr)

cape_cod(
  triangle,
  column,
  exposure,
  trend = 0,
  decay = 1,
  average = "volume",
  sigma_interpolation = "log-linear",
  tail = 1
)

Arguments

ptr

A CapeCodFit pointer; used internally.

triangle

A triangle, with any number of segments.

column

Name of the loss column to project.

exposure

Name of the exposure column; each origin's latest observed value is its exposure.

trend

Annual trend rate of the losses, above -1.

decay

Weight decay^|i - j| of origin j in origin i's apriori, between 0 and 1.

average, sigma_interpolation, tail

The development pattern, as in chain_ladder().

Value

A cape_cod_fit object.

Details

Origin j's used-up exposure is exposure[j] / cdf[j]. Its latest value is trended to the triangle's valuation by (1 + trend)^(m[j] / 12), m[j] the months from the end of the origin period to the valuation. Origin i's trended apriori is the sum over j of the trended latest values weighted by decay^|i - j|, over the same weighted sum of used-up exposures; dividing by i's own trend factor gives the apriori its Bornhuetter-Ferguson ultimate uses. With decay = 1 every origin shares one loss ratio; with decay = 0 each origin keeps its own and the method returns the chain ladder. The exposure and development pattern are as for bornhuetter_ferguson(). Every segment of the triangle is fitted on its own, with its own exposure and apriori, trended to the whole triangle's valuation.

The fit has the properties of an expected_loss_fit, with apriori the detrended apriori (chainladder-python's detrended_apriori_), and the Bornhuetter-Ferguson fit itself as expected_loss; plus per origin trended_apriori (chainladder-python's apriori_). as.data.frame() adds a trended_apriori column.

Errors: as bornhuetter_ferguson(), or a trend that is not finite and above -1, or a decay outside 0 to 1.

This is Python's CapeCod, whose fit() returns a CapeCodFit.

See also

segment() for one segment.

Examples

long <- data.frame(year = c(2020, 2020, 2021), age = c(12, 24, 12),
                   paid = c(100, 150, 200), premium = c(250, 250, 400))
tri <- triangle(long, "year", "age", c("paid", "premium"))
# Loss ratio (150 + 200) / (250 + 400 / 1.5) on both origins.
cc <- cape_cod(tri, "paid", "premium")
cc@apriori
#>      2020      2021 
#> 0.6774194 0.6774194 
cc@ultimate
#>     2020     2021 
#> 150.0000 290.3226 
cape_cod(tri, "paid", "premium", trend = 0.05, decay = 0.5)@trended_apriori
#>      2020      2021 
#> 0.6717391 0.7117021