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