kernels.one_year_cdr()
Merz-Wuthrich (2008) closed-form msep of the one-year CDR.
Usage
kernels.one_year_cdr(fit)Write ratio_j = sigma_j^2 / f_j^2, S_j for the volume behind f_j today and S_j^{I+1} = S_j + C[i_j][j] for the same volume once the new diagonal has arrived, where i_j is the single accident year joining dev step j next year. The leverage of that one new observation on the re-estimated factor is
a_j = C[i_j][j] / S_j^{I+1}
and it is the whole story of the one-year view: within twelve months an accident year learns (i) its own next cell in full, and (ii) about every later factor ONLY through that single new observation. So for accident year i with its diagonal at dev k = latest_dev[i],
Phi_i = ratio_k / C[i][k]
+ sum_{j>k} ratio_j * C[i_j][j] / (S_j^{I+1})^2 (process)
Delta_i = ratio_k / S_k
+ sum_{j>k} a_j^2 * ratio_j / S_j (estimation)
msep_i = Chat[i][J]^2 * (Phi_i + Delta_i)
Compare Mack’s run-off msep, Chat^2 * sum_{j>=k} ratio_j (1/Chat[i][j] + 1/S_j): the one-year formula keeps the j = k terms in full and damps every later one by the leverage a_j (squared, for the estimation part). An accident year one step from ultimate therefore has one-year msep exactly equal to its run-off msep, which is the sharpest test of the formula and is asserted in tests/test_cdr.py.
Aggregation carries a cross term, because accident years share the factors they still have to run through. With V_i = ratio_k/S_k + sum_{j>k} a_j * ratio_j / S_j,
msep_total = sum_i Chat_i^2 ratio_{k_i} / C[i][k_i]
+ sum_i sum_{i'} V_{min(i,i')} * Chat_i * Chat_{i'}
- the min picks the OLDER year of each pair, whose (shorter) list of remaining steps is the set the two share. This is the grouping of Wuthrich’s own reference implementation (R ChainLadder,
CL_MSEPs); it is algebraically the same total as the Phi/Delta split above, whichtests/test_cdr.pypins. Note only the TOTAL is convention-free: R calls justratio_k/C[i][k]process variance and lumps the rest into parameter uncertainty, where the split here follows the paper -Phiis the part a re-reserving simulation withparameter_risk=Falsereproduces.
Valid only for the volume-weighted (alpha = 1) chain ladder, without a tail factor, and on an annual development grain. The first two are the same restrictions R’s CDR.MackChainLadder enforces, and both are structural here: fit_mack estimates nothing else. The third is what makes the single development step above a year, and a fit on any other grain is refused by name.
MACK-SPECIFIC BY CONSTRUCTION, and deliberately not offered as a generator= option on simulate_one_year_cdr(). Every term above is sigma_j^2 / f_j^2: the formula is a linearization of the chain-ladder factor update around Mack’s conditional moments, so there is no ODP bootstrap version of it and no version for any other model. The routes that do generalize are the simulated ones - cdr_methods() lists them.