VBA Stdev variable sharpe ratio

VBA Stdev variable sharpe ratio - VB/VBA/VBS - Programmation

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.

Reply

Marsh Posté le 04-10-2009 à 18:59:34   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed