@actuarial-ts/compliance 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/bundle.d.ts +1 -1
- package/dist/bundle.d.ts.map +1 -1
- package/dist/bundle.js +9 -1
- package/dist/bundle.js.map +1 -1
- package/dist/disclosure.d.ts.map +1 -1
- package/dist/disclosure.js +51 -10
- package/dist/disclosure.js.map +1 -1
- package/package.json +5 -3
- package/src/ave.ts +132 -0
- package/src/bundle.ts +341 -0
- package/src/disclosure.ts +423 -0
- package/src/index.ts +6 -0
- package/src/ledger.ts +140 -0
- package/src/metadata.ts +189 -0
- package/src/modelCards.ts +531 -0
|
@@ -0,0 +1,531 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ASOP No. 56 (Modeling) model cards.
|
|
3
|
+
*
|
|
4
|
+
* ASOP 56 asks an actuary who relies on models designed by others to
|
|
5
|
+
* disclose the extent of reliance and to maintain a basic understanding of
|
|
6
|
+
* the model: its basic operations, dependencies, sensitivities, and known
|
|
7
|
+
* weaknesses. These cards ARE that content for every method the SDK ships —
|
|
8
|
+
* ready to drop into workpapers or the generated disclosure.
|
|
9
|
+
*
|
|
10
|
+
* The cards describe the implementations in @actuarial-ts/core as built and
|
|
11
|
+
* tested (each specification matches the code and its published-value test
|
|
12
|
+
* pins), not idealized textbook variants. They are designed to support the
|
|
13
|
+
* actuary's compliance with ASOP No. 56; responsibility for compliance
|
|
14
|
+
* remains with the credentialed actuary.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export type MethodId =
|
|
18
|
+
| "chainLadder"
|
|
19
|
+
| "mack"
|
|
20
|
+
| "bornhuetterFerguson"
|
|
21
|
+
| "benktander"
|
|
22
|
+
| "capeCod"
|
|
23
|
+
| "expectedClaims"
|
|
24
|
+
| "frequencySeverity"
|
|
25
|
+
| "berquistCaseAdequacy"
|
|
26
|
+
| "berquistSettlement"
|
|
27
|
+
| "tailFitting"
|
|
28
|
+
| "cappingIlf"
|
|
29
|
+
| "trend"
|
|
30
|
+
| "onLevel"
|
|
31
|
+
| "munichChainLadder"
|
|
32
|
+
| "odpBootstrap"
|
|
33
|
+
| "merzWuthrich"
|
|
34
|
+
| "clarkLdf"
|
|
35
|
+
| "clarkCapeCod"
|
|
36
|
+
| "ulae"
|
|
37
|
+
| "discountUnpaid"
|
|
38
|
+
| "caseOutstanding"
|
|
39
|
+
| "fisherLange"
|
|
40
|
+
| "salvageSubro"
|
|
41
|
+
| "netOfRecoveries";
|
|
42
|
+
|
|
43
|
+
export interface ModelCard {
|
|
44
|
+
method: MethodId;
|
|
45
|
+
title: string;
|
|
46
|
+
intendedUse: string;
|
|
47
|
+
specification: string;
|
|
48
|
+
keyAssumptions: string[];
|
|
49
|
+
weaknesses: string[];
|
|
50
|
+
sensitivities: string[];
|
|
51
|
+
literature: string[];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export const MODEL_CARDS: Record<MethodId, ModelCard> = {
|
|
55
|
+
chainLadder: {
|
|
56
|
+
method: "chainLadder",
|
|
57
|
+
title: "Chain ladder (loss development method)",
|
|
58
|
+
intendedUse:
|
|
59
|
+
"Deterministic ultimate and unpaid estimates from a cumulative development triangle when historical development patterns are expected to persist. The default anchor method for mature origin periods.",
|
|
60
|
+
specification:
|
|
61
|
+
"CDFs multiply the caller's selected age-to-age factors right to left, tail last: cdf_j = ldf_j x cdf_{j+1}, cdf_last = tail. Ultimate_i = latest diagonal value x CDF at its age; unpaid = ultimate - latest. Missing or non-positive selections are treated as 1.000 with a per-column warning; all-missing selections are rejected. Factor selection is the caller's judgment: the engine supplies an averages menu (all-year/n-year straight and volume-weighted, medial, geometric) where volume-weighted means sum(numerators)/sum(denominators) over rows where both cells exist, never the mean of ratios, and n-year windows cover the latest n origin PERIODS.",
|
|
62
|
+
keyAssumptions: [
|
|
63
|
+
"Development to date is proportional to development to come (each origin period behaves like the others at the same age).",
|
|
64
|
+
"The historical factor experience is relevant to the unpaid tail (no un-adjusted changes in mix, case adequacy, settlement practice, or environment).",
|
|
65
|
+
"Selections and tail describe the SAME data basis being projected.",
|
|
66
|
+
],
|
|
67
|
+
weaknesses: [
|
|
68
|
+
"Immature periods multiply a small diagonal by a large CDF: leveraged and volatile.",
|
|
69
|
+
"Calendar-year effects (inflation shifts, court decisions, process changes) violate the row-independence the method presumes.",
|
|
70
|
+
"A distorted diagonal propagates into every average that includes it.",
|
|
71
|
+
],
|
|
72
|
+
sensitivities: [
|
|
73
|
+
"Selected factors in the earliest development columns (largest CDFs).",
|
|
74
|
+
"The tail factor, especially for long-tailed lines.",
|
|
75
|
+
"Treatment of outlier factors in small columns.",
|
|
76
|
+
],
|
|
77
|
+
literature: [
|
|
78
|
+
"Friedland, Estimating Unpaid Claims Using Basic Techniques, ch. 7",
|
|
79
|
+
"Mack (1993), ASTIN Bulletin 23(2) — the estimator the validation suite pins",
|
|
80
|
+
],
|
|
81
|
+
},
|
|
82
|
+
mack: {
|
|
83
|
+
method: "mack",
|
|
84
|
+
title: "Mack distribution-free standard errors",
|
|
85
|
+
intendedUse:
|
|
86
|
+
"Standard errors (process + estimation) around chain ladder reserves without a distributional assumption; the basis for ranges and RMAD discussions on development-based estimates.",
|
|
87
|
+
specification:
|
|
88
|
+
"Mack (1993) with alpha = 1 (volume-weighted) estimators: f_k = sum(C_{i,k+1})/sum(C_{i,k}); sigma^2_k = (1/(n_k-1)) sum C_{i,k}(F_{ik} - f_k)^2, last column extrapolated by min(s^4_{K-2}/s^2_{K-3}, min(s^2_{K-3}, s^2_{K-2})). Per-origin mse per Mack's recursion; the total adds the cross-origin covariance term. When the caller projects on SELECTED factors, sigma^2 stays estimated around the volume-weighted factors and the pairing is disclosed (Mack 1999); a multiplicative tail extends the sum one column with sigma^2 extrapolated once more and the final column's volume reused — an acknowledged approximation, flagged in warnings.",
|
|
89
|
+
keyAssumptions: [
|
|
90
|
+
"E[C_{i,k+1} | past] = f_k C_{i,k} (the chain ladder mean structure).",
|
|
91
|
+
"Var[C_{i,k+1} | past] = sigma^2_k C_{i,k} (variance proportional to volume).",
|
|
92
|
+
"Accident years are independent (no calendar-year effects).",
|
|
93
|
+
],
|
|
94
|
+
weaknesses: [
|
|
95
|
+
"The three assumptions are testable and often violated; the package ships the calendar-year test, the factor-correlation test, and residuals for exactly that.",
|
|
96
|
+
"Tail-step variance is an approximation (extrapolated sigma^2, reused final volume).",
|
|
97
|
+
"Standard errors understate when sigma^2 columns are inestimable and default to 0 (warned).",
|
|
98
|
+
],
|
|
99
|
+
sensitivities: [
|
|
100
|
+
"sigma^2 in the late columns (few factors, extrapolation rule).",
|
|
101
|
+
"The tail factor and its approximation.",
|
|
102
|
+
"Outlier factors inflating a column's sigma^2.",
|
|
103
|
+
],
|
|
104
|
+
literature: [
|
|
105
|
+
"Mack (1993), ASTIN Bulletin 23(2) — Taylor/Ashe and mortgage tables pinned in tests",
|
|
106
|
+
"Mack (1999), ASTIN Bulletin 29(2) — selected factors and tail",
|
|
107
|
+
"Mack (1994), CAS Forum Spring 1994 — assumption tests",
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
bornhuetterFerguson: {
|
|
111
|
+
method: "bornhuetterFerguson",
|
|
112
|
+
title: "Bornhuetter-Ferguson",
|
|
113
|
+
intendedUse:
|
|
114
|
+
"Ultimates for immature or volatile origin periods where an a-priori expectation is more credible than leveraged development of thin emerged experience.",
|
|
115
|
+
specification:
|
|
116
|
+
"U_BF = actual to date + expected ultimate x (1 - 1/CDF), expected ultimate = a-priori loss ratio x earned premium (or pure premium x exposure units). The a-priori derives by default from the premium-weighted chain ladder loss ratio of mature periods (percent developed >= 0.9, falling back to all periods with a warning), and can be overridden globally or per origin. Origins without usable premium are excluded with a warning.",
|
|
117
|
+
keyAssumptions: [
|
|
118
|
+
"The a-priori expectation is unbiased for the unreported portion.",
|
|
119
|
+
"The development pattern (CDF) correctly measures expected emergence to date.",
|
|
120
|
+
"Actual emergence to date carries no information about the unreported remainder (the defining BF assumption).",
|
|
121
|
+
],
|
|
122
|
+
weaknesses: [
|
|
123
|
+
"Wholly dependent on the a-priori for green years: a biased prior is a biased reserve.",
|
|
124
|
+
"Ignores favorable/adverse emergence signal that credibility methods (Benktander) partially use.",
|
|
125
|
+
"CDFs below 1 (incurred redundancy) turn the provision into an expected take-down; interpretation needs care.",
|
|
126
|
+
],
|
|
127
|
+
sensitivities: [
|
|
128
|
+
"The a-priori loss ratio (one-for-one in the unreported piece).",
|
|
129
|
+
"The development pattern's percent-unreported (1 - 1/CDF).",
|
|
130
|
+
"Premium on-level and trend adjustments feeding a derived a-priori.",
|
|
131
|
+
],
|
|
132
|
+
literature: [
|
|
133
|
+
"Bornhuetter & Ferguson (1972), The Actuary and IBNR, PCAS LIX",
|
|
134
|
+
"Friedland, ch. 9",
|
|
135
|
+
],
|
|
136
|
+
},
|
|
137
|
+
benktander: {
|
|
138
|
+
method: "benktander",
|
|
139
|
+
title: "Benktander-Hovinen (iterated Bornhuetter-Ferguson)",
|
|
140
|
+
intendedUse:
|
|
141
|
+
"The standard credibility compromise between chain ladder and Bornhuetter-Ferguson for middle-maturity periods: more responsive than BF, more stable than CL.",
|
|
142
|
+
specification:
|
|
143
|
+
"U_GB = C + q x U_BF with q = 1 - 1/CDF — Bornhuetter-Ferguson applied once more with the BF ultimate as the a-priori. Equivalently the credibility mixture (1-q) U_CL + q U_BF, or (1-q^2) U_CL + q^2 U_0 against the original prior. Computed from the same run's CL and BF results; origins BF excluded stay excluded. CDFs below 1 make q negative (extrapolation past CL), which is warned.",
|
|
144
|
+
keyAssumptions: [
|
|
145
|
+
"Everything BF assumes, plus: the prior U_0 is independent of emergence to date with E[U_0] = E[U] (the Mack 2000 optimality frame).",
|
|
146
|
+
"The payout/reporting pattern is correctly measured.",
|
|
147
|
+
],
|
|
148
|
+
weaknesses: [
|
|
149
|
+
"Inherits a-priori bias at reduced (q^2) weight.",
|
|
150
|
+
"Loses its MSE advantage in extreme volatility regimes (very stable books: use CL; very volatile: use BF — Mack 2000's t-criterion).",
|
|
151
|
+
],
|
|
152
|
+
sensitivities: [
|
|
153
|
+
"The percent developed (drives the credibility split).",
|
|
154
|
+
"The BF a-priori (at q^2 weight).",
|
|
155
|
+
],
|
|
156
|
+
literature: [
|
|
157
|
+
"Mack (2000), Credible Claims Reserves: The Benktander Method, ASTIN 30(2) — Section 4 example pinned in tests",
|
|
158
|
+
"Benktander (1976); Hovinen (1981)",
|
|
159
|
+
],
|
|
160
|
+
},
|
|
161
|
+
capeCod: {
|
|
162
|
+
method: "capeCod",
|
|
163
|
+
title: "Cape Cod / Stanard-Buhlmann (with Gluck decay generalization)",
|
|
164
|
+
intendedUse:
|
|
165
|
+
"Expected-loss method whose a-priori is derived mechanically from the data: trended, developed experience over used-up premium. The decay generalization balances all-year pooling against per-year responsiveness.",
|
|
166
|
+
specification:
|
|
167
|
+
"Pooled ELR* = sum(reported x lossAdj) / sum(premium x premiumAdj / CDF); ultimate_i = reported_i + ELR-at-origin-level x premium_i x (1 - 1/CDF_i). With decay D in [0,1] (Gluck 1997 eq. 6.1) each origin gets its own target-level ELR as the usedUp x D^|i-j| weighted average: D = 1 is standard Cape Cod (single pooled ELR, byte-identical code path), D = 0 reproduces the pure development ultimate. Adjustment factors restate losses and premium to a common target level and back.",
|
|
168
|
+
keyAssumptions: [
|
|
169
|
+
"After trend/on-level adjustment, expected loss ratios are comparable across the pooled origins (fully comparable at D = 1; comparable within the decay horizon at D < 1).",
|
|
170
|
+
"The development pattern correctly measures used-up exposure (the Cape Cod variance assumption: estimate variance proportional to CDF).",
|
|
171
|
+
"Loss and premium adjustments are on consistent levels.",
|
|
172
|
+
],
|
|
173
|
+
weaknesses: [
|
|
174
|
+
"Incurred CDFs near/below 1 break the used-up variance logic (Gluck's Section 7 variance factors are the remedy; not implemented).",
|
|
175
|
+
"The mechanical ELR inherits every data distortion the diagnostics flag.",
|
|
176
|
+
"Partially circular when its output feeds an ELR selection that feeds it back (the workbench warns).",
|
|
177
|
+
],
|
|
178
|
+
sensitivities: [
|
|
179
|
+
"Trend and on-level adjustment factors (numerator and denominator restatements).",
|
|
180
|
+
"The decay factor: Gluck's practical range 0.50-1.00, customary default 0.75.",
|
|
181
|
+
"Development pattern maturity for the youngest years.",
|
|
182
|
+
],
|
|
183
|
+
literature: [
|
|
184
|
+
"Stanard (1985); Buhlmann; Friedland ch. 10",
|
|
185
|
+
"Gluck (1997), Balancing Development and Trend in Loss Reserve Analysis, PCAS LXXXIV — Tables 1-4 pinned in tests",
|
|
186
|
+
],
|
|
187
|
+
},
|
|
188
|
+
expectedClaims: {
|
|
189
|
+
method: "expectedClaims",
|
|
190
|
+
title: "Expected claims method",
|
|
191
|
+
intendedUse:
|
|
192
|
+
"Pure a-priori ultimates (selected ELR or pure premium x exposure base) independent of emerged losses; the anchor when experience carries no credible signal (new lines, green years, disrupted data).",
|
|
193
|
+
specification:
|
|
194
|
+
"Ultimate_i = selected a-priori (at a target cost level) restated to origin i's own level x exposure base_i. No dependence on emerged losses by construction. The selected a-priori is level-stamped so a run at a different dollar level skips the method rather than misapplying it.",
|
|
195
|
+
keyAssumptions: [
|
|
196
|
+
"The selected a-priori is unbiased at the target level.",
|
|
197
|
+
"The restatement (trend, on-level) between target and origin levels is correct.",
|
|
198
|
+
],
|
|
199
|
+
weaknesses: [
|
|
200
|
+
"Ignores all emergence information, favorable or adverse.",
|
|
201
|
+
"Wrong a-priori = wrong answer with no self-correction.",
|
|
202
|
+
],
|
|
203
|
+
sensitivities: ["The selected ELR/pure premium.", "Trend and rate-level restatements."],
|
|
204
|
+
literature: ["Friedland, ch. 8"],
|
|
205
|
+
},
|
|
206
|
+
frequencySeverity: {
|
|
207
|
+
method: "frequencySeverity",
|
|
208
|
+
title: "Frequency-severity (development technique on counts and average values)",
|
|
209
|
+
intendedUse:
|
|
210
|
+
"An ultimate built from separately developed claim counts and average severities; a cross-check on dollar development that decomposes movement into frequency vs severity.",
|
|
211
|
+
specification:
|
|
212
|
+
"Ultimate_i = ultimate counts_i x ultimate severity_i. Counts: chain ladder on the reported-count triangle with caller selections. Severity: chain ladder on the cell-wise average-severity triangle (losses/counts, null-safe) with caller selections. Unpaid ties to the LOSS triangle's latest diagonal.",
|
|
213
|
+
keyAssumptions: [
|
|
214
|
+
"Count development and severity development are each stable and independent enough to project separately.",
|
|
215
|
+
"The claim-count definition is consistent across the triangle (no reporting-threshold or CWP-mix changes).",
|
|
216
|
+
],
|
|
217
|
+
weaknesses: [
|
|
218
|
+
"Severity per reported claim includes closed-without-payment claims: a drifting CWP share masquerades as severity development.",
|
|
219
|
+
"Average severities on thin counts are volatile.",
|
|
220
|
+
],
|
|
221
|
+
sensitivities: [
|
|
222
|
+
"Count LDF selections (counts usually mature fast; tails matter little).",
|
|
223
|
+
"Severity selections in late columns where open-claim severity drives the average.",
|
|
224
|
+
],
|
|
225
|
+
literature: ["Friedland, ch. 11"],
|
|
226
|
+
},
|
|
227
|
+
berquistCaseAdequacy: {
|
|
228
|
+
method: "berquistCaseAdequacy",
|
|
229
|
+
title: "Berquist-Sherman case-reserve adequacy adjustment",
|
|
230
|
+
intendedUse:
|
|
231
|
+
"Restates the incurred triangle when case-reserve adequacy has shifted, so incurred development reflects a consistent adequacy level.",
|
|
232
|
+
specification:
|
|
233
|
+
"Average case reserves are restated by de-trending the latest diagonal's average open-case severity backward at an annual severity trend (fitted from the data by default, overridable); adjusted incurred = paid + restated average case x open counts. The adjusted triangle is re-developed with fresh volume-weighted factors, since user selections describe the unadjusted data.",
|
|
234
|
+
keyAssumptions: [
|
|
235
|
+
"The latest diagonal's case adequacy is the 'right' level to restate history to.",
|
|
236
|
+
"The severity trend used to de-trend is the true drift in case severity.",
|
|
237
|
+
"Open-count data is reliable.",
|
|
238
|
+
],
|
|
239
|
+
weaknesses: [
|
|
240
|
+
"A genuine severity trend is indistinguishable from an adequacy change in this frame: adjusting for the wrong one over-corrects incurred downward (flagged by the workbench's diagnostics).",
|
|
241
|
+
],
|
|
242
|
+
sensitivities: ["The severity trend (fitted or judgmental).", "Open-count accuracy."],
|
|
243
|
+
literature: ["Berquist & Sherman (1977), PCAS LXIV", "Friedland, ch. 13"],
|
|
244
|
+
},
|
|
245
|
+
berquistSettlement: {
|
|
246
|
+
method: "berquistSettlement",
|
|
247
|
+
title: "Berquist-Sherman settlement-rate adjustment",
|
|
248
|
+
intendedUse:
|
|
249
|
+
"Restates the paid triangle when settlement rates have shifted, so paid development reflects a consistent disposal pattern.",
|
|
250
|
+
specification:
|
|
251
|
+
"Disposal rates are computed against selected ultimate counts (chain ladder on reported counts); historical closed counts are restated to the latest diagonal's disposal pattern; paid is interpolated at the restated counts within each origin row — exponential through the bracketing points per Friedland, linear fallback where a zero paid value makes the exponential undefined, loud warnings when extrapolating beyond the observed range. The adjusted triangle re-develops with fresh volume-weighted factors.",
|
|
252
|
+
keyAssumptions: [
|
|
253
|
+
"The latest diagonal's disposal pattern is the go-forward pattern.",
|
|
254
|
+
"Paid amounts relate to closed counts smoothly enough for interpolation.",
|
|
255
|
+
"Ultimate count estimates are reliable.",
|
|
256
|
+
],
|
|
257
|
+
weaknesses: [
|
|
258
|
+
"Interpolation outside the observed paid/closed range is extrapolation (warned).",
|
|
259
|
+
"A mix change in claim size can mimic a settlement-rate change.",
|
|
260
|
+
],
|
|
261
|
+
sensitivities: ["Ultimate counts.", "The interpolation form in sparse rows."],
|
|
262
|
+
literature: ["Berquist & Sherman (1977), PCAS LXIV", "Friedland, ch. 13"],
|
|
263
|
+
},
|
|
264
|
+
tailFitting: {
|
|
265
|
+
method: "tailFitting",
|
|
266
|
+
title: "Tail factor curve fitting",
|
|
267
|
+
intendedUse:
|
|
268
|
+
"Extends development beyond the observed triangle with a fitted decay curve, replacing an unsupported judgmental tail where the fit is valid.",
|
|
269
|
+
specification:
|
|
270
|
+
"Exponential decay and Sherman inverse-power curves fitted to the selected age-to-age factors (log-linear regression on ldf - 1), each with R-squared, validity gates, and divergence detection; the tail is the fitted product beyond the last observed age, capped, with warnings when the curve diverges or the fit is poor.",
|
|
271
|
+
keyAssumptions: [
|
|
272
|
+
"Development decay follows the fitted family beyond the data.",
|
|
273
|
+
"The factors being fitted are themselves well-selected.",
|
|
274
|
+
],
|
|
275
|
+
weaknesses: [
|
|
276
|
+
"Different valid families can imply materially different tails (inverse power is heavier).",
|
|
277
|
+
"A tail is an extrapolation by definition; no fit statistic proves the unobserved region.",
|
|
278
|
+
],
|
|
279
|
+
sensitivities: ["Curve family choice.", "Which factor columns enter the fit."],
|
|
280
|
+
literature: ["Sherman (1984), PCAS LXXI", "Boor (2006), Estimation of the Tail Factor, CAS Forum"],
|
|
281
|
+
},
|
|
282
|
+
cappingIlf: {
|
|
283
|
+
method: "cappingIlf",
|
|
284
|
+
title: "Large-loss capping and ILF restoration",
|
|
285
|
+
intendedUse:
|
|
286
|
+
"Develops a capped (per-occurrence) layer for stability on volatile books, then restores total limits with an increased-limits factor from fitted severity curves, an imported table, or illustrative curves.",
|
|
287
|
+
specification:
|
|
288
|
+
"Claims are capped at an accident-year-indexed per-occurrence limit; capped triangles rebuild from capped snapshots. Restoration applies ONE expected uncap factor (ILF(target)/ILF(cap)) to every origin: censored-MLE lognormal/Pareto fits to own-book severities (open claims right-censored at reported incurred) with Kaplan-Meier quantile checks, log-log table interpolation with strict no-extrapolation, and refusal gates (censoring-dominated fits, implausible parameters, factors above 10x).",
|
|
289
|
+
keyAssumptions: [
|
|
290
|
+
"Each origin year's excess share equals the book average (the single-factor restoration assumption).",
|
|
291
|
+
"Censoring open claims at reported incurred approximates their severity (a case-adequacy assumption).",
|
|
292
|
+
"The fitted family (or table) describes the unobserved excess layer.",
|
|
293
|
+
],
|
|
294
|
+
weaknesses: [
|
|
295
|
+
"Years with realized excess above the factor show artifact negative IBNR (flagged as restoration shortfall); mature years can be over-restored (flagged).",
|
|
296
|
+
"Lognormal fits can underfit heavy tails (the KM quantile check exposes this).",
|
|
297
|
+
],
|
|
298
|
+
sensitivities: ["Cap level and indexation.", "Severity family choice.", "The restoration target limit."],
|
|
299
|
+
literature: ["Klugman, Panjer & Willmot, Loss Models", "standard ILF practice (ISO-style factor tables)"],
|
|
300
|
+
},
|
|
301
|
+
trend: {
|
|
302
|
+
method: "trend",
|
|
303
|
+
title: "Log-linear trend analysis",
|
|
304
|
+
intendedUse:
|
|
305
|
+
"Frequency, severity, and pure-premium trend selection evidence for restating experience to a common cost level (feeds Cape Cod, Expected Claims, and derived BF a-prioris).",
|
|
306
|
+
specification:
|
|
307
|
+
"Ordinary least squares on log(value) against time over standard windows (all years, last 5, last 3, ex-hi/lo), points at origin-period midpoints, windows sized in points-per-year so quarterly series span true years; annual rate = exp(slope) - 1 with R-squared and volatility warnings. Non-positive values are excluded (a log fit cannot see them) with a warning.",
|
|
308
|
+
keyAssumptions: [
|
|
309
|
+
"Exponential (constant-rate) trend within the fitted window.",
|
|
310
|
+
"The series' dollar level is consistent (severity trend is layer-specific: a capped layer compresses toward the index rate).",
|
|
311
|
+
],
|
|
312
|
+
weaknesses: [
|
|
313
|
+
"Short windows are volatile; regime changes make all windows wrong.",
|
|
314
|
+
"Ultimate-based series inherit the reserving method's errors.",
|
|
315
|
+
],
|
|
316
|
+
sensitivities: ["Window choice.", "Outlier years (the ex-hi/lo window exists for this)."],
|
|
317
|
+
literature: ["Werner & Modlin, Basic Ratemaking, ch. 6", "ASOP No. 13 (Trending Procedures)"],
|
|
318
|
+
},
|
|
319
|
+
onLevel: {
|
|
320
|
+
method: "onLevel",
|
|
321
|
+
title: "Parallelogram premium on-leveling",
|
|
322
|
+
intendedUse:
|
|
323
|
+
"Restates historical earned premium to current rate level so loss ratios are comparable across origin years (feeds Cape Cod and ELR selection).",
|
|
324
|
+
specification:
|
|
325
|
+
"Exact piecewise-linear earning geometry under an annual-policy assumption: each rate change carves the earning parallelogram, with leap-year-aware date fractions and quarterly-origin support. On-level factor_i = current rate level / average rate level earned in period i.",
|
|
326
|
+
keyAssumptions: [
|
|
327
|
+
"Annual policy terms, written evenly (the parallelogram assumption).",
|
|
328
|
+
"The rate-change history is complete and correctly dated.",
|
|
329
|
+
],
|
|
330
|
+
weaknesses: [
|
|
331
|
+
"A missing rate change biases every factor after it.",
|
|
332
|
+
"Non-annual terms or lumpy writings violate the geometry.",
|
|
333
|
+
],
|
|
334
|
+
sensitivities: ["Rate-change dates and magnitudes.", "The premium trend (must be NET of rate action or it double-counts)."],
|
|
335
|
+
literature: ["Werner & Modlin, Basic Ratemaking, ch. 5"],
|
|
336
|
+
},
|
|
337
|
+
munichChainLadder: {
|
|
338
|
+
method: "munichChainLadder",
|
|
339
|
+
title: "Munich chain ladder",
|
|
340
|
+
intendedUse:
|
|
341
|
+
"Joint paid/incurred projection that closes the persistent gap between separate paid and incurred chain ladders by conditioning each side's factors on the current (P/I) position.",
|
|
342
|
+
specification:
|
|
343
|
+
"Quarg-Mack (2004): volume-weighted paid and incurred factors with Mack sigmas; incurred-weighted average (P/I) ratios q_s with Mack-style ratio variances rho; correlation parameters lambda^P and lambda^I estimated as through-origin regression slopes of factor residuals on the preceding (I/P) resp. (P/I) ratio residuals; then a SIMULTANEOUS cell-by-cell recursion where each projected paid factor is adjusted by lambda^P (sigma/rho) times the current I/P deviation from average, and symmetrically for incurred. Implemented in the multiplied-out form so zero-paid rows stay projectable; the last inestimable sigma column follows Mack extrapolation or a caller-supplied value.",
|
|
344
|
+
keyAssumptions: [
|
|
345
|
+
"The Mack assumptions on both triangles, with joint (not per-triangle) independence across accident years.",
|
|
346
|
+
"Factor residuals depend linearly on the preceding ratio residuals with constants lambda^P, lambda^I across all ages and origins.",
|
|
347
|
+
],
|
|
348
|
+
weaknesses: [
|
|
349
|
+
"Small portfolios make the residual regressions noisy; the paper's own example has a year where separate chain ladders were already nearly converged and MCL crosses slightly past parity.",
|
|
350
|
+
"Zero ratio variance collapses the correction to the separate chain ladder (warned).",
|
|
351
|
+
],
|
|
352
|
+
sensitivities: [
|
|
353
|
+
"The estimated lambdas.",
|
|
354
|
+
"The ratio-variance estimates rho in sparse late columns.",
|
|
355
|
+
],
|
|
356
|
+
literature: ["Quarg & Mack (2004), Variance 2:2 — the fire-portfolio example is pinned in tests"],
|
|
357
|
+
},
|
|
358
|
+
odpBootstrap: {
|
|
359
|
+
method: "odpBootstrap",
|
|
360
|
+
title: "ODP bootstrap of the chain ladder",
|
|
361
|
+
intendedUse:
|
|
362
|
+
"A full predictive distribution of unpaid claims (percentiles, ranges, skewness) around the chain ladder central estimate — the standard simulation basis for ranges and risk margins.",
|
|
363
|
+
specification:
|
|
364
|
+
"England-Verrall/Shapland: the cross-classified over-dispersed Poisson GLM whose fitted values reproduce the volume-weighted chain ladder exactly (verified to 1e-6 in the result's fit block); unscaled Pearson residuals on incrementals; phi = sum r^2/(n - p) with p = 2I - 1; residuals inflated by sqrt(n/(n-p)) and resampled with replacement onto the fitted past; each pseudo triangle is refit and projected; process variance added per future cell from a Gamma with mean m and variance phi m. Seeded mulberry32 RNG: identical seed and inputs reproduce the distribution bit for bit.",
|
|
365
|
+
keyAssumptions: [
|
|
366
|
+
"Incremental claims are independent ODP with variance proportional to mean (no negative column sums).",
|
|
367
|
+
"Residuals are exchangeable across the triangle (resampling pools them).",
|
|
368
|
+
],
|
|
369
|
+
weaknesses: [
|
|
370
|
+
"A small upward mean bias is inherent to refitting ratio estimators on resampled data (the result carries the chain ladder reserves alongside for the bias check England-Verrall themselves prescribe).",
|
|
371
|
+
"Non-positive fitted incrementals fall outside the residual definition and are excluded (warned).",
|
|
372
|
+
],
|
|
373
|
+
sensitivities: [
|
|
374
|
+
"The residual pool in small triangles.",
|
|
375
|
+
"The degrees-of-freedom correction convention (p = 2I - 1 documented against Shapland's printed alternative).",
|
|
376
|
+
],
|
|
377
|
+
literature: [
|
|
378
|
+
"England & Verrall (1999, 2002) — England (2002) Tables 1-3 pinned in tests",
|
|
379
|
+
"Shapland, CAS Monograph No. 4 (2016)",
|
|
380
|
+
],
|
|
381
|
+
},
|
|
382
|
+
merzWuthrich: {
|
|
383
|
+
method: "merzWuthrich",
|
|
384
|
+
title: "Merz-Wuthrich one-year claims development result MSEP",
|
|
385
|
+
intendedUse:
|
|
386
|
+
"The one-year (solvency) view of reserve risk: the prediction uncertainty of next year's claims development result, alongside Mack's full-runoff view. Feeds Solvency-style capital and RMAD discussions.",
|
|
387
|
+
specification:
|
|
388
|
+
"Merz-Wuthrich (2008) closed forms: per accident year, msep of the observable CDR around zero per eq. 3.17 (the process term keeps only the next diagonal; later runoff estimation terms scale down by C/S ratios), aggregated with the eq. 3.18 cross terms. Estimators are exactly Mack's (shared code with runMack, including the last-column sigma^2 extrapolation), computed from the current triangle alone. The result reports the one-year and Mack ultimate-view roots side by side with their ratio.",
|
|
389
|
+
keyAssumptions: [
|
|
390
|
+
"Mack's three chain-ladder assumptions.",
|
|
391
|
+
"A regular time-I snapshot (square triangle, full diagonal); irregular inputs are rejected rather than approximated.",
|
|
392
|
+
],
|
|
393
|
+
weaknesses: [
|
|
394
|
+
"Linear-approximation closed forms (the paper's own presentation); no tail beyond the triangle.",
|
|
395
|
+
"One-year risk near the full-runoff figure signals a short-tailed book, not an error — interpret the ratio, not just the level.",
|
|
396
|
+
],
|
|
397
|
+
sensitivities: ["sigma^2 in late columns.", "The current diagonal's leverage on next year's factors."],
|
|
398
|
+
literature: ["Merz & Wuthrich (2008), CAS E-Forum Fall 2008 — Table 4 pinned in tests"],
|
|
399
|
+
},
|
|
400
|
+
clarkLdf: {
|
|
401
|
+
method: "clarkLdf",
|
|
402
|
+
title: "Clark growth-curve LDF method",
|
|
403
|
+
intendedUse:
|
|
404
|
+
"Parametric development: a two-parameter growth curve (loglogistic or Weibull) fitted by maximum likelihood, with per-origin ultimates as free parameters and delta-method process/parameter standard deviations. Useful when factor-by-factor selection over-fits sparse data, and for extrapolation with an explicit truncation age.",
|
|
405
|
+
specification:
|
|
406
|
+
"Clark (2003): expected incremental emergence mu = ULT_i x (G(y) - G(x)) with G the loglogistic x^w/(x^w + theta^w) or Weibull 1 - exp(-(x/theta)^w), ages measured to the origin period's AVERAGE accident date (x = max(t-6, t/2) for annual periods); over-dispersed Poisson quasi-likelihood maximized over (omega, theta) with the per-origin ultimates profiled out in closed form; sigma^2 = (1/(n-p)) sum (c - mu)^2/mu; process variance sigma^2 x reserve, parameter variance via the delta method on the numerically-inverted observed information; optional truncation of the curve at a caller age.",
|
|
407
|
+
keyAssumptions: [
|
|
408
|
+
"Emergence follows the chosen two-parameter family through all ages.",
|
|
409
|
+
"ODP variance structure (variance proportional to mean) on incrementals.",
|
|
410
|
+
],
|
|
411
|
+
weaknesses: [
|
|
412
|
+
"n + 2 parameters over-parameterize small triangles (Clark's own caution; the Cape Cod variant exists for exactly that).",
|
|
413
|
+
"Untruncated loglogistic tails are heavy; Clark recommends truncation, and untruncated runs warn.",
|
|
414
|
+
],
|
|
415
|
+
sensitivities: ["The truncation age.", "Curve family (Weibull tails are materially lighter)."],
|
|
416
|
+
literature: ["Clark (2003), CAS Forum Fall 2003 — the worked example is pinned to ~1e-5 in tests"],
|
|
417
|
+
},
|
|
418
|
+
clarkCapeCod: {
|
|
419
|
+
method: "clarkCapeCod",
|
|
420
|
+
title: "Clark growth-curve Cape Cod method",
|
|
421
|
+
intendedUse:
|
|
422
|
+
"Clark's preferred variant: the growth curve with a SINGLE expected loss ratio against an exposure base instead of per-origin ultimates — three parameters total, materially tighter parameter variance on immature years.",
|
|
423
|
+
specification:
|
|
424
|
+
"As the LDF method, but expected emergence mu = Premium_i x ELR x (G(y) - G(x)) with the ELR profiled out in closed form (the MLE ELR reproduces the Cape Cod ultimate identity). Same sigma^2, truncation, and delta-method variance machinery over the 3x3 information matrix.",
|
|
425
|
+
keyAssumptions: [
|
|
426
|
+
"The LDF-method assumptions, plus: a common expected loss ratio across origins after the exposure base's own adjustments.",
|
|
427
|
+
],
|
|
428
|
+
weaknesses: [
|
|
429
|
+
"A biased exposure base (unadjusted premium through a rate cycle) biases every origin's reserve.",
|
|
430
|
+
],
|
|
431
|
+
sensitivities: ["The exposure base's on-level quality.", "Truncation age and curve family."],
|
|
432
|
+
literature: ["Clark (2003), CAS Forum Fall 2003 — Cape Cod pins including the 59.78% ELR in tests"],
|
|
433
|
+
},
|
|
434
|
+
ulae: {
|
|
435
|
+
method: "ulae",
|
|
436
|
+
title: "ULAE: Conger-Nolibos generalized paid-to-paid",
|
|
437
|
+
intendedUse:
|
|
438
|
+
"Unallocated loss adjustment expense reserves from calendar-period ULAE ratios against a claims-activity basis, with the classical paid-to-paid and Kittel methods as special cases.",
|
|
439
|
+
specification:
|
|
440
|
+
"Conger-Nolibos (2003): W = M / B with basis B = U1 R + U2 P + U3 C (weights on the ultimate cost of claims reported, paid losses, and the ultimate cost of claims closed in the period); reserve forms: expected (W* L - M), the recommended Bornhuetter-Ferguson form W* x [U1(L - R) + U2(L - P) + U3(L - C)], and development (M x (L/B - 1)). Presets: Kittel {0.5, 0, 0.5}; classical paid-to-paid additionally collapses the basis to paid under its steady-state identity.",
|
|
441
|
+
keyAssumptions: [
|
|
442
|
+
"ULAE spend attaches to claim activity in the chosen weights, stable across periods.",
|
|
443
|
+
"The weight triple reflects the claim department's actual effort profile (opening/maintaining/closing).",
|
|
444
|
+
],
|
|
445
|
+
weaknesses: [
|
|
446
|
+
"Classical paid-to-paid misleads on growing or shrinking books (its steady-state assumption fails exactly then).",
|
|
447
|
+
"The development form is over-responsive to random ULAE emergence (paper's own caution).",
|
|
448
|
+
],
|
|
449
|
+
sensitivities: ["The selected W*.", "The weight triple.", "Ultimate-loss inputs L, R, C."],
|
|
450
|
+
literature: ["Conger & Nolibos (2003), CAS Forum — the worked example is pinned in tests", "Kittel (1981)"],
|
|
451
|
+
},
|
|
452
|
+
discountUnpaid: {
|
|
453
|
+
method: "discountUnpaid",
|
|
454
|
+
title: "Discounting of unpaid claim estimates",
|
|
455
|
+
intendedUse:
|
|
456
|
+
"Present-value view of unpaid claims from a payout pattern, built to the June 2026 edition of ASOP No. 20: nominal and discounted side by side, disclosed rate provenance, explicit-only risk margins.",
|
|
457
|
+
specification:
|
|
458
|
+
"Expected payments per development interval derive from chain ladder percent-developed differences (tail cash compressed into one final interval, warned); discount factors (1 + rate)^-t, annual effective, under a flat rate or spot curve with the payment's year selecting the rate; mid-period or end-period timing conventions; rate provenance ({source, asOfDate}) is REQUIRED input; a risk margin passes through as its own field and is never blended into any total. Off-diagonal (stale) origins are detected and warned: their timing assumes their latest cell sits at the valuation date.",
|
|
459
|
+
keyAssumptions: [
|
|
460
|
+
"The payout pattern (development-interval timing) is unbiased for cash flow timing and amount.",
|
|
461
|
+
"All origins sit on one valuation diagonal (warned when not).",
|
|
462
|
+
],
|
|
463
|
+
weaknesses: [
|
|
464
|
+
"Pattern-based timing is coarse next to a genuine cash flow model; long tails compressed into one interval understate duration (warned).",
|
|
465
|
+
],
|
|
466
|
+
sensitivities: ["The discount rates and their as-of date.", "The timing convention.", "Tail treatment."],
|
|
467
|
+
literature: ["ASOP No. 20 (revised edition effective June 1, 2026)"],
|
|
468
|
+
},
|
|
469
|
+
caseOutstanding: {
|
|
470
|
+
method: "caseOutstanding",
|
|
471
|
+
title: "Case-outstanding development technique",
|
|
472
|
+
intendedUse:
|
|
473
|
+
"Ultimates for books where case reserves are the reliable signal (e.g. reinsurance with lagged paid data): future paid emerges from the run-off of carried case.",
|
|
474
|
+
specification:
|
|
475
|
+
"Friedland ch. 12: caller-selected case run-off ratios roll the current case outstanding forward age by age; caller-selected paid-on-prior-case ratios convert each period's opening case into expected paid; terminal case pays out at a tail ratio (default 1, warned when defaulted with material case). Reserve = sum of projected future paid. Negative seeds or projections warn and carry their sign — never silently zeroed.",
|
|
476
|
+
keyAssumptions: [
|
|
477
|
+
"Case adequacy is stable across origins at the same age (the ratios are transferable).",
|
|
478
|
+
"The selected run-off and paid-on-case patterns describe the future.",
|
|
479
|
+
],
|
|
480
|
+
weaknesses: [
|
|
481
|
+
"Wholly dependent on case-reserving practice stability; a strengthening or weakening breaks both ratio families at once.",
|
|
482
|
+
],
|
|
483
|
+
sensitivities: ["The tail paid-on-case ratio.", "Early-age case run-off selections."],
|
|
484
|
+
literature: ["Friedland, ch. 12"],
|
|
485
|
+
},
|
|
486
|
+
fisherLange: {
|
|
487
|
+
method: "fisherLange",
|
|
488
|
+
title: "Fisher-Lange disposal-rate method",
|
|
489
|
+
intendedUse:
|
|
490
|
+
"A claim-count-driven reserve: future closed counts from disposal rates against ultimate counts, priced at trended severities by settlement age. A structural cross-check on dollar development when settlement patterns shift.",
|
|
491
|
+
specification:
|
|
492
|
+
"Disposal rates = incremental closed counts / ultimate counts per age (selected from observed diagonals or averages); future closed counts = ultimate counts x selected rates for future ages; severities per settlement age from incremental paid over incremental closed, trended along calendar distance at the caller's severity trend ((1+t)^(months/12)); reserve = sum over future cells of counts x trended severity. Non-consecutive numeric origin labels are detected and warned (they would silently compress trend distances).",
|
|
493
|
+
keyAssumptions: [
|
|
494
|
+
"Disposal patterns against ultimate counts are stable.",
|
|
495
|
+
"Severity varies by settlement age and calendar trend only (no mix shifts within an age).",
|
|
496
|
+
],
|
|
497
|
+
weaknesses: [
|
|
498
|
+
"Needs credible ultimate count estimates as INPUT; count-development errors propagate.",
|
|
499
|
+
"Sparse closure cells make age severities volatile (warned).",
|
|
500
|
+
],
|
|
501
|
+
sensitivities: ["The severity trend.", "Ultimate counts.", "Disposal-rate selections."],
|
|
502
|
+
literature: ["Fisher & Lange (1973), PCAS LX", "Friedland, ch. 11"],
|
|
503
|
+
},
|
|
504
|
+
salvageSubro: {
|
|
505
|
+
method: "salvageSubro",
|
|
506
|
+
title: "Salvage and subrogation development",
|
|
507
|
+
intendedUse:
|
|
508
|
+
"Recovery ultimates developed on their own triangle, for netting against gross results — recoveries develop on their own (usually slower, lumpier) pattern and deserve their own analysis.",
|
|
509
|
+
specification:
|
|
510
|
+
"Chain ladder on the cumulative recovery triangle with caller selections and tail; every run warns that recovery development is typically slower and less smooth than loss development; negative cumulative recovery cells are warned. Results carry ultimate recoveries and future recoveries per origin.",
|
|
511
|
+
keyAssumptions: ["Recovery development patterns are stable across origins."],
|
|
512
|
+
weaknesses: ["Recovery triangles are thin and lumpy; single large recoveries distort factors."],
|
|
513
|
+
sensitivities: ["Late-age recovery factors and the tail."],
|
|
514
|
+
literature: ["Friedland, ch. 14"],
|
|
515
|
+
},
|
|
516
|
+
netOfRecoveries: {
|
|
517
|
+
method: "netOfRecoveries",
|
|
518
|
+
title: "Net-of-recoveries combination",
|
|
519
|
+
intendedUse:
|
|
520
|
+
"Combines a gross projection and a recovery projection into net ultimates and net unpaid, origin by origin.",
|
|
521
|
+
specification:
|
|
522
|
+
"Net ultimate = gross ultimate - ultimate recoveries; net unpaid = gross unpaid - future recoveries; origins aligned by label, one-sided origins excluded with a warning (never zero-filled), mismatched valuation ages warned, negative nets flagged for review.",
|
|
523
|
+
keyAssumptions: ["The gross and recovery projections describe the same book at the same valuation date."],
|
|
524
|
+
weaknesses: ["A netting is only as good as its two inputs; it adds no information of its own."],
|
|
525
|
+
sensitivities: ["Both input projections."],
|
|
526
|
+
literature: ["Friedland, ch. 14"],
|
|
527
|
+
},
|
|
528
|
+
};
|
|
529
|
+
|
|
530
|
+
/** Every method id the disclosure generator recognizes. */
|
|
531
|
+
export const MODEL_CARD_IDS = Object.keys(MODEL_CARDS) as MethodId[];
|