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

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
->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
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 Function
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
Je vous remercie déjà pour les propositions