Cape Cod
cape_cod_fit.RdThe 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
CapeCodFitpointer; 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 originjin origini's apriori, between 0 and 1.- average, sigma_interpolation, tail
The development pattern, as in
chain_ladder().
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