Calculer une provision mathématique (2)
Par Arthur Charpentier le lundi 1 février 2010, 21:43 - actuariat - M1-09/10 - Lien permanent

> L=read.table("http://perso.univ-rennes1.fr/arthur.charpentier/TD8890.csv",
+ sep=";",header=TRUE)
> Lx=L$Lx
> m=length(Lx)
> p=matrix(0,m,m); d=p
> for(i in 1:m){
+ p[1:(m-i+1),i]=Lx[1+i:m]/Lx[i]
+ d[1:(m-i+1),i]=(Lx[i:(m)]-Lx[i:(m)+1])/Lx[i]}
> diag(d[m:1,])=0
> diag(p[m:1,])=0
> q=1-p
aussi, p[10,40] correspondra à
(attention, cf commentaire plus bas).
Je stocke ainsi la probabilité de décéder au bout de k années, ou bien
exactement dansk années. On peut alors calculer les différentes
grandeurs,> a=E=A=matrix(0,m,m)
> r=3/100
> for(i in 1:(m-1)){
+ a[,i]=cumsum(1/(1+r)^(0:(m-1))*c(1,p[1:(m-1),i]))
+ }
> for(i in 1:(m-1)){
+ #for(j in 1:(m-i)){
+ #A[j,i]=sum(1/(1+r)^(1:j)*p[1:j,i]*q[1,i-1+1:j])
+ A[,i]=cumsum(1/(1+r)^(1:m)*d[,i])
+ }
> for(i in 1:m){
+ E[,i]=(1/(1+r)^(1:m))*p[,i]
+ }
A partir de ces constantes (ou de ces matrices de constantes), on peut déjà calculer la prime annuelle du contrat décès que nous avions considéré,
> x=50; n=30
> prime=A[n,x]/a[n,x]
> sum(prime/(1+r)^(0:(n-1))*c(1,p[1:(n-1),x]))
[1] 0.3116454
> sum(1/(1+r)^(1:n)*d[1:n,x])
[1] 0.3116454
De plus, on peut calculer les provisions mathématiques à l’aide des différentes méthodes (et vérifier qu’elles donnent bien le même résultat).
> ### méthode rétrospective
> VR=(prime*a[1:n,x]-A[1:n,x])/E[1:n,x]
> plot(0:n,c(0,VR),col="red")
> ### méthode prospective
> VP=diag(A[n-(0:(n-1)),x+(0:(n-1))])-prime*diag(a[n-(0:(n-1)),x+(0:(n-1))])
> points(0:n,c(VP,0),pch=4,col="blue")
> # méthode itérative
> VI=0
> for(k in 1:n){
+ VI=c(VI,(VI[k]+prime-A[1,x+k-1])/E[1,x+k-1])
+ }
> points(0:n,VI,pch=5,col="green")
Pour un contrat signé par une personne de 50 ans, pour une couverture de 30 ans, au taux d’actualisation de 3%, on obtient les provisions mathématiques suivantes,






Commentaires
Bonjour,
Il me semble qu'une erreur s'est glissé dans votre deuxième billet concernant le calcul des PMk. En effet, lorsqu'on exécute votre programme qui crée la matrice des (tPx), p[10,40] n'est pas égale à 10P40. Après vérification avec la table TD8890, 10P40 est égale à p[10,41]. Je crois que vous faite commencé vos colonnes à l'age 0, i.e. le vecteur colonne 1, d'où le décalage. Pourriez-vous m'éclairer ?
Merci
REPONSE Merci Aurélien pour la remarque, je crois en effet que tu as raison (ah, ces indexations de bases par 0 !). En effet, si on regarde de plus près
.
Désolé.... Le plus propre est sûrement d'utiliser une indexation de la
base comme je viens de le faire. C'est un peu plus lourd, mais au moins
on est certain de ne pas se tromper...
> p[1,40]
[1] 0.9973578
> p[1,41]
[1] 0.9971503
> L[40:42,]
Age Lx
40 39 94997
41 40 94746
42 41 94476
> L$Lx[L$Age==41]/L$Lx[L$Age==40]
[1] 0.9971503
> L$Lx[L$Age==40]/L$Lx[L$Age==39]
[1] 0.9973578
il faudrait donc tout décaller de 1 dans les colonnes, i.e. c'est p[10,40-1] qui correspondra à