K1-bis — Cas-témoin avec rotation (oracle calculé à la main)¶
🎯 À retenir
K1-bis complète K1 en ajoutant une rotation constante : seule la probabilité de maintien change, et le produit de survie ne télescope plus. Il exerce ainsi le décrément combiné (décès + rotation) que K1 ne couvrait pas, en réutilisant à l'identique tout le reste.
🔒 Oracle scellé
La DBO calculée ici (pleine précision : 2 358 587,122796 FCFA) est l'oracle de référence K1-bis : source de vérité à reproduire, jamais à recalculer. Tout écart au-delà des seuils invalide l'implémentation, pas l'oracle, sauf erreur démontrée dans l'oracle lui-même.
Rôle. K1-bis complète K1 en exerçant ce que K1 n'exerce pas : le décrément combiné — équation (1) — c'est-à-dire l'agrégation décès + rotation et le produit de maintien qui en résulte. K1-bis reprend à l'identique toutes les hypothèses de K1 et n'ajoute qu'une seule chose : une rotation \(q^{(w)} = 3\,\%/\text{an}\) constante. Conséquence : tout est inchangé (attribution A2′ \(=0{,}80\), salaire projeté, prestation, actualisation) sauf le maintien \(_5p_{55}\), qui n'est plus le télescopage \(l_{60}/l_{55}\) mais un vrai produit \(\prod(1-q^{(d)}-q^{(w)})\). Oracle exécutable jumeau :
k1bis_oracle.py(auto-vérifié). DBO attendue : \(|\Delta|\le 1\) FCFA et écart relatif \(\le 10^{-6}\) (mêmes seuils que K1, §8).
1. Hypothèses figées¶
Identiques à K1 (\(x=55\), \(k=25\), \(r=60\), \(n=5\), \(k_r=30\), \(S_0=100\,000\) FCFA/mois, \(g=2\,\%\), \(i=4\,\%\), \(\tau_{\text{cs}}=0\), pas de plafond, \(s^{\ast}=5\), grille back-loaded 0–5 : 0 | 5–15 : 1 | > 15 : 2 mois/an, mortalité CIMA H Code CIMA 2019 art. 338 p. 225), à une exception près :
| Donnée | Symbole | K1 | K1-bis |
|---|---|---|---|
| Rotation annuelle | \(q^{(w)}\) | \(0\) | \(0{,}03\) (constante, TAUX_UNIQUE) |
| Invalidité | \(q^{(\iota)}\) | \(0\) | \(0\) |
Choix de conception. La rotation est constante (3 %/an) pour rester calculable à la main, mais comme \(q^{(d)}\) varie avec l'âge (table CIMA H), le décrément combiné \(q^{(\tau)}_{x}=q^{(d)}_{x}+q^{(w)}\) est distinct à chaque âge : le produit (2) ne télescope plus. C'est précisément ce qui force l'oracle — et le code — à dérouler (1) puis (2) sans le raccourci \(l_{x+n}/l_x\). K1-bis est un cas-témoin synthétique (la rotation à ces âges proches de la retraite est volontairement forte pour que l'effet morde sur l'audit).
2. Équations de référence (forme générale, pour auto-consistance)¶
Reproduites verbatim de moteur-dbo_formalisation_v2.md (mêmes numéros). Seules (1) et (2)
sont activées différemment de K1 ; (3)–(6) et (A2′) sont rappelées en bloc.
(1) Décrément combiné (approximation additive) et survie sur un an : $\(q^{(\tau)}_x = \min\!\big(1,\; q^{(d)}_x + q^{(w)}_x + q^{(\iota)}_x\big), \qquad p^{(\tau)}_x = 1 - q^{(\tau)}_x \tag{1}\)$
(2) Probabilité de maintien sur \(n\) années :
(3) Projections : \(\;S_r = S_0\,(1+g)^{\,n}\), \(\;k_r = k + n\).
(4) Grille : \(\;G(\kappa) = \sum_j \big[\min(\kappa,\,b_j^{\sup}) - b_j^{\inf}\big]_+ \cdot \tau_j\).
(5) Prestation projetée : \(\;\text{PP} = G(k_r)\cdot S_r \cdot (1+\tau_{\text{cs}})\), puis \(\text{PP}\leftarrow\min(\text{PP},\text{plafond})\).
(6) DBO individuelle (PUC) : \(\;\text{DBO}_i = \text{PP}\cdot A(k,k_r)\cdot v^{\,n}\cdot {}_n p_x^{(\tau)}\).
(A2′) Attribution retenue (D-ATTRIB) : \(\;A(k,k_r) = \dfrac{[\,k - s^{\ast}\,]_+}{k_r - s^{\ast}}\).
3. Dérivation à la main, pas à pas¶
Les étapes ①–⑤ et ⑦ sont inchangées vis-à-vis de K1 ; seul ⑥ (le maintien) diffère.
① Grille — éq. (4) : \(\;G(25)=30\) mois, \(\;G(30)=40\) mois.
② Attribution — (A2′) : \(\;A=\dfrac{25-5}{30-5}=\dfrac{20}{25}=\mathbf{0{,}80}\).
③ Salaire projeté — éq. (3) : \(\;S_r=100\,000\times1{,}02^{5}=110\,408{,}080320\) FCFA/mois.
④ Prestation projetée — éq. (5) : \(\;\text{PP}=40\times110\,408{,}080320=4\,416\,323{,}212800\) FCFA.
⑤ Actualisation : \(\;v^5=1{,}04^{-5}=0{,}8219271068\).
⑥ Maintien — décrément combiné, éq. (1) puis (2). Le cœur de K1-bis. On lit \(q^{(d)}_x = d_x/l_x\) dans la table CIMA H, on ajoute la rotation constante, puis on déroule le produit (il ne télescope plus) :
| Âge \(x{+}s\) | \(q^{(d)}_{x+s}=d/l\) | \(q^{(\tau)}=q^{(d)}+0{,}03\) | \(p^{(\tau)}=1-q^{(\tau)}\) |
|---|---|---|---|
| 55 | \(8\,066/860\,365=0{,}00937509\) | \(0{,}03937509\) | \(0{,}9606249092\) |
| 56 | \(8\,425/852\,299=0{,}00988503\) | \(0{,}03988503\) | \(0{,}9601149714\) |
| 57 | \(8\,941/843\,874=0{,}01059518\) | \(0{,}04059518\) | \(0{,}9594048164\) |
| 58 | \(9\,531/834\,933=0{,}01141529\) | \(0{,}04141529\) | \(0{,}9585847128\) |
| 59 | \(10\,282/825\,402=0{,}01245696\) | \(0{,}04245696\) | \(0{,}9575430396\) |
Rappel K1 (mortalité seule) : \(_5p_{55}=l_{60}/l_{55}=815\,120/860\,365=0{,}9474118543\). La rotation abaisse le maintien de \(0{,}9474\) à \(0{,}8122\).
⑦ DBO individuelle — éq. (6). $\(\text{DBO} = \text{PP}\cdot A\cdot v^5\cdot {}_{5}p_{55}^{(\tau)} = 4\,416\,323{,}212800 \times 0{,}80 \times 0{,}8219271068 \times 0{,}8122089718\)$
Décomposition : $\(4\,416\,323{,}2128 \xrightarrow{\times\,0{,}80} 3\,533\,058{,}570240 \xrightarrow{\times\,v^5} 2\,903\,916{,}608649 \xrightarrow{\times\,{}_5p_{55}^{(\tau)}} \boxed{2\,358\,587{,}122796}\)$
4. Valeurs attendues (l'oracle) et tolérances¶
| Grandeur | K1 (rappel) | K1-bis |
|---|---|---|
| \(A\) (A2′) | \(0{,}80\) | \(0{,}80\) (inchangé) |
| \(S_r\) | \(110\,408{,}080320\) | \(110\,408{,}080320\) (inchangé) |
| \(\text{PP}\) | \(4\,416\,323{,}212800\) | \(4\,416\,323{,}212800\) (inchangé) |
| \(v^5\) | \(0{,}8219271068\) | \(0{,}8219271068\) (inchangé) |
| \(_5p_{55}^{(\tau)}\) | \(0{,}9474118543\) | \(0{,}8122089718\) |
| DBO (pleine précision) | \(2\,751\,205{,}018849\) | \(2\,358\,587{,}122796\) FCFA |
| DBO (arrondi FCFA) | \(2\,751\,205\) | \(2\,358\,587\) FCFA |
Contrôle de cohérence inter-cas (puisque seul le maintien change) : $\(\text{DBO}_{\text{bis}} = \text{DBO}_{K1}\times\frac{{}_5p_{55}^{(\tau)}}{{}_5p_{55}^{K1}} = 2\,751\,205{,}018849\times\frac{0{,}8122089718}{0{,}9474118543} = 2\,358\,587{,}12 \;\checkmark\)$
Seuils K1-bis (réussite) : \(\;|\Delta_{\text{DBO}}| \le 1\) FCFA et \(\dfrac{|\Delta_{\text{DBO}}|}{\text{DBO}} \le 10^{-6}\).
5. Usage en Temps 3¶
Trois tests dans tests/test_engagements.py instancient ces hypothèses (identiques à K1
mais table_rotation = TAUX_UNIQUE 0,03) :
test_K1bis_oracle_dbo (la cible DBO), test_K1bis_maintien_combine (\(_5p_{55}^{(\tau)}\) et
briques inchangées), test_K1bis_rotation_reduit_strictement_la_dbo (cohérence inter-cas).
Mesure réelle de l'implémentation : \(\text{DBO}=2\,358\,587{,}1227962\) FCFA
(\(\Delta\approx 2{,}3\times10^{-7}\) FCFA, dans les seuils). K1-bis verrouille donc le chemin
de code (1)→(2) — construire_table_composite + prob_maintien_service — que K1 laissait
télescoper.
Ce que K1-bis n'exerce toujours pas : l'invalidité (\(q^{(\iota)}\)), le plafonnement, les charges sociales, une rotation dépendant de l'âge (table
AGEplutôt queTAUX_UNIQUE). Ce sont d'autres faits/critères (F2, K3…). Comme pour K1, tout écart au-delà du seuil invalide l'implémentation, pas l'oracle — sauf erreur démontrée dans l'oracle.