#--------------------------------------- #Distribution du coût des imperfections pour une garantie plancher sur un contrat UC #Version 1.3 du 19/02/2013 #Liste des modifications : #v1.3 : ajout de la prise en compte globale des options #v1.2 : correction d'une erreur dans le calcul du coût des imperfections #v1.1 : ajout du calcul du tarif de la garantie #--------------------------------------- dossier=getwd() dossierOutils="C:/Fred/10-Logiciel R/Outils" #Charge la bibliothèque des outils source(paste(dossierOutils,"\\OutilsSurvie.r",sep="")) source("2-fonctions.r") #--------------------------------------- #Paramétrage pas=50 #pas=50 correspond à des rebalancements hebdomadaires r=0.03/pas #Taux court (hebdomadaire) mUC=.06/pas sUC=.16/sqrt(pas) #Volatilité de l'UC g=.001 #coûts de transaction H=10*pas #Horizon de projection nSimulations=5*10^3 #Nombre de simulations age=50 #Age par défaut #--------------------------------------- #Fabrication des scénarios économiques gc() S=simuleTrajectoireUC(mUC,sUC,H,nSimulations) #--------------------------------------- #Lancement de la simulation pour la réplication d'une option coutImperfection=as.vector(1:nSimulations) coutTransaction=as.vector(1:nSimulations) #Composition initiale du portefeuille K=S[,1] a=alpha(S[,1],K,H,r,sUC) b=prixOptionVente(S[,1],K,H,r,sUC)-a*S[,1] coutTransaction=g*(abs(a)*S[,1]+abs(b)) coutImperfection=0 #Récurrence par période for (t in 1:H){ #Nouvelle composition du portefeuille a1=alpha(S[,t+1],K,H-t,r,sUC) b1=prixOptionVente(S[,t+1],K,H-t,r,sUC)-a*S[,t+1] #Frais de transaction coutTransaction=coutTransaction+g*(abs(a1-a)*S[,t+1]+abs(b1-b*exp(r)))*exp(-r*t) #Coût de l'imperfection coutImperfection=coutImperfection-((a1-a)*S[,t+1]+(b1-b*exp(r))) a=a1 b=b1 } coutTotal=coutImperfection+coutTransaction print(paste("Quantile à 99,5% du coût de la stratégie (en %) : ",quantile(coutTotal,.995)*100,sep="")) print(paste("Coût moyen de la stratégie (en %) : ",mean(coutTotal)*100,sep="")) x11() plot(ecdf(coutImperfection),xlab="Coût des imperfections",main="") lines(ecdf(coutTransaction),col="red") title("Répartition du coût des imperfections") legend("topleft",legend = c("Imperfections","Frais de transaction"),col = c("black","red"), pch = 15, bty = "n", pt.cex = 1, cex = 0.8, horiz = F, inset = c(0.1, 0.1)) #Contrôle de la convergence du quantile empirique grapheConvergence=function(){ xPlage=c(1:(nSimulations/100)) q=function(x){quantile(coutTotal[1:(x*100)],.995)} res=apply(as.matrix(xPlage),1,q) x11() plot(xPlage*100,res,type="l",xlab="Nombre de simulations",ylab="Quantile 99,5%",col="red") title("Convergence du quantile empirique") } grapheConvergence() #--------------------------------------- #Simulation pour la réplication de toutes les options pour une tête d'âge x K=S[,1] w=portefeuille(S[,1],K,0,H,r,sUC,tM,age) a=w$a b=w$b coutTransaction=g*(abs(a)*S[,1]+abs(b)) coutImperfection=0 #Récurrence par période for (t in 1:H){ #Nouvelle composition du portefeuille w=portefeuille(S[,t+1],K,t,H,r,sUC,tM,age) a1=w$a b1=w$b #Frais de transaction coutTransaction=coutTransaction+g*(abs(a1-a)*S[,t+1]+abs(b1-b*exp(r)))*exp(-r*t) #Coût de l'imperfection coutImperfection=coutImperfection-((a1-a)*S[,t+1]+(b1-b*exp(r))) a=a1 b=b1 } coutTotal=coutImperfection+coutTransaction print(paste("Quantile à 99,5% du coût de la stratégie (en %) : ",quantile(coutTotal,.995)*100,sep="")) print(paste("Coût moyen de la stratégie (en %) : ",mean(coutTotal)*100,sep="")) x11() plot(ecdf(coutTotal),xlab="Coût des imperfections",main="",col="red") title("Répartition du coût des imperfections") grapheConvergence() #--------------------------------------- #Détermination du tarif de la garantie #Dans cette section on suppose (sans perte de généralité) que S=K=1 tM=LectureTM(paste(dossierOutils,"/TM/TH00-02.txt",sep="")) #Calcul de l'engagement de l'assureur engagementAssureur=function(a,x){ e=0 for (t in 1:(H/pas)){ f=prixOptionVente((1-a)^t,1,t,r*pas,sUC*sqrt(pas)) e=e+tM$Lx[x+t]/tM$Lx[x+1]*tM$Qx[x+t]*f } return(e) } #Calcul de l'engagement de l'assuré engagementAssure=function(a,x){ e=0 for (t in 1:(H/pas)){ f=a*(1-a)^t e=e+tM$Lx[x+t]/tM$Lx[x+1]*f } return(e) } #Calcul de la différence entre les engagements de l'assureur et de l'assuré pour un taux de chargement a ecartEngagements=function(a,x){ e=engagementAssureur(a,x)-engagementAssure(a,x) return(e) } #Calcul du taux d'équilibre à un âge donné (pour 1 € d'encours initial) tauxPrime=function(x){ epsilon=10^-6 aR=1 aL=0 while ((aR-aL)>epsilon) { aM=(aR+aL)/2 zL=ecartEngagements(aL,x) zM=ecartEngagements(aM,x) if (zL*zM>0) {aL=aM} else {aR=aM} } return(aR) } xPlage=c(40:75) res=apply(as.matrix(xPlage),1,tauxPrime) x11() plot(xPlage,100*res,type="l",xlab="Age",ylab="Taux de chargement",col="red") title("Tarif de la garantie en fonction de l'âge (en %)")