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 :

Macro erreur OBPI VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Février 2018
    Messages : 7
    Par défaut Macro erreur OBPI VBA
    Bonjour,
    voulant effectuer la macro suivante (simulation OBPI) un message d'erreur s'affiche, quand au dépassement de capacité au niveau de : d1 = (Log(Spot / Strike) + (rf + Sigma ^ 2 / 2) * Echéance) / (Sigma * Sqr(Dist_Echéance))
    d2 = d1 - Sigma * Sqr(Echéance)
    sauriez vous m'aider s'il vous plait ? (je suis preneuse de toute amélioration de ce code, et toute explications lié, merci beaucoup ! )

    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
    Sub OBPI()
     
    Option Base 1
    Dim rf As Double, S0 As Double, Mu As Double, Sigma As Double, Plancher As Double
    Dim Plancher As Double, dT As Double, Nb_Points As Double, simulations As Double
    Dim Position_Actions As Double, Valorisation_Position As Double, beta As Double
     
        S0 = 100
        Mu = 0.08
        Sigma = 0.3
     
        rf = 0.03
     
        Plancher = 80
        plancher = Deter_Strike(S0, Plancher, rf, Sigma, 1, Plancher / 100)
     
        Nb_Points = 252
        dT = 1 / Nb_Points
        Simulations = 1000
     
        ReDim Performance(Simulations, 2) As Double
     
        For i = 1 To Simulations
     
            Spot = S0
            Echéance = 1
            beta = Proportion_Actions(Spot, Plancher, rf, Sigma, Echéance)
     
            Position_Actions = beta * S0
            Position_sansrisque = (1 - beta) * S0
     
            For j = 1 To Nb_Points
     
                Taux_Rentabilite = Taux_Rentabilite_Action(Mu, Sigma, dT)
                Spot = Spot * Exp(Taux_Rentabilite)
                Valorisation_Position = Position_Actions * Exp(Taux_Rentabilite) + Position_sansrisque * Exp(rf * dT)
                Echéance = WorksheetFunction.Max(Echéance - dT, 1E-08)
                beta = Proportion_Actions(Spot, Plancher, rf, Sigma, Echéance)
                Position_Actions = beta * Valorisation_Position
                Position_sansrisque = (1 - beta) * Valorisation_Position
     
            Next j
     
     
            Performance(i, 2) = Valorisation_Position  
            Performance(i, 1) = Spot          
    Next i
        Range("A1:B1000").Value = Performance
    End Sub
    Function Deter_Strike(S, K, R, Sigma, T, proportion_garde)
        epsilon = 1E-15
        Do
            d1 = (Log(S / K) + (R + 0.5 * Sigma ^ 2) * T) / (Sigma * Sqr(T))
            d2 = d1 - Sigma * Sqr(T)
            K = (-proportion_garde * (S + BS_STD("Put", S, K, R, Sigma, T)) + K * proportion_garde * Exp(-R * T) * Nd(-d2)) / _
            (proportion_garde * Exp(-R * T) * Nd(-d2) - 1)
            erreur = proportion_garde * (S + BS_STD("Put", S, K, R, Sigma, T)) - K
        Loop Until Abs(erreur) < epsilon
        Deter_Strike = K
    End Function
    Function Taux_Rentabilite_Action(Mu, Sigma, dT)
        epsilon = WorksheetFunction.NormSInv(Rnd)
        Taux_Rentabilite_Action = (Mu - Sigma ^ 2 / 2) * dT + Sigma * epsilon * Sqr(dT)
    End Function
    Function Proportion_Actions(Spot, Strike, rf, Sigma, Echéance)
        d1 = (Log(Spot / Strike) + (rf + Sigma ^ 2 / 2) * Echéance) / (Sigma * Sqr(Dist_Echéance))
        d2 = d1 - Sigma * Sqr(Echéance)
        Proportion_Actions = Spot * Nd(d1) / (Spot * Nd(d1) + Strike * Exp(-rf * Echéance) * Nd(-d2))
    End Function
    Function BS_STD(TypeOption, S, K, R, Sigma, T)
        d1 = (Log(S / K) + (R + 0.5 * Sigma ^ 2) * T) / _
        (Sigma * Sqr(T))
        d2 = d1 - Sigma * Sqr(T)
        Z = Switch(TypeOption)
        BS_STD = Z * (S * Nd(Z * d1) - K * Exp(-R * T) * Nd(Z * d2))
    End Function
    Function Nd(d)
        Nd = WorksheetFunction.NormSDist(d)
    End Function
    Function Switch(TypeOption)
        TypeOption = UCase(TypeOption)
        If TypeOption = "C" Or TypeOption = "CALL" Then
            Switch = 1
        Else
            Switch = -1
        End If
    End Function

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Dist_Echéance n'était rien du tout (ni déclaré, ni instancié), tu aboutis à une division par 0

    ce n'est pas la variable Echéance que tu voulais utiliser ? Si non, alors affecte une valeur à Dist_Echéance

    Au passage, tu as déclaré deux fois la variable Plancher
    Option Base 1 doit être placé tout en haut du module, pas au sein d'une procédure

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Février 2018
    Messages : 7
    Par défaut
    Bonsoir @joe.levrai
    Tout d'abord merci de votre réponse,
    Il se trouve que dist-Echeance et Echeance sont les mêmes paramètres, que dois je donc mettre ?
    Certes, il y a une erreur, mais il y a bien deux variables planchers, celle définie par 80 et celle définie par la formule (qui définie enfaite un strike) la macro de base est enfaite celui ci dessous (cf : http://fabriceriva.com/books/books.html : corrigé exercice 1 chapitre 8 : applications financière) cependant celui ci fonctionne dans l'excel de l'exercice mais ne fonctionne pas si je le copie colle dans un excel vierge, il me semble étrange par ailleurs qu'aucune des variables ne soient déclarées.
    J'en profite pour vous demander si vous sauriez comment je pourrais, pour chacune des questions afficher le résultats (donc le résultat du beta, celui du strike, de la proportion en action etc.) ?
    Merci beaucoup !!


    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
    Option Base 1
     
     
    Sub OBPI()
     
        S0 = 100
        mu = 0.08
        sigma = 0.37
     
        rf = 0.03
     
        Plancher = 80
        Strike_Plancher = Deter_Strike(S0, Plancher, rf, sigma, 1, Plancher / 100)
     
        Nb_Points = 252
        dt = 1 / Nb_Points
        Nb_Simuls = 1000
     
        ' ReDim Perf(Nb_Simuls, 1) As Double      ligne d'origine
        ReDim Perf(Nb_Simuls, 2) As Double      ' ligne modifiée
     
        For i = 1 To Nb_Simuls
     
            Spot = S0
            Dist_Echéance = 1
            alpha = Prop_Actions(Spot, Strike_Plancher, rf, sigma, Dist_Echéance)
     
            Position_Actions = alpha * S0
            Position_Obligs = (1 - alpha) * S0
     
            For j = 1 To Nb_Points
     
                Taux_Renta = Taux_Renta_Action(mu, sigma, dt)
                Spot = Spot * Exp(Taux_Renta)
                Valo_Position = Position_Actions * Exp(Taux_Renta) + Position_Obligs * Exp(rf * dt)
                Dist_Echéance = WorksheetFunction.Max(Dist_Echéance - dt, 1E-08)
                alpha = Prop_Actions(Spot, Strike_Plancher, rf, sigma, Dist_Echéance)
                Position_Actions = alpha * Valo_Position
                Position_Obligs = (1 - alpha) * Valo_Position
     
            Next j
     
     
            Perf(i, 2) = Valo_Position  ' pour tracer un graphique de la valeur de la position contre la valeur
            Perf(i, 1) = Spot           ' du spot, il est plus aisé d'avoir le spot en colonne 1 et la position
                                        ' en colonne 2
        Next i
        Range("A1:B1000").Value = Perf
    End Sub
    Function Deter_Strike(S, K, r, sigma, T, prop_gar)
        epsilon = 1E-15
        Do
            d1 = (Log(S / K) + (r + 0.5 * sigma ^ 2) * T) / (sigma * Sqr(T))
            d2 = d1 - sigma * Sqr(T)
            K = (-prop_gar * (S + BS_STD("Put", S, K, r, sigma, T)) + K * prop_gar * Exp(-r * T) * Nd(-d2)) / _
            (prop_gar * Exp(-r * T) * Nd(-d2) - 1)
            erreur = prop_gar * (S + BS_STD("Put", S, K, r, sigma, T)) - K
        Loop Until Abs(erreur) < epsilon
        Deter_Strike = K
    End Function
    Function Taux_Renta_Action(mu, sigma, dt)
        epsilon = WorksheetFunction.NormSInv(Rnd)
        Taux_Renta_Action = (mu - sigma ^ 2 / 2) * dt + sigma * epsilon * Sqr(dt)
    End Function
    Function Prop_Actions(Spot, Strike_Plancher, rf, sigma, Dist_Echéance)
        d1 = (Log(Spot / Strike_Plancher) + (rf + sigma ^ 2 / 2) * Dist_Echéance) / (sigma * Sqr(Dist_Echéance))
        d2 = d1 - sigma * Sqr(Dist_Echéance)
        Prop_Actions = Spot * Nd(d1) / (Spot * Nd(d1) + Strike_Plancher * Exp(-rf * Dist_Echéance) * Nd(-d2))
    End Function
    Function BS_STD(TypeOption, S, K, r, sigma, T)
        d1 = (Log(S / K) + (r + 0.5 * sigma ^ 2) * T) / _
        (sigma * Sqr(T))
        d2 = d1 - sigma * Sqr(T)
        Z = Switch(TypeOption)
        BS_STD = Z * (S * Nd(Z * d1) - K * Exp(-r * T) * Nd(Z * d2))
    End Function
    Function Nd(d)
        Nd = WorksheetFunction.NormSDist(d)
    End Function
    Function Switch(TypeOption)
        TypeOption = UCase(TypeOption)
        If TypeOption = "C" Or TypeOption = "CALL" Then
            Switch = 1
        Else
            Switch = -1
    Citation Envoyé par joe.levrai Voir le message
    Bonjour,

    Dist_Echéance n'était rien du tout (ni déclaré, ni instancié), tu aboutis à une division par 0

    ce n'est pas la variable Echéance que tu voulais utiliser ? Si non, alors affecte une valeur à Dist_Echéance

    Au passage, tu as déclaré deux fois la variable Plancher
    Option Base 1 doit être placé tout en haut du module, pas au sein d'une procédure

Discussions similaires

  1. Traitement d'erreur dans VBA
    Par charleshbo dans le forum VBA Access
    Réponses: 9
    Dernier message: 10/02/2006, 14h03
  2. Prob pour exporter une macro en code VBA
    Par electrosat03 dans le forum Access
    Réponses: 6
    Dernier message: 04/02/2006, 19h15
  3. Une macro synthese en VBA sous excel!
    Par max2245 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 27/12/2005, 20h37
  4. Récupération d'erreur en VBA
    Par User dans le forum Access
    Réponses: 3
    Dernier message: 13/09/2005, 17h08

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