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 :

Excel plante lors de l'execution de ma simulation


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 9
    Par défaut Excel plante lors de l'execution de ma simulation
    Bonjour,

    Après une multitude d'essai, au moment d'exécuter ma simulation excel beug et après quelques minutes se ferme. Il ne m'indique aucune erreur donc je ne sais pas ou est le problème.

    J'ai bien déclaré toutes les variables, vérifié les formules et toujours le même résultat... J'ai essayé d'un autre pc et mm résultat

    voici le code :

    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
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    Option Explicit
    Sub obpi()
    Dim Nb_Points As Integer, Plancher As Integer, i As Integer, j As Integer
    Dim rf As Double, S0 As Double, Mu As Double, Sigma As Double
    Dim Strike_Plancher As Double, dT As Double, Nb_Simuls As Double, spot As Double
    Dim Position_Actions As Double, Valo_Position As Double, alpha As Double, Dist_Echéance As Double
    Dim Position_Obligs As Double, Taux_Renta As Double
     
        'Paramétrage du sous-jacent
        S0 = 100
        Mu = -0.08
        Sigma = 0.35
     
        'Monétaire
        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
     
        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, 0.00000001)
                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, 1) = Valo_Position
        Next i
    End Sub
     
    Function Deter_Strike(S, K, R, Sigma, T, prop_gar)
    Dim epsilon As Integer
    Dim d1 As Double, d2 As Double, erreur As Double
     
        epsilon = WorksheetFunction.NormSInv(Rnd)
        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)
    Dim epsilon As Double
        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)
    Dim d1 As Double, d2 As Double
        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)
    Dim d1 As Double, d2 As Double, z As Double
        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
    Merci d'avance pour votre aide

  2. #2
    pgz
    pgz est déconnecté
    Expert confirmé Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Par défaut
    Bonjour.

    En tête du ou des modules, tu mets Tu fais une compilation.
    Si tu ne détectes toujours pas d'anomalie, mets des points d'arrêts ou exécute en pas à pas pour trouver à quel endroit cela coince.

    Cordialement,

    PGZ

  3. #3
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Tu peux aussi interrompre l'exécution en pesant sur les touches CTRL-PAUSE pour voir où ca bloque. Puis utilise F8 pour avancer pas à pas.

    Utilise aussi la commande Debug.Print pour voir la progression.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For i = 1 To Nb_Simuls
    Debug.Print "i= "; i

  4. #4
    Membre Expert

    Homme Profil pro
    Spécialiste progiciel
    Inscrit en
    Février 2010
    Messages
    1 747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Spécialiste progiciel
    Secteur : Service public

    Informations forums :
    Inscription : Février 2010
    Messages : 1 747
    Par défaut
    Bonjour,

    Tu fais une boucle sur j
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        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, 0.00000001)
    alpha = Prop_Actions(spot, Strike_Plancher, rf, Sigma, Dist_Echéance)
    Position_Actions = alpha * Valo_Position
    Position_Obligs = (1 - alpha) * Valo_Position
            Next j
    Mais sauf erreur de ma part, tu n'utilises pas j, est-ce voulu ou une erreur?
    Je ne connais pas assez bien ta simulation pour savoir si c'est volontaire ou non.

  5. #5
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Diminue le nombre Nb_Simuls (au lieu de 1000, commence par 50 ou 100)

    Edit: en déclarant convenablement les variables et en réduisant de moitié le Nb_Simuls, le code passe (voir réponse d'après)

  6. #6
    Membre expérimenté
    Inscrit en
    Février 2008
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 208
    Par défaut
    Bonjour

    Essaye de recopier ton code dans un nouveau classeur.
    Je l'ai fait et ton code fonctionne chez moi.
    J'ai ajouté une ligne pour contrôler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Perf(i, 1) = Valo_Position
    cells(i, 1) = Valo_Position
    à plus

  7. #7
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 9
    Par défaut
    pgz : j'ai déjà mis en début de mon module "option explicit"

    Docmarti :

    il me semble ke le blockage est a ce niveau la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # Function Nd(d)
    Nd = WorksheetFunction.NormSDist(d)
    End Function
    mais je ne sais que faire

    carden752 : en faite j'ai fait une simulation sur un même style de produit et le code de ce dernier fonctionne très bien, je suis partie sur les mêmes bases pour ce produit donc je ne pense pas que le problème provienne de la boucle (après je ne m'y connait pas trop)

    Effectivement en diminuan le nombre de simulation une colonne saffiche, je pense kil y a d'autre erreur dans le code mais déjà ca ne plante plus

    merciiiiiiii

  8. #8
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Essaies comme ceci
    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
    88
    89
    90
    Sub OBPI()
    Dim Strike_Plancher As Double, dT As Double, Nb_Simuls As Double, pPlanch As Double
    Dim Rf As Double, So As Double, Mu As Double, Sigma As Double, Spot As Double
    Dim Taux_Renta As Double, Dist_Echeance As Double, Valo_Position As Double
    Dim Position_Obligs As Double, Position_Actions As Double, Alpha As Double
    Dim Nb_Points As Integer, Plancher As Integer, i As Integer, j As Integer
    Dim perf() As Double
     
    'Paramétrage du sous-jacent
    So = 100: Mu = -0.08: Sigma = 0.35
    'Monétaire
    Rf = 0.03: Plancher = 80
    pPlanch = Plancher / 100
    Strike_Plancher = Deter_Strike(So, Plancher, Rf, Sigma, 1, pPlanch)
     
    Nb_Points = 252: Nb_Simuls = 500
    dT = 1 / Nb_Points
     
    ReDim perf(1 To Nb_Simuls, 1 To 1)
    For i = 1 To Nb_Simuls
        Spot = So
        Dist_Echeance = 1
        Alpha = Prop_Actions(Spot, Strike_Plancher, Rf, Sigma, Dist_Echeance)
        Position_Actions = Alpha * So
        Position_Obligs = (1 - Alpha) * So
        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_Echeance = WorksheetFunction.Max(Dist_Echeance - dT, 0.00000001)
            Alpha = Prop_Actions(Spot, Strike_Plancher, Rf, Sigma, Dist_Echeance)
            Position_Actions = Alpha * Valo_Position
            Position_Obligs = (1 - Alpha) * Valo_Position
        Next j
        perf(i, 1) = Valo_Position
    Next i
    Sheets("Feuil2").Range("A2:A" & Nb_Simuls + 1) = perf
    MsgBox "Terminé"
    End Sub
     
    Function Deter_Strike(ByVal S As Double, ByVal K As Double, ByVal R As Double, ByVal Sigma As Double, ByVal T As Double, ByVal Prop_Gar) As Double
    Dim Epsilon As Double, D1 As Double, D2 As Double, Erreur As Double
     
    Randomize
    Epsilon = Abs(WorksheetFunction.NormSInv(Rnd))
    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(ByVal Mu As Double, ByVal Sigma As Double, ByVal dT As Double) As Double
    Dim Epsilon As Double
     
    Epsilon = WorksheetFunction.NormSInv(Rnd)
    Taux_Renta_Action = (Mu - Sigma ^ 2 / 2) * dT + Sigma * Epsilon * Sqr(dT)
    End Function
     
    Function Prop_Actions(ByVal Spot As Double, ByVal Strike_Plancher As Double, ByVal Rf As Double, ByVal Sigma As Double, ByVal Dist_Echeance As Double) As Double
    Dim D1 As Double, D2 As Double
     
    D1 = (Log(Spot / Strike_Plancher) + (Rf + Sigma ^ 2 / 2) * Dist_Echeance) / (Sigma * Sqr(Dist_Echeance))
    D2 = D1 - Sigma * Sqr(Dist_Echeance)
    Prop_Actions = Spot * Nd(D1) / (Spot * Nd(D1) + Strike_Plancher * Exp(-Rf * Dist_Echeance) * Nd(-D2))
    End Function
     
    Function BS_STD(ByVal TypeOption As String, ByVal S As Double, ByVal K As Double, ByVal R As Double, ByVal Sigma As Double, ByVal T As Double) As Double
    Dim D1 As Double, D2 As Double
    Dim z As Integer
     
    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(ByVal d As Double) As Double
     
    Nd = WorksheetFunction.NormSDist(d)
    End Function
    Function Switch(ByVal TypeOption As String) As Integer
     
    If UCase(TypeOption) = "C" Or UCase(TypeOption) = "CALL" Then
        Switch = 1
    Else
        Switch = -1
    End If
    End Function

  9. #9
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 9
    Par défaut
    Effectivement le code fonctionne et ceux même avec 500 simulations

    merci pr tous

  10. #10
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    En pesant sur F8 (pas à pas) tu aurais vu que ton code tournais en rond quand la variable epsilon était <= 0
    à cause de la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Epsilon = WorksheetFunction.NormSInv(Rnd)
    Ce qui peut être corrigé comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Epsilon = WorksheetFunction.NormSInv(Rnd)
    While Epsilon <= 0
     Epsilon = Abs(WorksheetFunction.NormSInv(Rnd))
    Wend

  11. #11
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 9
    Par défaut
    oui j'ai vu qu'il y avai un souci mais en fait après g mis "randomize" a ce niveau la et tout fonctionne après j'ai juste des soucis dans mes formules

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 08/06/2009, 15h38
  2. probleme de lenteur lors de l'execution d'une macro sous excel
    Par smartbis dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/05/2007, 08h49
  3. Erreur lors de l'execution d'un script jsp
    Par tuxor dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 06/08/2004, 12h35
  4. erreur "ORA-22905" lors de l'execution d'un requet
    Par benji999 dans le forum Administration
    Réponses: 26
    Dernier message: 14/04/2004, 11h47
  5. [langage] Passage de parametre lors de l execution
    Par WetzlarMan dans le forum Langage
    Réponses: 4
    Dernier message: 16/03/2004, 13h28

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