Méthodes de simulation: mise en œuvre informatique Méthodes de

Transcription

Méthodes de simulation: mise en œuvre informatique Méthodes de
Stage intensif « stochastique / simulation »
www.isfa.info
Méthodes
Méthodes de
de simulation:
simulation:
mise
mise en
en œuvre
œuvre informatique
informatique
Julien JACQUEMIN
WINTER & Associés
Les méthodes de simulation en assurance
Page 1
Présentation du contexte (1/2)
Estimation des paramètres
&
Tests d’adéquation
Générateur de nombres
aléatoires
MODELES
Actif
Discrétisation
Passif
Contexte macroéconomique
Les méthodes de simulation en assurance
Page 2
Présentation du contexte (2/2)
La mise en œuvre pratique de méthodes de simulation nécessite:
- le choix des générateurs de nombres aléatoires utilisés
- le choix des algorithmes de « fabrication » des lois du modèle à partir
de la loi uniforme
- le choix des algorithmes d’implémentation du modèle
- la programmation informatique des éléments ci-dessus
- la calibration du modèle (choix du nombre de tirages)
Illustrations: fichier Excel « Simulation.xls »
Les méthodes de simulation en assurance
Page 3
Simulation Rnd avec 10 000 valeurs
> Il subsiste une variabilité importante
Les méthodes de simulation en assurance
Page 4
Loi uniforme: algorithme de Van der Corput
Public Function dValeurUniformeVdC(b As Long, n As Long) As Double
'---------------------------------------------------------------------'1-Description : returns the equivalent first van der Corput sequence number (used in Halton, Faure, Sobol)
'---------------------------------------------------------------------Dim c As Double, ib As Double
Dim i As Long, n1 As Long, n2 As Long
n1 = n
c=0
ib = 1 / b
Do While n1 > 0
n2 = Int(n1 / b)
i = n1 - n2 * b
c = c + ib * i
ib = ib / b
n1 = n2
Loop
dValeurUniformeVdC = c
End Function
Les méthodes de simulation en assurance
Page 5
Simulation Van der Corput de base 2 avec 10 000 valeurs
Les méthodes de simulation en assurance
Page 6
Loi uniforme: algorithme du Tore
Public Function dValeurUniformeTore(l As Long, p As Integer) As Double
'-----------------------------------------------------------------------'1-Description : Retourne la valeur de rang l d'échantillon de la loi uniforme sur (0,1)
simulé avec l'algorithme du Tore en base p (qui doit être un nombre premier)
'-----------------------------------------------------------------------Dim x As Double
x = l * Sqr(p)
dValeurUniformeTore = x - Int(x)
End Function
Les méthodes de simulation en assurance
Page 7
Validation des nombres obtenus: le test du poker
Fréquences observées pour l'algorithme du tore
Fréquences
théorique
p=2
p=3
p=5
p=7
p = 11
p = 13
p = 17
p = 19
p = 23
p = 29
Carré
0,1%
0%
0%
0%
0%
0%
0%
0%
0%
0%
0%
Brelan
3,6%
0%
0%
0%
0%
0%
0%
0%
0%
0%
0%
Double paire
2,7%
0%
0%
0%
0%
0%
0%
0%
0%
0%
0%
Paire
43,2%
0%
0%
0%
37,2%
49,7%
0%
0%
23,3%
0%
0%
Tous différents
50,4%
100%
100%
100%
62,8%
50,3%
100%
100%
76,7%
100%
100%
p-valeur du χ2
1,00
0,91
0,91
0,91
1,00
1,00
0,91
0,91
0,99
0,91
0,91
Ce test laisse deviner que l’algorithme présente des imperfections
Il doit être complété de tests plus classiques (Chi2 par exemple); les tests doivent
être effectués en amont (sur les nombres uniformes générés) et en aval (après
fabrication des nombres issus de la loi désirée).
Illustration: fichier « poker.xls »
Les méthodes de simulation en assurance
Page 8
Mesure de la précision dans l’estimation d’une proportion
Une relation lie l’incertitude de l’estimation (Δp), le nombre d’observations (N)
et le niveau de confiance (1-a) de l’intervalle désiré :
Δp = u a / 2
f (1 − f )
N
où
f est la valeur autour de laquelle est construit l’intervalle. (i.e. f est égale à la
valeur estimée )
up désigne le quantile d’ordre p de la loi normale centrée réduite.
Les méthodes de simulation en assurance
Page 9
Mesure de la précision dans l’estimation d’une proportion
Exemple
Si la valeur estimée f vaut 0.2, si l’on souhaite un intervalle à 95% pour une
précision de l’ordre de 0.01. Il est nécessaire de disposer de :
i.e.
N ≈
f (1 − f )
0 .2 * 0 .8
2
ua / 2 =
* 1.96 2
2
2
Δp
0.01
N ≈ 6150
NB: le nombre de tirages nécessaire est une fonction décroissante de la
proportion à simuler lorsqu’on fixe la précision relative.
Les méthodes de simulation en assurance
Page 10
Traitement des valeurs extrêmes
Les valeurs extrêmes (proches de 0 ou de 1) peuvent être sous-représentées. Ceci
pose un problème pour la simulation de faibles valeurs. Illustrons ceci évace la
simulation mensuelle de taux de mortalité. Si u est une réalisation de loi
uniforme [0 ;1], au lieu d’observer pour chaque mois :
⎡ q ⎤
u ∈ ⎢ 0, x ⎥
⎣ 12 ⎦
On observera plutôt pour le t-ème mois :
t − 1 + qx ⎤
⎡
u ∈ ⎢ t −1,
12 ⎥⎦
⎣ 12
Cette technique permet de réduire de manière significative le biais induit par le
générateur de nombres aléatoires.
Les méthodes de simulation en assurance
Page 11
Traitement des valeurs extrêmes
On simule 10 000 réalisations de loi uniforme sur [0 ;1]. Avec un taux de
mortalité annuel de 1%, la première technique conduit à un taux de mortalité de
l’ordre de 0,12% par mois (à comparer à 1%/12 = 0,083%). La méthode ajustée
conduit aux taux suivants :
1
2
3
4
5
6
7
8
9
10
11
12 Moyenne
0,12% 0,10% 0,14% 0,10% 0,07% 0,08% 0,08% 0,11% 0,05% 0,05% 0,05% 0,06% 0,084%
Le taux de mortalité mensuel moyen ainsi simulé apparaît donc proche du taux
mensuel moyen théorique.
Les méthodes de simulation en assurance
Page 12
Un algorithme standard
CAS STANDARD - Simulation n° k
k compte les simulations
t compte les mois
j compte les individus
j=0
j = j+1
Simulation mortalité
j, t, n, k
Décès ?
Non
Oui
Calcul :
charge de sinistre
réassurance individuelle
Non
j=J?
Oui
Calcul :
Charge de sinistre annuelle
Réassurance annuelle
Les méthodes de simulation en assurance
Page 13
Loi normale
Avec Box-Muller et Rnd()
Public Function dValeurN01_BoxMuller() As Double
'------------------------------------------------------------------------'1-Description : retourne une réalisation d'une v.a. N(0,1)
'------------------------------------------------------------------------Dim n As Double, u(1 To 2) As Double
Const Pi = 3.14159265358979
u(1) = Rnd
u(2) = Rnd
dValeurN01_BoxMuller = (-2 * Log(u(1))) ^ 0.5 * Cos(2 * Pi * u(2))
Avec Moro et le Tore
Public Function dValeurN01_deMoroTore(l As Long, p As Integer) As Double
End Function
'--------------------------------------------------------------------------------'1-Description : Renvoie un nombre dans un échantillon de normales centrées réduites
'--------------------------------------------------------------------------------dValeurN01_deMoroTore =
dFdRNormaleInverse_deMoro(dValeurUniformeTore(l, p))
End Function
Les méthodes de simulation en assurance
Page 14
Fonction de répartition de N(0,1)
Public Function dRepartitionNormale(x As Double) As Double
'------------------------------------------------------------------------'Description : retourne une approximation de la FdR de N(0,1) à 10^-7 près, c'est à dire Prob(X<=x) avec 7 décimales
'Source: "Probabilité et statistiques" de Gilbert SAPORTA (ed. Technip)
'------------------------------------------------------------------------Dim T As Double, f As Double, y As Double, r As Double
Const Pi = 3.14159265358979 Const a = 0.2316419 Const b1 = 0.31938153 Const b2 = -0.356563782 Const b3 = 1.781477937
Const b4 = -1.821255978 Const b5 = 1.330274429
y = Abs(x)
T = 1 / (1 + a * y)
f = exp(-(y ^ 2) / 2) / ((2 * Pi) ^ (1 / 2))
r = 1 - f * (b1 * T + b2 * (T ^ 2) + b3 * (T ^ 3) + b4 * (T ^ 4) + b5 * (T ^ 5))
If x > 0 Then
dRepartitionNormale = r
Else
dRepartitionNormale = 1 - r
End If
End Function
Les méthodes de simulation en assurance
Page 15
Loi normale: algorithme de Moro
Public Function dFdRNormaleInverse_deMoro(u As Double) As Double
' Calculates the Normal Standard numbers given u, the associated uniform number (0, 1) VBA version of the Moro's (1995) code in C
Dim x As Double, r As Double, r0 As Double, r1 As Double, r2 As Double
Const a1 = 2.50662823884 Const a2 = -18.61500062529 Const a3 = 41.39119773534 Const a4 = -25.44106049637 Const b1 = -8.4735109309
Const b2 = 23.08336743743 Const b3 = -21.06224101826 Const b4 = 3.13082909833
Const c1 = 0.337475482272615 Const c2 = 0.976169019091719 Const c3 = 0.160797971491821 Const c4 = 2.76438810333863E-02
Const c5 = 3.8405729373609E-03 Const c6 = 3.951896511919E-04 Const c7 = 3.21767881768E-05 Const c8 = 2.888167364E-07 Const c9 = 3.960315187E-07
x = u - 0.5
If Abs(x) < 0.42 Then
r=x^2
r2 = x * (((a4 * r + a3) * r + a2) * r + a1) / ((((b4 * r + b3) * r + b2) * r + b1) * r + 1)
Else
If x > 0 Then r = Log(-Log(1 - u))
If x <= 0 Then r = Log(-Log(u))
r0 = c7 + r * (c8 + r * c9)
r1 = c4 + r * (c5 + r * (c6 + r * r0))
r2 = c1 + r * (c2 + r * (c3 + r * r1))
If x <= 0 Then r2 = -r2
End If
dFdRNormaleInverse_deMoro = r2
Les méthodes de simulation en assurance
End Function
Page 16
Prix d’un call
Formule fermée
Simulation
Public Function dValeurOptionAchatBSM(s As Double, k As
Double, r As Double, q As Double, dSigma As Double, T As
Double) As Double
Public Function dValeurOptionBSM_Simulation(s As Double, k As Double, r As
Double, q As Double, dSigma As Double, T As Double, iTirages As Integer) As
Double
'Calculates the European Call Option in a general framework
(allows dividend yield, Merton)
' retourne la valeur d'une option d'achat européenne évaluée par simulation
Dim d1 As Double, d2 As Double
Dim dTrendRN As Double, dSigraiz As Double, dN01 As Double, dSt As Double,
dCumul As Double
Dim i As Long
d1 = (Log(s / k) + ((r - q) + (dSigma ^ 2) / 2) * T) / (dSigma *
Sqr(T))
d2 = d1 - dSigma * Sqr(T)
dValeurOptionAchatBSM = s * exp(-q * T) *
dRepartitionNormale(d1) - k * exp(-r * T) *
dRepartitionNormale(d2)
Const p = 3
dTrendRN = (r - q - ((dSigma ^ 2) / 2)) * T,
dSigraiz = dSigma * Sqr(T)
For i = 1 To iTirages
dN01 = dValeurN01_deMoroTore(i, p)
End Function
dSt = s * exp(dTrendRN + dSigraiz * dN01)
If dSt >= k Then dCumul = dCumul + (dSt - k)
Next i
dValeurOptionBSM_Simulation = (dCumul / iTirages) * exp(-r * T)
End Function
Les méthodes de simulation en assurance
Page 17
Calibration du modèle
Disposer d’une formule fermée (ex : prix du Call européen) permet de calibrer le
nombre de simulations nécessaires pour observer de manière satisfaisante la variable
d’intérêt. Ainsi le nombre de simulations ne dépend pas que de l’horizon de projection
mais aussi de la volatilité des variables modélisées et du générateur de nombres
aléatoires sélectionné.
Exemple : Prix du Call européen d’échéance 6 mois
Nombre minimal de simulations à partir de
l’algorithme du tore (p=5) pour que l’erreur
d’estimation relative soit inférieure à 0,1 %.
σ = 20 %
Nmin ≈ 7 000
σ = 50 %
Nmin ≈ 15 000
Les méthodes de simulation en assurance
Page 18
Méthode de l’acceptation / rejet
•
Pour calculer l’intégrale
h ≥ ρ(x) ∀ x
b
I = ∫ ρ ( x)dx
a
h
X
•
La probabilité qu’un point soit en dessous de la
courbe est:
N : Nombre de points
N’ : Nombre de points sous la courbe
X
X
X
O
I
N'
r=
≈
(b − a )h N
–
–
X
X
O
O
O
O
a
O
O
b
N'
I ≈ (b − a )h
N
Les méthodes de simulation en assurance
Page 19
Méthode de l’acceptation / rejet
Début
On fixe N entier
N’ = 0
h
X
X
X
X
X
Boucle
N fois
On sélectionne x dans [a,b]
x = (b − a )u1 + a
X
O
O
puis y dans [0,h]
y = hu 2
si [x,y] est dessous alors N’ = N’+1
O
O
O
a
O
O
b
I = (b-a) h (N’/N)
Fin
Les méthodes de simulation en assurance
Page 20
« Bonnes pratiques » d’implémentation
Quelques règles à respecter:
- fabriquer des composants autonomes (logique « objet »)
- typer les variables et les fonctions
- documenter le code
- ne pas utiliser de variables globales
Les méthodes de simulation en assurance
Page 21