
Find the development period at which the loss ratio estimate stabilises
Source:R/convergence.R
detect_convergence.RdIdentify the first dev \(k^{**}\) from which the projected
portfolio loss ratio is observed to be stable up to the maximum
available development period \(V\). Three complementary stability
criteria are computed on the LR backtest path; the user selects
which one defines \(k^{**}\) via method =.
Notation mapping (code <-> math):
Standard chain-ladder convention: \(i\) indexes cohort (origin period), \(k\) indexes development period. The maturity point \(k^*\) and convergence point \(k^{**}\) live on the \(k\) axis. Earlier paper drafts used \(v\) (valuation) for the same index in Section 11; we unify on \(k\) for consistency.
dev_max | \(K_{\max}\) | Maximum observable dev (a scalar) |
dev_cand | \(k \in [k^*, K_{\max}-2]\) | Integer vector of candidate dev points |
ratio[i] | \(LR_k\) | Portfolio LR projection at dev = dev_cand[i] |
revision[i] | \(R_k = |LR_k - LR_{k-1}|\) | Adjacent-step revision (diagnostic) |
drift_window[i] | \(\max - \min\) of \(LR\) over \([k, k+W-1]\) | Local window range |
drift_tail[i] | \(\max - \min\) of \(LR\) over \([k, K_{\max}]\) | Tail range |
slope[i] | \(\hat\beta_k\), OLS slope of \(LR \sim k\) on \([k, K_{\max}]\) | Trend test |
dispersion[i] | \(\hat{D}_k\) | Robust cross-cohort spread of incremental LR |
Stability methods (which sequence drives pass):
"window"Local stability:
drift_window[i] < max_drift. Fast, but misses a slow monotone drift that fits undermax_driftper step."tail"(default, reserving-safe) Global stability:
drift_tail[i] < max_drift. Catches monotone drift. The first passing dev is later (more conservative) than"window"."slope"Trend test:
|slope[i]| < max_slope. Explicit no-trend check; sensitive to non-linear trajectories."all"Strictest: all three pass simultaneously.
All four pass vectors (pass_window, pass_tail, pass_slope,
pass) and the underlying diagnostic series are returned
regardless of the chosen method, so the analyst can inspect every
criterion and re-decide.
Across all methods, a cross-cohort agreement clause
dispersion[i] < max_dispersion is required in addition.
This replaces an earlier formulation \(R_k < c \cdot \hat{SE}^{param}_k\) (paper Section 11). The paper's SE-normalised form is asymptotically broken on large portfolios: \(\hat{SE}^{param}\) shrinks as \(1/\sqrt{n}\) while \(R_k\) has a structural noise floor, so the ratio diverges and the criterion never fires.
Caveat (reserving): detected conv_k reflects stability up
to dev_max (\(K_{\max}\)) only – it is not an asymptotic
guarantee that the projection will not drift past
\(K_{\max}\). Treat conv_k as a diagnostic for "from here on,
what we observe is stable", not as a guarantee of future
stability. For reserving applications, prefer method = "tail" or
"all" over "window", attach an IBNR margin via
fit_ratio$summary SE/CI columns, and weigh the evidence span
(dev_max - conv_k): a conv_k near dev_max has thin evidence.
Usage
detect_convergence(
triangle,
method = c("tail", "window", "slope", "all"),
max_drift = 0.01,
max_slope = 0.001,
max_dispersion = 0.15,
window = 5L,
mat_k = NULL,
holdout_max = NULL,
min_n_cohorts = 5L,
...
)Arguments
- triangle
A
Triangleobject (typically fromas_triangle()).- method
Which stability criterion defines
conv_k. One of"tail"(default),"window","slope", or"all". See the description for semantics and the reserving caveat.- max_drift
Upper bound on the drift metric (window or tail), in LR units. Default
0.01(1pp). Raise for noisier or longer-tail books.- max_slope
Upper bound on
|slope[i]|, the OLS slope of \(LR \sim k\) on \([k, K_{\max}]\), in LR-per-dev units. Default1e-3(0.1pp per dev). Used bymethod = "slope"/"all".- max_dispersion
Upper bound on the cross-cohort dispersion \(\hat{D}_k\). Default
0.15.- window
Drift window length \(W\) (in dev steps): the number of consecutive valuations used by the
"window"method to computedrift_window. Default5L. Note: other functions in the package also expose awindowargument (e.g.detect_regime()for e-divisive segment width); here it controls only the drift metric, not the e-divisive algorithm.- mat_k
Pre-computed maturity point. When
NULL, computed viadetect_maturity()applied to a ratio-based ATA.- holdout_max
Maximum holdout depth used for the rolling backtest. When
NULL, set tomax(window, floor((dev_max - mat_k) / 2)).- min_n_cohorts
Minimum number of cohorts required to compute \(\hat{D}_v\). Default
5L.- ...
Additional arguments forwarded to
backtest()(and thence tofit_ratio()), e.g.loss_method,recent,loss_regime.
Value
An object of class Convergence (named list). Includes the
slots tabulated in the notation mapping above
(dev_max, dev_cand, ratio, revision, drift_window,
drift_tail, slope, dispersion), per-method pass vectors
(pass_window, pass_tail, pass_slope, pass), the threshold
parameters, and metadata attributes (groups, loss,
dispatcher).