IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

MaxDrawDown en VBA


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 1
    Par défaut MaxDrawDown en VBA
    Bonjour,

    j'ai un petit soucis pour créer mon algo de maxdrawdown. Le max drawdown en finance c'est la plus grosse chute (en %) qu'ait connu un portefeuille sur une période donnée.
    J'ai donc donc une colonne L (L est la 12eme lettre de l'alphabet) sur laquelle s'étendent, à partir de la ligne 2 de mon excel, une multitude cellules ayant différentes valeurs.
    Je dois procéder de la sorte:
    1) Trouver la cellule ayant la plus faible valeur de ma colonne (via une boucle par exemple). On la nommera "min"
    2) Faire une autre boucle allant de la première cellule de ma colonne jusqu'à cette même cellule déterminée précédemment
    3) Trouver via cette dernière boucle la cellule ayant la valeur la plus grande valeur comprise entre la première cellule de ma colonne et la cellule ayant la plus faible valeur de ma colonne. On nommera cette cellule "max".
    4) Appliquer le Maximum DrawDown, à savoir une variable "MDD" qui soit égale à (min-max)/min
    5) Le tout, SANS APPLIQUER DE FONCTION du style Application.max ou même End(xlUp).Row, uniquement avec de simples boucles.
    6) Mon algo:

    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
    Sub MDD()
     
    Dim i As Integer
    Dim ligne As Integer
    Dim min As Long
    Dim max As Long
    Dim f As Range
     
    Set f = ThisWorkbook.Worksheets("Données de marché")
     
    i = 2
    While (f.Cells(i, 14).Value <> "")
     
        If f.Cells(i + 1, 14).Value < f.Cells(i, 14).Value Then
            min = f.Cells(i + 1, 14).Value
            i = i + 1
        Else
            i = i + 1.  // le problème c'est que si je tombe sur une cellule de valeur 4 qui est inférieure à celle du dessus
        Next.           // de valeur 5, mais qu'il existe une valeur min précédente inférieure à 4, alors ça marche pas
     
    Wend.    
     
    // de ce même problème je n'arrive pas non plus à trouver le max
     
    MDD = (min-max)/min
    End Sub
    Si quelqu'un peut m'aider, je l'en remercie infiniment par avance

  2. #2
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 374
    Par défaut
    Bonjour,

    Une façon de faire, laquelle tient compte du fait que le MDD doit se calculer sur une période glissante:
    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
    Option Explicit
     
    Public Function MDD(n As Long, c As Range) As Variant
        '--- n = nombre de données = longueur période
        '--- c = cellule de départ
        Dim kR As Long
        Dim vMin1 As Single, vMax1 As Single, dd1 As Single
        Dim vMin2 As Single, vMax2 As Single, dd2 As Single
        kR = c.Row
        vMin1 = c:  vMax1 = c:  dd1 = 0
        vMin2 = c:  vMax2 = c:  dd2 = 0
        For kR = 1 To n
            If c.Offset(kR, 0) = "" Then
                MDD = "#"
                Exit Function
            End If
            If c.Offset(kR, 0) < vMin1 Then
                '--- la baisse continue
                vMin1 = c.Offset(kR, 0)
                dd1 = vMax1 - vMin1
            ElseIf c.Offset(kR, 0) > vMax1 Then
                '--- remonté plus haut que le plus haut précédent
                If dd1 >= dd2 Then
                    '--- DD en cours plus grand que le précédent
                    vMin2 = vMin1
                    vMax2 = vMax1
                    dd2 = dd1
                    vMin1 = c.Offset(kR, 0)
                    vMax1 = vMin1
                End If
            Else
                '--- rien, navigue entre vMin1 et vMax1
            End If
        Next kR
        If dd2 <= dd1 Then
            MDD = -dd1 / vMin1
        Else
            MDD = -dd2 / vMin2
        End If
    End Function
    A comprendre et vérifier, et si nécessaire corriger avant d'utiliser !
    Cordialement.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Maxdrawdown fonction vba
    Par itfashiongirl dans le forum Général VBA
    Réponses: 1
    Dernier message: 22/02/2018, 19h07
  2. [VBA-E] [Excel] Lancer une macro à une heure donnée
    Par Lysis dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/10/2002, 12h15
  3. [VBA-E] [Excel] Tri automatique
    Par bovi dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/10/2002, 10h19
  4. [VBA-E] [Excel] Filtrer le donnees d'une sheet
    Par donia dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/09/2002, 10h55
  5. problème avec VBA
    Par Delph dans le forum Langage
    Réponses: 2
    Dernier message: 19/08/2002, 13h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo