Freakonometrics

To content | To menu | To search

Teaching › actuariat - M2-09/10

Entries feed - Comments feed

Monday, February 22 2010

Quels leviers pour pérenniser les retraites ?

(via http://www.lecanardenchaine.fr/)

Saturday, February 6 2010

Provisionnement et surdispersion

Un billet rapide suite à une question que j'ai reçu par mail, au sujet des triangles de liquidation, "pourquoi tout le monde fait du ODP alors que le résultat est le même que Poisson normale ?". Le plus simple est de regarder effectivement, sur un triangle, ce qui se passe si l'on prend des modèles intégrant de la surdispersion, au lieu d'un modèle de Poisson plus classique. Pour commencer, ajustons un modèle de Poisson sur le triangle des incréments,
>  library(ChainLadder)
>  an <- 10; ligne = rep(1:an, each=an); colonne = rep(1:an, an)
>  passe = (ligne + colonne - 1)<=an; n = sum(passe)
>  PAID=GenIns; INC=PAID
>  INC[,2:an]=PAID[,2:an]-PAID[,1:(an-1)]
>  Y = as.vector(INC)
>  lig = as.factor(ligne)
>  col = as.factor(colonne)
>  base = data.frame(Y,col,lig)
>  reg1=glm(Y~col+lig,data=base,family="poisson")
>  sum(exp(predict(reg1,newdata=base))[passe!=TRUE])
[1] 18680856
Si on utilise un modèle de Poisson surdispersé, la prédiction sera la même,
>  reg2=glm(Y~col+lig,data=base,family="quasipoisson")
>  sum(exp(predict(reg2,newdata=base))[passe!=TRUE])
[1] 18680856
En effet, seule la variance change, i.e. l'incertitude sera plus grande si l'on utilise un modèle de Poisson surdispersion. Notons que les tests permettent de valider l'hypothèse de surdispersion,
> dispersiontest(reg1)
        Overdispersion test
data:  reg1
z = 4.3942, p-value = 5.558e-06
alternative hypothesis: true dispersion is greater than 1

Une autre idée peut être de faire une régression binomiale négative (qui permet de prendre en compte la surdispersion),
>  library(MASS)
>  reg3=glm.nb(Y~col+lig,data=base)
> summary(reg3)
(Dispersion parameter for Negative Binomial(13.8349) family taken to be 1)
              Theta:  13.83
          Std. Err.:  2.61
 2 x log-likelihood:  -1460.766

On peut alors calculer à nouveau le montant de provision total,
>  sum(exp(predict(reg3,newdata=base))[passe!=TRUE])
[1] 18085795
qui est légèrement différent du cas Poissonnien.

On peut d'ailleurs aller un peu plus loin, et regarder les mse de prédiction, pour chacun des modèles (que j'avais évoqué ici). Mais auparavant, pour des raisons techniques, il est plus simple de se débarrasser des valeurs nulles dans le triangle,
>  an <- 10; ligne = rep(1:an, each=an); colonne = rep(1:an, an)
>  passe = (ligne + colonne - 1)<=an; np = sum(passe)
>  futur = (ligne + colonne - 1)> an; nf = sum(passe)
>  base$Y2=base$Y; base$Y2[is.na(Y)]=.001
>  reg1b=glm(Y2~lig+col, family=poisson,data=base)
>  reg2b=glm(Y2~lig+col, family=quasipoisson,data=base)
>  reg3b=glm.nb(Y2~lig+col, data=base)

La fonction suivante calcule l'estimateur du montant total de réserve, ainsi que la prediction error (que l'on exprime également en fonction du montant de provisions)
> predCL=function(reg=reg1,regb=reg1b){
+  p = 2*6-1;
+  phi.P = sum(residuals(reg,"pearson")^2)/(np-p)
+  Sig = vcov(reg)
+  X = model.matrix(regb)
+  Cov.eta = X%*%Sig%*%t(X)
+  mu.hat = exp(predict(reg,newdata=data.frame(lig,col)))*futur
+  pe2 = phi.P * sum(mu.hat) + t(mu.hat) %*% Cov.eta %*% mu.hat
+  cat("Total reserve =", sum(mu.hat), "prediction error =", sqrt(pe2),sqrt(pe2)/sum(mu.hat)," ")
+ }

Avec nos trois modèles, Poisson, ODP et binomiale négative, on obtient,
> predCL(reg1,reg1b)
Total reserve = 18680856 prediction error = 896876.9 0.04801048
> predCL(reg2,reg2b)
Total reserve = 18680856 prediction error = 4736425 0.2535443
> predCL(reg3,reg3b)
Total reserve = 18085795 prediction error = 2058134 0.1137984
Moralité, oui la surdispersion a un impact, ainsi que la méthode que l'on retient pour ma modéliser....

Tuesday, December 1 2009

Les modèles Tweedie en actuariat (1)

Rappelons que pour les modèles Tweedie, on suppose ici que la fonvtion variance soit de la forme suivante,
Le cas 0 correspond au cas Gaussien, le cas 1 correspond à la loi de Poisson, et le cas 2 à la loi Gamma. L'idée ici est de considérer les cas intermédiaire, et plus précisément entre 1 et 2. La difficulté est ici de trouver le paramètre puissance. On peut utiliser des méthodes de type maximum de vraisemblance. La "densité" une telle loi serait de la forme suivante
> ftweedie = function(y,p,mu,psi){
+ if(p==2){f = dgamma(y, 1/psi, 1/(psi*mu))} else
+ if(p==1){f = dpois(y/psi, mu/psi)} else
+ {lambda = mu^(2-p)/psi /(2-p)
+ if(y==0){ f = exp(-lambda)} else
+ { alpha = (2-p)/(p-1)
+    beta = 1 / (psi * (p-1) * mu^(p-1))
+    k = max(10, ceiling(lambda + 7*sqrt(lambda)))
+    f = sum(dpois(1:k,lambda) * dgamma(y,alpha*(1:k),beta))
+ }}
+ return(f)
+ }
On peut alors lancer une procédure de type maximum de vraisemblance profilée pour trouver la puissance optimale. On peut utiliser cette fonction pas seulement en tarification, mais aussi en provisionnement. Pour aller un peu plus vite, on peut utiliser la library(statmod), mais pour des aspects numériques, il convient de ne pas avoir de valeurs manquantes dans le triangle,
> source("http://perso.univ-rennes1.fr/arthur.charpentier/bases.R")
> library(statmod)
> an <- 6; ligne = rep(1:an, each=an); colonne = rep(1:an, an)
> passe = (ligne + colonne - 1)<=an; n = sum(passe)
> INC=PAID
> INC[,2:6]=PAID[,2:6]-PAID[,1:5]
> Y = as.vector(INC)
> lig = as.factor(ligne)
> col = as.factor(colonne)
> base=data.frame(Y,lig,col,passe)
 > basen=base[base$passe=="TRUE",]
On utilise alors le code suivant (je reviendrais un jour plus longuement sur les procedures d'affichage de sorties),
> pltweedie <- function(puissqnce){
+ regt = glm(Y~lig+col, tweedie(pow,0),subset=(passe==TRUE))
 
+ reserve = sum(predict(regt,newdata=data.frame(lig,col),type="response")[!passe])
 
+ dev = deviance(regt)
+  phi.hat = dev/n
+  mu = fitted.values(regt)
+  hat.logL = 0
+  for (k in 1:length(y)){
 
+    hat.logL <- hat.logL + log(ftweedie(y[k], pow, mu[k], phi.hat)) }
+  cat("Puissance =", round(pow,3), "phi =", round(phi.hat,2),
+  "Reserve (tot) =", round(reserve), "logL =", round(hat.logL,3),"\n")
+  return(hat.logL)}
Sur le triangle dont on dispose, on peut regarde la logvraisemblance profilée,
> for(pow in c(1,1.25,1.5,1.75,2)){pltweedie(pow)}
Puissance = 1 phi = 1.44 Reserve (tot) = 2427 logL = -Inf
Puissance = 1.25 phi = 0.47 Reserve (tot) = 2427 logL = -95.965
Puissance = 1.5 phi = 0.15 Reserve (tot) = 2428 logL = -99.207
Puissance = 1.75 phi = 0.05 Reserve (tot) = 2434 logL = -102.149
Puissance = 2 phi = 0.01 Reserve (tot) = 2444 logL = -104.157
Il y a eu 21 avis (utilisez warnings() pour les visionner)
mais aussi lancer une routine d'optimisation,
>  optimize(pltweedie, c(1.01,1.99),  tol=1e-4,maximum = TRUE)
Puissance = 1.384 phi = 0.26 Reserve (tot) = 2427 logL = -97.707
Puissance = 1.616 phi = 0.09 Reserve (tot) = 2430 logL = -100.644
Puissance = 1.241 phi = 0.48 Reserve (tot) = 2427 logL = -95.855
Puissance = 1.153 phi = 0.72 Reserve (tot) = 2427 logL = -94.751
Puissance = 1.098 phi = 0.92 Reserve (tot) = 2427 logL = -94.096
Puissance = 1.065 phi = 1.07 Reserve (tot) = 2427 logL = -93.704
Puissance = 1.044 phi = 1.18 Reserve (tot) = 2427 logL = -93.474
Puissance = 1.031 phi = 1.25 Reserve (tot) = 2427 logL = -93.403
Puissance = 1.02 phi = 1.31 Reserve (tot) = 2427 logL = -93.303
Puissance = 1.024 phi = 1.29 Reserve (tot) = 2427 logL = -93.375
Puissance = 1.016 phi = 1.33 Reserve (tot) = 2427 logL = -93.107
Puissance = 1.014 phi = 1.35 Reserve (tot) = 2427 logL = -92.862
Puissance = 1.012 phi = 1.36 Reserve (tot) = 2427 logL = -92.641
Puissance = 1.012 phi = 1.36 Reserve (tot) = 2427 logL = -92.476
Puissance = 1.011 phi = 1.37 Reserve (tot) = 2427 logL = -92.362
Puissance = 1.011 phi = 1.37 Reserve (tot) = 2427 logL = -92.288
Puissance = 1.01 phi = 1.37 Reserve (tot) = 2427 logL = -92.241
Puissance = 1.01 phi = 1.37 Reserve (tot) = 2427 logL = -92.211
Puissance = 1.01 phi = 1.37 Reserve (tot) = 2427 logL = -92.192
Puissance = 1.01 phi = 1.37 Reserve (tot) = 2427 logL = -92.181
Puissance = 1.01 phi = 1.37 Reserve (tot) = 2427 logL = -92.173
Puissance = 1.01 phi = 1.37 Reserve (tot) = 2427 logL = -92.173
$maximum
[1] 1.010050

$objective
[1] -92.1735
Autrement dit, ici, la loi de Poisson semble la mieux adaptée...

Wednesday, August 19 2009

Actuariat, la problématique du provisionnement

Dans le contexte récent des bonus des traders de BNP-Paribas, on a beaucoup parlé des provisions.En assurance (non-vie), il existe deux grandesprovisions (grandes en montant),
La provision pour prime non acquise (PPNA) correspond à  la fraction des primes brutes émises qui doit être allouée à l’exercice comptable suivant. Ces provisions s'expliquent par le fait que, d’une manière générale, les primes d’assurance doivent être payées au début de la période couverte (début du contrat), qui ne coïncide habituellement pas avec l’exercice comptable. Par conséquent, lorsque le bilan est établi à la fin d’un exercice, une partie des primes d’assurance payables au cours de celui-ci est destinée à couvrir des risques de la période suivante. Ces provisions sont alors calculées prorata temporis pour la durée restant à courir jusqu’à l’échéance du contrat. Elle est détaillée dans l'article A331-16 du Code des Assurances (ici)
La provision pour sinistre à payer (PASP) correspond au montant des sinistres survenus avant la date d’inventaire mais non encore réglés. Ces sinistres peuvent :
  • être survenus, avoir été déclarés et n’avoir pas encore été (totalement) réglés ;
  • être survenus, n’avoir pas été déclarés et donc n’avoir pas encore été réglés, ou, en anglais, incurred but not reported
Cette provision est détaillée dans l'article R331-15 du Code des Assurances (ici). Elle justifie d'ailleurs le travail des actuaires dans les compagnies d'assurance: "La provision pour sinistres à payer est calculée exercice par exercice.  Sans préjudice de l'application des règles spécifiques à certaines branches prévues à la présente section, l'évaluation des sinistres connus est effectuée dossier par dossier, le coût d'un dossier comprenant toutes les charges externes individualisables ; elle est augmentée d'une estimation du coût des sinistres survenus mais non déclarés. La provision pour sinistres à payer doit toujours être calculée pour son montant brut, sans tenir compte des recours à exercer ; les recours à recevoir font l'objet d'une évaluation distincte. Par dérogation aux dispositions du deuxième alinéa du présent article, l'entreprise peut, avec l'accord de l'Autorité de contrôle des assurances et des mutuelles, utiliser des méthodes statistiques pour l'estimation des sinistres survenus au cours des deux derniers exercices."
La première est essentuellement comptable, et contient peu d'incertitude, alors que la seconde nécessite qu'on passe un peu de temps dessus en cours. On notera toutefois que la méthodologie est fixée (partiellement) par la loi (par exemple l'article R331-26 en assurance auto, ici).
Sur le provisionnement (au sens PSAP, ou claims reserving), je voulais renvoyer vers plusieurs très bons papier de Klaus Schmidt, tout d'abord un petit cours fait à Strasbourg, un autre paru à la CAS, et enfin un petit papier sur Bornhuetter-Ferguson dans Variance.