Roll-forward attendu en multi-décréments — le pont quand les sorties paient¶
🎯 À retenir
Étend le roll-forward attendu (volet compte de résultat) au régime où des têtes sortent en touchant une prestation. La note ajoute la ligne « prestations versées » et prouve que le pont continue de boucler exactement (réévaluations attendues nulles). La subtilité clé : la prestation versée au sortant est le droit entier dû à la date de sortie, sans facteur d'attribution. Vérifié au franc sur l'oracle K-MULTI roulé d'un an.
Rôle. Étend le waterfall flavor A (roll-forward attendu, volet compte de résultat) de
d-attrib_exercice-annuel.md(§5–8) au régime multi-décréments à prestation par cause demultidecrements_v1.md(éq. (10)–(13)). La note d-attrib a formalisé le pont sur un salarié resté en service (prestations versées = 0) ; ici, des têtes sortent en touchant une prestation (décès, départ indemnisés) — le pont doit porter le terme « prestations versées » et continuer à boucler (réévaluations attendues ≡ 0). Les numéros d'équations prolongent la v2 : ici (14)–(16). Oracle = K-MULTI roulé d'un an (x = 55 → 56), reproduit au FCFA (réév = 0 exact).
1. Le problème — ce que flavor A laissait de côté¶
Le pont mono (d-attrib §8) relie deux photos d'une tête en service :
Sur un jeu multi (drapeau multi = true, D-CAUSES-2), ce pont est faussement complet :
la DBO d'ouverture n'est plus l'éq. (6) mais l'éq. (13) — DBO_sorties + retraite — et,
sur l'exercice, une fraction q^(j)_x des têtes sort et encaisse une prestation. Le
pont doit donc gagner une ligne − Prestations versées, et l'on doit prouver que la
clôture reste l'attendu (réév ≡ 0) malgré cette sortie de trésorerie.
2. Les trois termes — équations (14)–(16)¶
Notations des v2 et de multidecrements_v1. La tête est à \((x, k, S_0)\) à \(t_0\) ; à \(t_1\) elle est, si elle reste en service (probabilité \({}_1p^{(\tau)}_x = 1 - q^{(\tau)}_x\)), à \((x{+}1,\, k{+}1,\, S_0(1{+}g))\).
(14) DBO d'ouverture = éq. (13) à \(t_0\) (sorties + retraite, inchangée).
(15) CSR multi-décréments — la VA à \(t_0\) de la maturation du droit \(k \to k{+}1\), sur tous les chemins (chaque année de sortie et la retraite), les autres facteurs (probabilités, prestation, actualisation) figés à leur valeur \(t_0\) :
(16) Prestations versées attendues sur l'exercice — toutes les sorties payées à \(t_1\), à la prestation PLEINE (montant nominal, sans attribution) : les sorties décès / départ de l'année \(s=0\), et la retraite à échéance des têtes \(x = r-1\) (\(n=1\), pondérée par la survie en activité) :
Le terme retraite vaut aussi en mode mono : sans lui, le pont sur-estimerait la clôture des quasi-retraités (chacun garderait sa provision pleine alors qu'il a quitté le périmètre).
Puis, convention d'intérêt IC′ du finding D-IC (service réputé acquis en début de période) :
3. La subtilité — prestation PLEINE, pas attribuée¶
Le piège, et le cœur de cette note. Dans la DBO (éq. 12), chaque chemin de sortie ne porte que la fraction attribuée \(A(k, k_t)\cdot B_j\) : l'attribution répartit le coût de la carrière entre exercices. Mais ce qui est réellement versé au sortant est le droit entier dû à la date de sortie, \(B_j(k_t) = G(k_t)\,\bar S(t)\,(1+\tau_{cs})\) — sans facteur d'attribution (un droit réalisé ne s'« attribue » pas). Mettre \(A\cdot B\) dans la ligne « prestations versées » casse le bouclage (réév ≈ −0,21 % de DBO sur K-MULTI).
La réconciliation est exacte et élégante : pour le chemin \(s=0\), l'attribution maturée de l'éq. (15) vaut
car \(k_1 = k+1\) : à l'instant de la sortie, l'ancienneté projetée est l'ancienneté courante. La maturation amène donc le droit du sortant exactement à 100 %, et c'est cette montée à \(A=1\) qui, capitalisée par IC′, finance la prestation pleine. Le terme de retraite imminente (\(x = r-1\), \(n=1\)) obéit à la même mécanique (\(A(k{+}1, k_r) = 1\) car \(k_r = k+1\)) : le futur retraité de l'exercice touche PP pleine.
4. Le bouclage, terme à terme¶
Réévaluation ≡ 0 se démontre chemin par chemin par l'identité de chaînage des survies. Pour une sortie d'année \(s \ge 1\) à \(t_0\) (la même devient l'année \(s-1\) vue de \(t_1\)) :
parce que \({}_s p^{(\tau)}_x = {}_1p^{(\tau)}_x \cdot {}_{s-1}p^{(\tau)}_{x+1}\) (survie chaînée), l'âge de sortie \(x+s\), l'ancienneté \(k_{s+1}\), la base salariale et \(A(k{+}1, \cdot)\) coïncident entre la version maturée à \(t_0\) et la version recalculée à \(t_1\). Le chemin retraite obéit à la même identité (c'est le cas mono de d-attrib §8). Seul le chemin \(s=0\) n'a pas de continuation à \(t_1\) (le sortant est payé, hors périmètre) : sa contribution maturée-capitalisée est la prestation pleine de l'éq. (16). En sommant :
soit exactement le pont encadré du §2, avec \(\text{DBO}_{t_1}^{\text{attendue}} = {}_1p^{(\tau)}_x\cdot\text{DBO}_{t_1}\) (la clôture attendue est la DBO du survivant pondérée par la survie en activité — pendant multi de la note mono \(\text{DBO}_{t_1}\cdot p_x\)).
5. Oracle K-MULTI roulé (figé, réév = 0 exact)¶
Hypothèses K-MULTI (= K1-bis + décès & départ payants : x=55, k=25, r=60, S₀=100 000, g=2 %, i=4 %, grille back-loaded 0|1|2, CIMA H, \(q^{(w)}=3\,\%\)), roulées d'un an.
| Grandeur | Valeur (FCFA) | Origine |
|---|---|---|
| \(\text{DBO}_{t_0}\) (= K-MULTI) | 2 912 725,419210 | éq. (14) = éq. (13) à \(t_0\) |
| CSR multi | 145 636,270961 | éq. (15), maturation tous chemins |
| IC′ \(=(\text{DBO}+\text{CSR})\cdot i\) | 122 334,467607 | finding D-IC |
| Prestations versées (pleines) | 128 520,296386 | éq. (16), \(\sum_j q^{(j)}_{55} B_j(26)\) |
| Clôture attendue | 3 052 175,861392 | pont §2 |
| contrôle \({}_1p^{(\tau)}_{55}\cdot\text{DBO}_{t_1}\) | 3 052 175,861392 | \(\text{DBO}_{t_1}=3\,177\,281{,}613432\) |
| Réévaluation | 0,000000 | bouclage exact (§4) |
Kill-criterion : \(|\text{Réév}| \le 1\) FCFA et dégénérescence — si aucune cause ne paie, \(\text{CSR}\)/Prestations retombent sur le flavor A mono (d-attrib), K-WATERFALL intact.
6. Ce que ça change dans actuariat_lib¶
- Extension de
engagements.dbo.roll_forward_attendu(ou varianteroll_forward_attendu_multi) : DBO d'ouverture viadbo_population_puc_multidecrements(éq. 13) ; CSR agrégeant la maturation des termes de sortie (boucle sur \(s\)) et du terme retraite ; Prestations = somme des prestations pleines de l'année (éq. 16). IC′ et le bouclage K2 inchangés. - Rien ne change pour un jeu mono (
causes.aucune) : même code, même oracle K-WATERFALL. Le drapeaumultidu pont Studio cesse d'être un avertissement et devient un 5ᵉ terme renseigné (Prestations ≠ 0). - Backend
calculer_waterfall_jeu: lit les drapeaux de causes du jeu (D-CAUSES-2, réservés staff) et route vers la variante multi quand une cause paie.
7. Bornes restantes (non levées ici)¶
- Fractionnement \(m=1\) : sortie ramenée en fin d'année (D-CAUSES-3) — biais de demi-année assumé, raffinement \(m>1\) sans changement de structure.
- flavor B (rapprochement réel à deux photos, OCI) reste le palier suivant : il exige une 2ᵉ année de données et la re-détermination du taux — orthogonal à ce pont attendu.
Annexe — script de vérification (roll-forward K-MULTI, indépendant)¶
#!/usr/bin/env python3
"""Roll-forward attendu MULTI — K-MULTI roulé d'un an. Decimal, sans actuariat_lib.
Lancer depuis docs/formalisation/. S'auto-vérifie (réév = 0)."""
from decimal import Decimal as D, getcontext
getcontext().prec = 40
r, S0, g, i = 60, D(100_000), D("0.02"), D("0.04")
tau_cs, s_star, qw, VESTING = D(0), 5, D("0.03"), 2
v = 1 / (1 + i)
LX = {55: D(860_365), 56: D(852_299), 57: D(843_874),
58: D(834_933), 59: D(825_402), 60: D(815_120)}
qd = lambda a: (LX[a] - LX[a + 1]) / LX[a]
G = lambda kp: max(min(D(kp), D(15)) - D(5), D(0)) + max(D(kp) - D(15), D(0)) * 2
A2p = lambda kn, kt: D(kn - s_star) / D(kt - s_star)
def dbo_multi(x, k, Sb, k_attr=None): # éq. (13), k_attr mature l'attribution
k_attr = k if k_attr is None else k_attr
n, sp, tot = r - x, D(1), D(0)
for s in range(n):
age, k_t = x + s, k + s + 1
S_t, v_t = Sb * (1 + g) ** (s + 1), v ** (s + 1)
B = G(k_t) * S_t * (1 + tau_cs)
for cause, q in (("d", qd(age)), ("w", qw)):
if cause == "w" and k_t < VESTING: continue
tot += sp * q * A2p(k_attr, k_t) * B * v_t
sp *= D(1) - min(D(1), qd(age) + qw)
Sr = Sb * (1 + g) ** n
tot += sp * A2p(k_attr, k + n) * G(k + n) * Sr * (1 + tau_cs) * (v ** n)
return tot, sp
DBO0, _ = dbo_multi(55, 25, S0) # éq. (14)
DBO1, _ = dbo_multi(56, 26, S0 * (1 + g)) # survivant à t1
DBO0m, _ = dbo_multi(55, 25, S0, k_attr=26) # maturé (attribution k+1)
p_tau = D(1) - min(D(1), qd(55) + qw)
CSR = DBO0m - DBO0 # éq. (15)
ICp = (DBO0 + CSR) * i
Prest = sum(q * G(26) * (S0 * (1 + g)) * (1 + tau_cs) # éq. (16), B PLEIN
for q in (qd(55), qw))
cloture = DBO0 + CSR + ICp - Prest
assert abs(cloture - p_tau * DBO1) < D("0.000001"), "réév doit être nulle"
print(f"DBO0={DBO0:,.6f} CSR={CSR:,.6f} IC'={ICp:,.6f} Prest={Prest:,.6f}")
print(f"clôture={cloture:,.6f} = p_tau·DBO1={p_tau*DBO1:,.6f} | réév=0 [OK]")
Roll-forward multi-décréments — ActuaryLab / BFEV, 2026-06-15. Adossé à
d-attrib_exercice-annuel.md (§5–8, finding D-IC) et multidecrements_v1.md (éq. (10)–(13),
D-CAUSES-1…5). Oracle K-MULTI roulé d'un an, réévaluation nulle au FCFA. Prépare le Lot 2
du waterfall (ADR-0011) — composante sorties dans le pont.