Boucle infini
Bonjour à tous,
J'ai une macro qui est censé à partir de la rentabilité de titres financiers créer des simulations de portefeuilles. Lorsque je lance celle-ci les simulations sont effectuées mais excel continue de tourner je ne sais pas pourquoi....
voici le code :
Option Base 1
Public VCV_Globale(12, 30) As Double
Public Numéros_Titres() As Byte
Public VCV_PF() As Double
Public x() As Double
Sub Diversification_Naive()
Worksheets("Titres").Activate
Call Calc_VCV
Worksheets("Diversification").Activate
For Nombre_Titres_PF = 1 To 12
ReDim Numéros_Titres(Nombre_Titres_PF)
ReDim VCV_PF(Nombre_Titres_PF, Nombre_Titres_PF)
ReDim x(Nombre_Titres_PF, 1)
For Numéro_Simulation = 1 To 30
Call Crée_Portefeuille(Nombre_Titres_PF)
Call Calc_VCV_PF(Nombre_Titres_PF)
Call Crée_Poids(Nombre_Titres_PF)
'simultanément calcul et stockage de la variance du portefeuille dans la cellule appropriée de "Diversification"
Cells(Nombre_Titres_PF + 1, Numéro_Simulation + 1).Value = _
WorksheetFunction.SumProduct(x, WorksheetFunction.MMult(VCV_PF, x))
Next Numéro_Simulation
Next Nombre_Titres_PF
End Sub
Sub Calc_VCV()
Range("A2").Select
Set Plage_Ref = Range(Selection, Selection.End(xlDown))
For i = 1 To 12
For j = 1 To i
VCV_Globale(i, j) = WorksheetFunction.covar( _
Plage_Ref.Offset(0, i), Plage_Ref.Offset(0, j))
'la matrice de variances-covariances est symétrique, on ne calcule que les valeurs de la partie inférieure qui est complété par la partie supérieure
' cov(X,X)= var (X)
VCV_Globale(j, i) = VCV_Globale(i, j)
Next j
Next i
End Sub
Sub Crée_Portefeuille(Nombre_Titres_PF)
'initialisation à 1 de la ligne du titre à tirer dans la variable tableau Numéro_Titres
Position = 1
'correspond au nombre de titres disctincts que contient le portefeuille
Nombre_Titres_OK = 0
'tirage aléatoire des titres, et qui est itérée jusqu'à l'obtention du portefeuille comportant le nombre de titres souhaités
Do
Randomize
Titre = Int(Rnd * 12) + 1
'permet de tester la présence du numéro de l'action tirée à la ligne au dessus parmi celles figurant déjà dans la portefeuille constitué
Pointeur = 1
Test = False
While Pointeur <= Position And Test = False
If Numéros_Titres(Pointeur) = Titre Then
Test = True
End If
Pointeur = Pointeur + 1
Wend
'Intervient dans la condition de ligne9 pour ne pas parcourir tous les éléments de Numéro_Titres dans la cas où le numéro de titre figure déjà dans le PF
If Test = False Then
'Si Test reste égal à false après avoir parcouru tous les éléments de Numéro_Titres, le titre est ajouté à ceux figurant déjà dans le PF
Numéros_Titres(Position) = Titre
Nombre_Titres_OK = Nombre_Titres_OK + 1
Position = Position + 1
End If
Loop While Nombre_Titres_OK < Nombre_Titres_PF
End Sub
Sub Calc_VCV_PF(Nombre_Titres_PF)
'Construction de la matrice variance/covariance du portefeuille simulé.
'Les numéros des titres du PF étant stockés dans la variable Numéros_Titres, on à l matrice variances/covariances du PF avec deux boucles
For i = 1 To Nombre_Titres_PF
For j = 1 To i
VCV_PF(i, j) = VCV_Globale(Numéros_Titres(i), _
Numéros_Titres(j))
VCV_PF(j, i) = VCV_PF(i, j)
Next j
Next i
End Sub
Sub Crée_Poids(Nombre_Titres_PF)
'la construction du vecteur poids, il suffit d'affecter à chaque ligne de la variable l'inverse du nombre de titres composants le portefeuille simulé
For i = 1 To Nombre_Titres_PF
x(i, 1) = 1 / Nombre_Titres_PF
Next i
End SubCe que je ne comprends pas, c'est pourquoi malgré le fait que les calculs soient fait et soient juste par la macro, celle-ci continue de tourner sans raison. Je pense que le problème vient de la Sub Crée_Portefeuille(Nombre_Titres_PF) car lorsque que je met celle-ci en commentaire, le tableau de simulations se remplit correctement avec des zéros partout. Et je ne vois pas de boucles infinis (enfin pas de mes yeux de novices en VBA)
Je reste à l'entière disposition des experts voulant bien se pencher sur ce problème
Merci beaucoup
Cordialement,
Bonjour,
Nombre_Titres_OK = Nombre_Titres_OK + 1Cette ligne qui incrémente la variable qui sert pour la sortie du boucle est à l'intérieur d'un test. A priori, ça vient de là. Cela veut dire, si le test est faux depuis le début, le boucle deviendra un boucle infini.
Par principe, une condition de sortie elle s'incrémente à chaque itération.
Bonjour,
Merci d'avoir pris de ton temps sur ce problème.
Je comprends bien ta réponse, néanmoins les résultats que j'obtiens sont bons et donc la boucle ne devrait pas devenir infini par conséquent.
Il faudrait donc que je sorte l'expression
Nombre_Titres_OK = Nombre_Titres_OK + 1de la boucle de tests ? mais dans ce cas je ne saurais plus si les résultats sont probants ou pas ?
cordialement,