Ce qui est réel et ce qui est simulé. Le risque (fréquence, coût, bonus-malus) vient d’une base publique réelle de 678 000 contrats auto français, et le tarif suit la règle légale du bonus-malus. Aucune base publique ne contient les prix proposés au renouvellement, les décisions de résiliation ou les devis concurrents : ces données appartiennent aux assureurs. Le comportement des clients est donc simulé (Monte Carlo, hypothèses explicites), et l’étude indique les données à obtenir pour la rejouer sur des chiffres réels.
Un client à peu de sinistres trouve sa prime élevée et résilie. Depuis le 1er janvier 2015 (loi Hamon), il peut partir à tout moment après un an de contrat, et les comparateurs rendent l’écart de prix immédiat. Lovys perd un client ; le porteur de risque perd un contrat que son tarif rendait pourtant rentable. Je pose deux grandeurs :
L’argument à porter au porteur de risque tient en une phrase : y est positif pour lui comme pour Lovys. Il ne vaut que si la baisse est justifiée par le risque (sinon le résultat de l’assureur se dégrade), et seulement si elle ne coûte pas plus qu’elle ne rapporte. L’étude teste ces deux conditions.
| Élément | Statut | Usage |
|---|---|---|
| Fréquence, coût des sinistres, exposition, bonus-malus, caractéristiques du conducteur et du véhicule | Réel : base publique freMTPL2 (CASdatasets), 677 991 contrats | Partie A : mesure du risque ; alimente la simulation |
| Règle de tarification du bonus-malus | Réel : règle légale (article A.121-1 du Code des assurances) | Tarif de l’assureur : prime de référence x coefficient (0,50 à 3,50) |
| Prix concurrents, prime proposée au renouvellement, décision de résilier | Simulé : non disponible publiquement | Partie B : Monte Carlo avec paramètres incertains |
Partie A mesure le risque réel par niveau de bonus-malus et en déduit la marge de manoeuvre justifiée : de combien la prime peut baisser avant que le S/P d’un segment n’atteigne la cible de l’assureur.
Partie B simule 20 000 contrats tirés dans la base réelle sur 5 ans. Chaque contrat a le risque estimé dans la partie A, multiplié par un facteur non observé (loi Gamma de forme 0,99, estimée sur les données). Chaque année, un client demande à résilier avec une probabilité qui augmente avec l’écart entre le prix de l’assureur et un prix concurrent plus proche du risque. La sensibilité au prix est inconnue : je la tire au hasard avec les autres paramètres incertains et je ne retiens que les 300 simulations dont le churn serait plausible pour Lovys (churn moyen de 10 à 22 % par an ; churn des bons profils 1,2 à 2,2 fois celui des autres). Les sinistres et les aléas sont les mêmes pour toutes les options comparées.
| Paramètre | Valeur ou plage |
|---|---|
| Part du tarif déjà proportionnelle au risque, au-delà du bonus-malus | 0 à 50 % |
| Part du risque non observé que voit le concurrent | 5 à 30 % |
| Sensibilité du départ à l’écart de prix | 1 à 12, retenue si cohérente avec le churn |
| Churn moyen annuel | 10 à 22 % |
| Part des clients qui demandent à résilier sans vouloir partir (« bluff ») | 0 à 15 % par an |
| Commission de Lovys (le « % » du cas posé, hypothèse) | 30 % de la prime |
| Frais de gestion : Lovys / assureur | 8 % / 8 % de la prime |
| S/P cible de l’assureur, horizon | 55 %, 5 ans |
Les résultats sont en euros par contrat initial, cumulés sur 5 ans, au niveau de prix de la base (historique). Je compare ces options au statu quo :
La base freMTPL2 couvre un portefeuille automobile français d’un assureur non identifié : 677 991 contrats, 358 343 années d’exposition et 26 444 sinistres. Je plafonne les sinistres à 50 000 € (88 sinistres concernés, soit 23 % du montant total, qu’il faudrait traiter à part dans un vrai tarif). Fréquence = sinistres / années d’exposition ; coût moyen = coût / sinistres ; coût pur = coût total / années d’exposition.
Risque par niveau de bonus-malus (données réelles)
| Coefficient bonus-malus | Part de l’exposition | Fréquence | Coût moyen | Coût pur annuel | Fréquence, toutes choses égales |
|---|---|---|---|---|---|
| 0,50 (bonus max) | 63 % | 5,1 % (5,1 % à 5,2 %) | 1 690 € | 87 € | référence |
| 0,51 à 0,60 | 13 % | 7,5 % (7,2 % à 7,7 %) | 1 752 € | 131 € | x 1,62 (1,56 à 1,69) |
| 0,61 à 0,80 | 15 % | 11,2 % (10,9 % à 11,4 %) | 1 744 € | 195 € | x 2,50 (2,42 à 2,59) |
| 0,81 à 1,00 | 8 % | 14,3 % (13,9 % à 14,8 %) | 1 929 € | 277 € | x 3,20 (3,07 à 3,34) |
| > 1,00 | 1 % | 35,2 % (33,3 % à 37,2 %) | 1 827 € | 643 € | x 7,64 (7,18 à 8,14) |
Le coût pur augmente nettement avec le coefficient, et ce n’est pas un effet des autres variables : la dernière colonne (modèle de Poisson avec âge, véhicule, zone et densité) donne les mêmes ordres de grandeur. Le coût moyen d’un sinistre varie peu d’une classe à l’autre : le bonus-malus informe sur la fréquence, pas sur la gravité.
En France, la cotisation d’un contrat auto est la prime de référence multipliée par le coefficient de réduction-majoration (0,50 à 3,50). Je reconstitue ce tarif : prime de référence = coût pur estimé sans bonus-malus (âge, véhicule, zone), puis coefficient, le tout calé pour un S/P global égal à la cible de 55 %. C’est un tarif stylisé : le vrai tarif contient d’autres variables et des remises commerciales.
tabA$lab <- factor(c("0,50\n(bonus max)", "0,51-0,60", "0,61-0,80", "0,81-1,00", "> 1,00"), c("0,50\n(bonus max)", "0,51-0,60", "0,61-0,80", "0,81-1,00", "> 1,00"))
tabA$col <- ifelse(tabA$SP < s_cible, "sous la cible : surtarifé", "au-dessus de la cible : sous-tarifé")
ggplot(tabA, aes(lab, SP, fill = col)) + geom_col(width = .6) +
geom_errorbar(aes(ymin = sp_lo, ymax = sp_hi), width = .12) +
geom_hline(yintercept = s_cible, linetype = "dashed", colour = pal["marine"]) +
scale_fill_manual(values = c("sous la cible : surtarifé" = unname(pal["teal"]), "au-dessus de la cible : sous-tarifé" = unname(pal["corail"]))) +
scale_y_continuous(labels = function(x) fr_pct(x), limits = c(0, NA)) +
labs(title = "S/P observé par niveau de bonus-malus sous un tarif « référence x coefficient »",
subtitle = paste0("Données réelles, intervalle de confiance à 95 % (bootstrap) ; trait pointillé : S/P cible de ", fr_pct(s_cible)),
x = "Coefficient de réduction-majoration", y = "Sinistres / primes", fill = NULL)
Sous cette règle, les contrats au bonus maximal ont un S/P de 48,8 % (IC 95 % : 46,8 % à 51,1 %) : leur prime pourrait baisser d’environ 11 % avant que le S/P n’atteigne la cible. Les classes 0,51 à 0,80 et au-dessus de 1,00 paient moins que leur risque (S/P supérieur à la cible). C’est la justification actuarielle de la baisse : sur la simulation, 54 % des contrats ont une marge de manoeuvre positive, de 15,2 % en moyenne. Lovys peut produire ce calcul sur son propre portefeuille.
Quand les bons profils partent plus vite que les autres, le S/P du portefeuille conservé passe de la cible à 70,9 % en cinq ans (contre 55,4 % si les départs étaient aléatoires). La marge cumulée de l’assureur est de -10 (-47 à 28) € par contrat, contre 88 (63 à 114) € sans départ : x = 100 € pour lui, et 68 € pour Lovys (de 212 (192 à 228) € à 280 (278 à 282) €). Comme la marge de l’assureur ne représente qu’environ 7 points de prime, quelques points de S/P suffisent à l’effacer : c’est un ordre de grandeur, pas une prévision.
cmp <- rbind(
data.frame(option = "Remise générale", partie = "Assureur", t(q3(g("lc", dref, phiref)))), data.frame(option = "Remise générale", partie = "Lovys", t(q3(g("ll", dref, phiref)))),
data.frame(option = "Offre à la résiliation", partie = "Assureur", t(q3(g("oc", dref, phiref)))), data.frame(option = "Offre à la résiliation", partie = "Lovys", t(q3(g("ol", dref, phiref)))))
names(cmp)[3:5] <- c("lo", "med", "hi"); cmp$option <- factor(cmp$option, c("Offre à la résiliation", "Remise générale"))
ggplot(cmp, aes(med, option, colour = partie)) + geom_vline(xintercept = 0, colour = "grey40") +
geom_pointrange(aes(xmin = lo, xmax = hi), position = position_dodge(width = .5), linewidth = .9) +
scale_colour_manual(values = unname(pal[c("marine", "corail")])) +
labs(title = paste0("Même remise (plafond de ", fr_pct(dref), "), deux façons de l'offrir"),
subtitle = "Gain vs statu quo, € par contrat sur 5 ans, coût partagé 50/50 ; médiane et intervalle 10-90 %",
x = "Variation de la marge cumulée (€ par contrat)", y = NULL, colour = NULL)
La remise générale est versée à tous les profils éligibles (54 % du portefeuille), dont la plupart seraient restés sans elle. Son coût s’applique à tous les contrats, chaque année, alors que le gain ne vient que de la minorité qui allait partir. Résultat : le total des deux parties est négatif dans 98 % des simulations. L’argument « on perd x, on gagne y » ne tient donc pas pour une baisse de prime généralisée : le coût est payé par ceux qui n’en avaient pas besoin.
L’offre n’est faite qu’au client qui demande à résilier, et seulement s’il est éligible (marge de manoeuvre positive). Le coût de la remise ne porte que sur les clients conservés, qui seraient autrement perdus : elle ne subventionne personne d’autre. La remise est plafonnée, et ne dépasse jamais le prix technique (le prix qui ramène le S/P du client à la cible), ce qui la justifie actuariellement.
lab_p <- c("2 %", "4 %", "6 %", "8 %", "10 %", "prix technique")
lab_f <- c("1" = "Lovys finance seul", "0.5" = "Coût partagé 50/50", "0" = "L'assureur finance")
sw <- do.call(rbind, lapply(plafonds, function(dc) do.call(rbind, lapply(c(1, .5, 0), function(phi) rbind(
data.frame(dc = dc, phi = phi, partie = "Assureur", t(q3(g("oc", dc, phi)))), data.frame(dc = dc, phi = phi, partie = "Lovys", t(q3(g("ol", dc, phi)))))))))
names(sw)[4:6] <- c("lo", "med", "hi"); sw$dcf <- factor(sw$dc, plafonds, lab_p); sw$fin <- factor(lab_f[as.character(sw$phi)], unname(lab_f))
ggplot(sw, aes(dcf, med, colour = partie, group = partie)) + geom_hline(yintercept = 0, colour = "grey40") +
geom_pointrange(aes(ymin = lo, ymax = hi), position = position_dodge(width = .5), linewidth = .6, size = .35) +
facet_wrap(~fin) + scale_colour_manual(values = unname(pal[c("marine", "corail")])) +
labs(title = "Offre à la résiliation : gain selon le plafond de remise et le financement",
subtitle = "€ par contrat sur 5 ans, par rapport au statu quo ; point = médiane, trait = intervalle 10-90 %",
x = "Plafond de la remise", y = "Variation de la marge cumulée (€)", colour = NULL) +
theme(axis.text.x = element_text(angle = 40, hjust = 1))
Part des simulations où l’assureur et Lovys gagnent tous les deux
| Lovys finance seul | Coût partagé 50/50 | L’assureur finance | |
|---|---|---|---|
| 2 % | 72 % | 82 % | 72 % |
| 4 % | 74 % | 86 % | 73 % |
| 6 % | 72 % | 87 % | 74 % |
| 8 % | 67 % | 89 % | 74 % |
| 10 % | 65 % | 89 % | 69 % |
| prix technique | 0 % | 77 % | 22 % |
Trois enseignements :
À titre de comparaison, un prix proportionnel au risque pour tous, à recettes constantes, apporte +21,3 (10,0 à 40,9) € à l’assureur et +11,1 (5,2 à 26,3) € à Lovys, soit davantage, mais il suppose de refondre le tarif (le coefficient de bonus-malus étant obligatoire, par d’autres variables que lui) : c’est un chantier de moyen terme, pas une offre.
Une offre faite à ceux qui demandent à résilier a un défaut connu : certains clients vont demander sans vouloir partir, pour obtenir la remise. Je l’ai simulé (0 à 15 % de clients par an).
tot <- g("oc", dref, phiref) + g("ol", dref, phiref)
ggplot(data.frame(pi_b = res$pi_b, tot = tot), aes(pi_b, tot)) + geom_hline(yintercept = 0, colour = "grey40") +
geom_point(alpha = .35, colour = pal["marine"], size = 1.5) +
geom_smooth(method = "loess", formula = y ~ x, se = FALSE, colour = pal["corail"], linewidth = 1.2) +
scale_x_continuous(labels = function(x) fr_pct(x)) +
labs(title = "Le bluff érode le gain de l'offre",
subtitle = paste0("Gain total (assureur + Lovys), plafond de ", fr_pct(dref), ", chaque point est une simulation"),
x = "Part des clients qui demandent à résilier sans vouloir partir", y = "Gain total (€ par contrat)")
Le gain total est positif dans 94 % des simulations ; il l’est dans 99 % des cas avec moins de 5 % de bluff et 88 % au-delà de 10 %. Il dépend aussi de la sensibilité des clients au prix : il est positif dans 85 % des cas quand cette sensibilité est faible (inférieure à 3) et 100 % quand elle est forte (supérieure à 8). Ces deux paramètres ne se connaissent que par un test, d’où la recommandation d’un pilote.
Sans accord sur le tarif, Lovys peut agir seul : à chaque demande de résiliation d’un client éligible, une action de rétention qui ne touche pas au prix (contact, avantage de fidélité, service). Elle coûte un montant K par contact. Le tableau donne, pour trois taux de conviction, le gain de Lovys avant coût et le coût par contact maximal pour rester rentable.
| Partants convaincus | Gain de Lovys avant coût (€ par contrat) | Contacts par contrat sur 5 ans | Coût maximal par contact (€) | Gain de l’assureur, sans rien payer (€ par contrat) |
|---|---|---|---|---|
| 10 % | 3,7 (2,5 à 4,5) | 0,32 (0,24 à 0,41) | 11 (10 à 12) | 4,6 (2,4 à 7,1) |
| 20 % | 7,5 (5,2 à 9,4) | 0,34 (0,25 à 0,43) | 22 (19 à 24) | 9,8 (5,9 à 13,2) |
| 30 % | 11,6 (8,1 à 14,5) | 0,36 (0,27 à 0,46) | 32 (28 à 34) | 15,9 (10,2 à 20,3) |
L’assureur profite des clients conservés sans rien payer, ce qui est un argument pour lui demander de cofinancer. Le point de rupture dépend du taux de conviction, inconnu : c’est aussi ce qu’un test mesurerait.
Plan A, avec le porteur de risque
Plan B, si le porteur de risque refuse : campagne de rétention sans prix, financée par la commission de Lovys, déclenchée par la demande de résiliation, avec un plafond de coût par contact issu du tableau de la section 4.5. Lovys y gagne seul, et cela fournit au porteur de risque la preuve chiffrée qui manquait pour revenir à la table.
Étude reproductible : set.seed(2026), 300 simulations retenues sur 382 tirages, 20 000 contrats tirés dans freMTPL2. R 4.3.3