VBA Stdev variable sharpe ratio - VB/VBA/VBS - Programmation
MarshPosté le 04-10-2009 à 18:59:34
Bonjour tout le monde, Je cherche à résoudre un problème depuis plusieurs semaines d'un mémoire. J'ai eu l'aide de plusieurs programmeur VBA mais sans solution. J'ai donc une base de données en feuille 2 d'excel avec en Colonne A des dates allant sur 10 ans de la ligne 3 à 2612 ( du 20/08/1999 au 20/08/2009). En suite j'ai en colonne B le prix d'un action et en colonne C son volume, commencant en ligne3. Ceci pour 257 actions, Action 2, prix en colonne D et volume en colonne E... ceci allant jusque qu'en colonne 515. En colonne 516 , j'ai un taux quotidien commençant en ligne 3 appelé Rf, pour charque jour jusqu'en ligne2612.
Je souhaite effectuer des boucles pour un ratio dit de Sharpe. Le numérateur se décompose en 2/ La première partie est appelé le retour de l'action qui est le prix en t - le prix en t-1 divisé par le prix en t-1 ceci pour tours les jours (tt les lignes). La deuxième partie est le Rf à soustrait du retour du jour. Soit pour l'action , le retour du 23 aout - le Rf du 23 aout ...La somme de ses soustractions se divise par le nombre de jour dans le mois (qui varient selon les mois) afin d'obtenir un numérateur mensuel. Une fois le numérateur d'aout obtenu par example, il faut le divisé par la standard deviation des retour du mois en questions afin d'obtenir le fameux ratio de Sharpe pour aout... Si je m'explique bien il ya donc pour 10 ans, 120 ratios pour 1 action et ceci pour 257 actions. ( Le volume n'intervient pas dans ce ratio) J'espère pas trop mal m'expliquer. Je joins le code actuel qui ne marche pas du à une erreur de tableau ou de count qui me donne des ratios erronés. Function StdDev(ByVal k As Long, Arr() As Single) Dim i As Integer Dim avg As Single, SumSq As Single
avg = Mean(k, Arr) For i = 1 To k SumSq = SumSq + (Arr(i) - avg) ^ 2 Next i StdDev = Sqr(SumSq / (k - 1)) End Function
Function Mean(ByVal k As Long, Arr() As Single) Dim Sum As Single Dim i As Integer
Sum = 0 For i = 1 To k Sum = Sum + Arr(i) Next i Mean = Sum / k End Function
Private Sub MiseAZero(Row_Dest As Integer) prix_column = 2 Do While (prix_column <= 515) Feuil7.Cells(Row_Dest, prix_column) = 0 prix_column = prix_column + 2 Loop End Sub
Marsh Posté le 04-10-2009 à 18:59:34
Bonjour tout le monde,
Je cherche à résoudre un problème depuis plusieurs semaines d'un mémoire. J'ai eu l'aide de plusieurs programmeur VBA mais sans solution.
J'ai donc une base de données en feuille 2 d'excel avec en Colonne A des dates allant sur 10 ans de la ligne 3 à 2612 ( du 20/08/1999 au 20/08/2009). En suite j'ai en colonne B le prix d'un action et en colonne C son volume, commencant en ligne3. Ceci pour 257 actions, Action 2, prix en colonne D et volume en colonne E... ceci allant jusque qu'en colonne 515. En colonne 516 , j'ai un taux quotidien commençant en ligne 3 appelé Rf, pour charque jour jusqu'en ligne2612.
Je souhaite effectuer des boucles pour un ratio dit de Sharpe.
Le numérateur se décompose en 2/ La première partie est appelé le retour de l'action qui est le prix en t - le prix en t-1 divisé par le prix en t-1 ceci pour tours les jours (tt les lignes). La deuxième partie est le Rf à soustrait du retour du jour. Soit pour l'action , le retour du 23 aout - le Rf du 23 aout ...La somme de ses soustractions se divise par le nombre de jour dans le mois (qui varient selon les mois) afin d'obtenir un numérateur mensuel.
Une fois le numérateur d'aout obtenu par example, il faut le divisé par la standard deviation des retour du mois en questions afin d'obtenir le fameux ratio de Sharpe pour aout... Si je m'explique bien il ya donc pour 10 ans, 120 ratios pour 1 action et ceci pour 257 actions. ( Le volume n'intervient pas dans ce ratio)
J'espère pas trop mal m'expliquer. Je joins le code actuel qui ne marche pas du à une erreur de tableau ou de count qui me donne des ratios erronés.
Function StdDev(ByVal k As Long, Arr() As Single)
Dim i As Integer
Dim avg As Single, SumSq As Single
avg = Mean(k, Arr)
For i = 1 To k
SumSq = SumSq + (Arr(i) - avg) ^ 2
Next i
StdDev = Sqr(SumSq / (k - 1))
End Function
Function Mean(ByVal k As Long, Arr() As Single)
Dim Sum As Single
Dim i As Integer
Sum = 0
For i = 1 To k
Sum = Sum + Arr(i)
Next i
Mean = Sum / k
End Function
Private Sub MiseAZero(Row_Dest As Integer)
prix_column = 2
Do While (prix_column <= 515)
Feuil7.Cells(Row_Dest, prix_column) = 0
prix_column = prix_column + 2
Loop
End Sub
Sub Feuil3_Bouton2_Clic()
i = 1
J = 1
prix_row = 4
prix_column = 2
volume_row = 4
volume_column = 3
Row = 3
Column = 1
Row_Dest = 3
Month_XLS = ""
Month_XLS = Right(Feuil2.Cells(Row, Column), 7)
Feuil7.Cells(Row_Dest, Column) = Month_XLS
Do While (prix_column <= 515)
Feuil7.Cells(1, prix_column) = Feuil2.Cells(1, prix_column)
Feuil7.Cells(2, prix_column) = Split(Feuil2.Cells(2, prix_column), "(" )
Feuil7.Cells(Row_Dest, prix_column) = 0
prix_column = prix_column + 2
Loop
Count = 0
Row = Row + 1
Deb = Row
Do While (Row <= 2612)
Month_XLS = Right(Feuil2.Cells(Row, Column), 7)
If (Month_XLS <> Right(Feuil7.Cells(Row_Dest, Column), 7)) Then
prix_column = 2
Do While (prix_column <= 515)
J = 1
L = Deb
Dim MonTab(1 To 1000) As Single
Do While (J <= Count)
MonTab(J) = Feuil8.Cells(L, prix_column)
J = J + 1
L = L + 1
Loop
Ret = StdDev(Count, MonTab)
If (Ret <> 0) Then Feuil7.Cells(Row_Dest, prix_column) = (Feuil7.Cells(Row_Dest, prix_column) / Count) / Ret
prix_column = prix_column + 2
Loop
Count = 0
Deb = Row
Row_Dest = Row_Dest + 1
MiseAZero (Row_Dest)
Feuil7.Cells(Row_Dest, Column) = Month_XLS
End If
Count = Count + 1
prix_column = 2
volume_column = 3
Do While (prix_column <= 10)
If ((Not IsEmpty(Feuil2.Cells(prix_row - 1, prix_column))) And (Not IsEmpty(Feuil2.Cells(prix_row, prix_column))) And (Not IsEmpty(Feuil2.Cells(volume_row, volume_column))) And (Feuil2.Cells(volume_row, volume_column) <> 0)) Then
retour = (Feuil2.Cells(prix_row, prix_column) - Feuil2.Cells(prix_row - 1, prix_column)) / Feuil2.Cells(prix_row - 1, prix_column)
Feuil7.Cells(Row_Dest, prix_column) = Feuil7.Cells(Row_Dest, prix_column) + retour - (Feuil2.Cells(prix_row, 516) / 100)
Feuil8.Cells(prix_row, prix_column) = retour
Feuil8.Cells(prix_row, prix_column + 1) = Feuil2.Cells(prix_row, 516) / 100
End If
prix_column = prix_column + 2
volume_column = volume_column + 2
Loop
prix_row = prix_row + 1
volume_row = volume_row + 1
Row = Row + 1
Loop
End Sub
Je vous remercie à l'avance de votre aide.