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 :

Programmation Prix d'une obligation et d'un put


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 2
    Par défaut Programmation Prix d'une obligation et d'un put
    Bonjour,

    Nous sommes un groupe projet et devons réaliser un programme VBA permettant de calculer la valeur d'une obligation et d'un put d'une obligation zéro coupon. Nous avons désespéremment tenter de programmer les formules dans VBA mais nous n'en maitrisons pas assez les outils pour y parvenir.

    Pour le moment nous possédons uniquement le brouillon suivant qui ne fonctionne pas.


    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
    Option Explicit
     
     
    Public Function b(u, k)
     
    b = (1 / k) * (1 - Exp(-k * u))
     
    End Function
     
    Public Function rt(k, t)
    Call b
    rt = (0.025 * Exp(-k * t)) + (k * 0.052 * b(t, k)) + ((0.017 * b(t, 2 * k) ^ (1 / 2)) * WorksheetFunction.NormSDist(t))
    End Function
     
    Public Function P(t, J, k)
    Cal rt
    Call b
    P = Exp(-b(J - t, k) * rt(k, t) - ((0.017 ^ 2) / (4 * k)) * (b(J - t, k) ^ 2) + (0.052 - ((0.017 ^ 2) / (2 * k ^ 2)) * (b(J - t, k) - (J - t))))
     
     
    End Function
     
     
    Public Function o(Jp, Jz, k, t)
    Call b
     
    o = (0.017 * b(Jp - t, 2 * k) ^ 1 / 2) * b(Jz - Jp, k)
     
    End Function
     
     
     
    Public Function h(Jz, Jp, k, t, W)
    h = (1 / o(Jp, Jz, k, t)) * (Log((P(t, Jz, k)) / (W * P(t, Jp, k))) + ((1 / 2) * o(Jp, Jz, k, t) ^ 2))
     
    End Function
     
     
    Public Function V(Jp, Jz, k, t, W)
    Call P
    Call h
    V = (W * P(t, Jp, k) * WorksheetFunction.NormSDist(o(Jp, Jz, k, t) - h(Jz, Jp, k, t, W))) - (P(t, Jz, k) * WorksheetFunction.NormSDist(-h(Jz, Jp, k, t, W)))
     
     
    End Function
    Si quelqu'un pouvais nous dépanner, ca serait très appréciable.
    Nous vous remercions par anticipation!!!
    Images attachées Images attachées

  2. #2
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Par défaut
    Bonjour et bienvenue sur ce forum,

    En préalable, mettez votre code entre les balises de code en cliquant l'icône #.

    Votre code ne pourrait fonctionner dans la mesure où il débute par Option Explicit, ce qui est très prudent pour éviter des erreurs d'utilisation des varibles mais ce qui implique que celle-ci soient déclarées selon leur type.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Function b(u as Long, k as Long) as Long
    Dim k as Long, 
      b = (1 / k) * (1 - Exp(-k * u))
    End Function
    Revenez vers nous après avoir effectué cette formalité.

    Cdlmt

  3. #3
    Nouveau candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 2
    Par défaut Suite
    Bonjour,

    Voici le code avec les modifications effectuées en espérant que cela étaient celles attendues.

    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
     
    Option Explicit
     
     
    Public Function b(u As Double, k As Double) As Double
    Dim k As Double
    Dim u As Double
     
    b = (1 / k) * (1 - Exp(-k * u))
     
    End Function
     
    Public Function rt(k As Double, t As Double) As Double
    Dim k As Double
    Dim t As Double
    Call b
     
    rt = (0.025 * Exp(-k * t)) + (k * 0.052 * b(t, k)) + ((0.017 * b(t, 2 * k) ^ (1 / 2)) * WorksheetFunction.NormSDist(t))
    End Function
     
    Public Function P(t As Double, J As Double, k As Double) As Double
    Dim t As Double
    Dim J As Double
    Dim k As Double
    Call b
    Call rt
     
    P = Exp(-b(J - t, k) * rt(k, t) - ((0.017 ^ 2) / (4 * k)) * (b(J - t, k) ^ 2) + (0.052 - ((0.017 ^ 2) / (2 * k ^ 2)) * (b(J - t, k) - (J - t))))
     
     
    End Function
     
     
    Public Function o(Jp As Double, Jz As Double, k As Double, t As Double) As Double
    Dim Jp As Double
    Dim Jz As Double
    Dim k As Double
    Dim t As Double
     
    Call k
     
    o = (0.017 * b(Jp - t, 2 * k) ^ 1 / 2) * b(Jz - Jp, k)
     
    End Function
     
     
     
    Public Function h(Jz As Double, Jp As Double, k As Double, t As Double, W As Double) As Double
    Dim Jz As Double
    Dim Jp As Double
    Dim t As Double
    Dim W As Double
     
    Call o
    Call P
     
    h = (1 / o(Jp, Jz, k, t)) * (Log((P(t, Jz, k)) / (W * P(t, Jp, k))) + ((1 / 2) * o(Jp, Jz, k, t) ^ 2))
     
    End Function
     
     
    Public Function V(Jp As Double, Jz As Double, k As Double, t As Double, W As Double) As Double
    Dim Jp As Double
    Dim Jz As Double
    Dim k As Double
    Dim t As Double
    Dim W As Double
     
    Call P
    Call o
    Call h
     
    V = (W * P(t, Jp, k) * WorksheetFunction.NormSDist(o(Jp, Jz, k, t) - h(Jz, Jp, k, t, W))) - (P(t, Jz, k) * WorksheetFunction.NormSDist(-h(Jz, Jp, k, t, W)))
     
     
    End Function

  4. #4
    Invité
    Invité(e)
    Par défaut
    Salut,

    Un exemple de code reprend votre travail:
    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
    Option Explicit
     
    Private ro#
    Private k#
    Private teta#
    Private sigma#
     
    Private Sub Main()
     
      Dim Tp#, t1#, t2#, t3#, t4#
      Dim k1#, k2#, k3#, k4#
      Dim v1#, v2#, v3#, v4#
     
      ro = 0.025:  teta = 0.052:  k = 0.181:  sigma = 0.017
      Tp = 1: t1 = 0.5: t2 = 1: t3 = 1.5: t4 = 2
     
      k1 = P(0, Tp + t1) / P(0, Tp)
      k2 = P(0, Tp + t2) / P(0, Tp)
      k3 = P(0, Tp + t3) / P(0, Tp)
      k4 = P(0, Tp + t4) / P(0, Tp)
     
      Debug.Print (k1 & " " & k2 & " " & k3 & " " & k4)
     
      v1 = V(0, Tp, Tp + t1, k1)
      v2 = V(0, Tp, Tp + t2, k2)
      v3 = V(0, Tp, Tp + t3, k3)
      v4 = V(0, Tp, Tp + t4, k4)
     
      Debug.Print (v1 & " " & v2 & " " & v3 & " " & v4)
     
    End Sub
     
    Private Function b(ByVal u#, ByVal k#) As Double
      b = 1 / k * (1 - Exp(-k * u))
    End Function
     
    Private Function rt(ByVal t#) As Double
      rt = ro * Exp(-k * t) + _
           k * teta * b(t, k) + _
           sigma * b(t, 2 * k) ^ (1 / 2) * Application.WorksheetFunction.NormSDist(t)
    End Function
     
    Private Function P(ByVal t#, ByVal J#) As Double
      P = Exp( _
                -b(J - t, k) * rt(t) - _
                sigma ^ 2 / (4 * k) * b(J - t, k) ^ 2 + _
                (teta - sigma ^ 2 / (2 * k ^ 2)) * (b(J - t, k) - (J - t)) _
              )
    End Function
     
    Private Function o(ByVal t#, ByVal Tp#, ByVal Jz#) As Double
      o = sigma * b(Tp - t, 2 * k) ^ (1 / 2) * b(Jz - Tp, k)
    End Function
     
    Private Function h(ByVal t#, ByVal Tp#, ByVal Jz#, ByVal W#) As Double
      h = 1 / o(t, Tp, Jz) * (Log(P(t, Jz) / (W * P(t, Tp))) + _
          1 / 2 * o(t, Tp, Jz) ^ 2)
    End Function
     
    Private Function V(ByVal t#, ByVal Tp#, ByVal Jz#, ByVal W#) As Double
      V = W * P(t, Tp) * Application.WorksheetFunction.NormSDist(o(t, Tp, Jz) - h(t, Tp, Jz, W)) - _
          P(t, Jz) * Application.WorksheetFunction.NormSDist(h(t, Tp, Jz, W))
    End Function
    Par contre les formules sont à vérifier car les valeurs des 'puts' obtenues semblent fausses.

  5. #5
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Par défaut
    Je ne connais rien à votre problème et je pars donc du principe que les formules sont justes.

    Côté programmation, il y a quelques modifications à faire.

    Une fonction renvoie une valeur à une variable en fonction des paramètres qui lui sont passés. C'est la raison pour laquelle on lui donne le plus souvent un nom "parlant" comme Function CalculRendement(Capital as Long, Interet as Double, Durée as Double) as Double.
    "Call b" ne fera donc rien niaucun des autres "Call".

    Mais bien Deuxième remarque, le mot clé "Public est inutile" puisque tout le code est dans le même module.

    Enfin, vous n'utilisez que des fonctions qui en appellent d'autres.
    Il manque une procédure Sub qui exploiterait le résultat final. du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub ShowResult()
    Dim Solution as Double
      Solution = DerniereFonction(Parametre1, Parametre2)
      MsgBox Solution
    End Sub

  6. #6
    Membre Expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 871
    Billets dans le blog
    1
    Par défaut
    Bonsoir,

    Je suis tout à fait d'accord avec defluc

    Ceci dit j'ai regarder le document Pdf joint et au vu de ce qui est demander j'ai 2 remarques
    - Il est demandé de faire quelque chose de propre et facile d'utilisation (limite pro)
    Pour faire quelque chose de propre il va falloir utiliser les boites de dialogue MSGBOX et InputBox (voir même des Userforms mais si vous avez le temps)

    Nous devons réaliser un programme VBA permettant de calculer la valeur d'une obligation et d'un put d'une obligation zéro coupon. Nous avons désespérément tenter de programmer les formules dans VBA mais nous n'en maitrisons pas assez les outils pour y parvenir.
    J'en déduit que vous êtes plus débutant donc
    - Pour plus de simplicité il est préférable de faire que des sub et de déclarer les variables et ds 1 module séparer comme suit : Moi je fais un module,que je nomme "Declarations" rien que pour cela. Du coup mes variables sont disponible pour toutes les procédures et le valeurs sont disponibles dans toutes les sub tant que le programme n'est pas fini. Plus de problème de passation de paramètre d'une sub a une autre. Cela devient plus facile.

    Je ne pourrais pas ou peu aider sur les formules car cela plus de 20 ans que j'ai pas toucher à des formules aussi complexes. (J'ai oublier depuis )

    Je vous conseille les Tutos du site ils sont très bien fait

    à Bientôt

Discussions similaires

  1. [Système] Lancer un programme externe depuis une page web
    Par needles94000 dans le forum Langage
    Réponses: 2
    Dernier message: 08/02/2006, 21h34
  2. programmer en C++ une barre d'outils Internet
    Par panda31 dans le forum C++
    Réponses: 2
    Dernier message: 26/09/2005, 14h19
  3. Réponses: 3
    Dernier message: 05/09/2005, 14h09
  4. Réponses: 2
    Dernier message: 04/06/2004, 10h36
  5. Lancer un programme, mais sur une autre machine
    Par GOUGOU1 dans le forum Réseau
    Réponses: 12
    Dernier message: 08/12/2002, 20h36

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