Bonsoir,
J'ai un petit soucis au niveau de la programmation vba
J'utilise une méthode de récursion pour retrouver les paramètres de mon vecteur intensite;
Cependant la valeur de mes résultats ne changent pas après chaque itération et je comprends pas pourquoi puisque j'ai modifier une variable dans leur calcul.
Voici les codes utilisées
-> le programme principale
->ceux utilisés pour dans le programme principale
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 Sub calibration_intensite() 'programme qui retrouve les intensites de défaut Dim paiement As Double 'pas des paiement des cds Dim time(10) 'date de maturité des cds Dim intensite(10) 'intensité de défaut Dim ss As Double 'flux jambe fixe Dim sss As Double 'flux jambe variable Dim jf(10) 'jambe fixe du cds Dim jv(10) 'jambe variable du cds Dim s(10) 'spread des cds 'date de maturité des cds time(0) = 0 time(1) = 0.5 time(2) = 1 time(3) = 2 time(4) = 3 time(5) = 4 time(6) = 5 time(7) = 7 time(8) = 10 time(9) = 20 time(10) = 30 'on récupère les valeurs des variables For i = 1 To 10 intensite(i) = 0 s(i) = Cells(i + 4, 4) / 10000 jv(i) = 1 jf(i) = -1 Next 'début de la récursion For i = 1 To 10 paiement = 0.25 ss = 0 sss = 0 While Abs(jv(i) - jf(i)) > 0.0000001 intensite(i) = intensite(i) + 0.00000001 Cells(27 + i, 6) = intensite(i) While paiement <= time(i) ss = proba_de_survie(paiement, intensite) * Exp(-spline(paiement) * paiement) * 0.25 + ss sss = sss + 0.64 * (proba_de_survie(paiement - 0.25, intensite) - proba_de_survie(paiement, intensite)) * Exp(-spline(paiement) * paiement) paiement = paiement + 0.25 Wend jv(i) = sss jf(i) = ss * s(i) Cells(16 + i, 5) = jf(i) Cells(16 + i, 6) = jv(i) Wend Next End Sub
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 Function proba_de_survie(t, lambda) Dim i As Integer 'pas de temps Dim q As Double 'proba de survie Dim temps 'date de maturité des spreads Dim n As Integer ReDim temps(10) 'initialisation i = 1 'pas de temps q = 1 'proba de survie égale à un en 0 'récupération des paramètres temps(0) = 0 For j = 1 To 10 temps(j) = Cells(j + 4, 1) 'récupération des dates de changements d'intensité Next 'calcul des proba de défaut à chaque pas While t > temps(i) q = q * Exp(-(temps(i) - temps(i - 1)) * lambda(i)) i = i + 1 Wend 'calcul de la probabilité de défaut finale q = q * Exp(-(t - temps(i - 1)) * lambda(i)) proba_de_survie = q End FunctionJe vous remercie déjà pour les propositions
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 Function spline(x) Dim xin(29) As Single 'variable de temps Dim yin(29) As Single 'variable de taux Dim i As Integer 'variable de boucle 'on implémente les vecteurs avec les coordonées des points observés For i = 1 To 29 xin(i) = Sheets("spline").Cells(i + 2, 1) yin(i) = Sheets("spline").Cells(i + 2, 2) Next Dim n As Integer 'variable du nombre total de valeur = nb_input Dim k As Integer 'variable de boucle Dim p, qn, sig, un As Single ReDim u(29 - 1) As Single ReDim yt(29) As Single 'valeur de la dérivée seconde n = 29 yt(1) = 0 u(1) = 0 'calcul de la spline For i = 2 To n - 1 sig = (xin(i) - xin(i - 1)) / (xin(i + 1) - xin(i - 1)) p = sig * yt(i - 1) + 2 yt(i) = (sig - 1) / p u(i) = (yin(i + 1) - yin(i)) / (xin(i + 1) - xin(i)) - (yin(i) - yin(i - 1)) / (xin(i) - xin(i - 1)) u(i) = (6 * u(i) / (xin(i + 1) - xin(i - 1)) - sig * u(i - 1)) / p Next qn = 0 un = 0 yt(n) = (un - qn * u(n - 1)) / (qn * yt(n - 1) + 1) For k = n - 1 To 1 Step -1 yt(k) = yt(k) * yt(k + 1) + u(k) Next k 'évaluation de la spline en un point Dim klo, khi As Integer 'variable contenant les noeuds 'ils ne correspondent pas à l'abscisse en lui même mais à leur position 'klo --> k low 'khi --> k high 'klo<khi 'recherche du bon intervalle Dim h, b, a As Single klo = 1 khi = n Do k = khi - klo If xin(k) > x Then khi = k Else klo = k End If k = khi - klo Loop While k > 1 h = xin(khi) - xin(klo) a = (xin(khi) - x) / h b = (x - xin(klo)) / h y = a * yin(klo) + b * yin(khi) + ((a ^ 3 - a) * yt(klo) + (b ^ 3 - b) * yt(khi)) * (h ^ 2) / 6 spline = y endnow: End Function![]()
Partager