Problème fonction

blooxy Messages postés 1 Date d'inscription dimanche 6 mars 2011 Statut Membre Dernière intervention 6 mars 2011 - 6 mars 2011 à 01:06
NHenry Messages postés 15115 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 8 mai 2024 - 6 mars 2011 à 13:01
Bonjour!

Je débute en VBA et je souhaiterais utiliser une fonction trouvé sur le web. Le problème est quelle me revoit la valeur 0, ce qui est inexact. J'ai enregistré le code que voici dans un module classique.

Function EuroBin(S, K, T, rf, sigma, n, PutCall As String)
dt T / n: u Exp(sigma * (dt ^ 0.5))
d 1 / u: p (Exp(rf * dt) - d) / (u - d)
EuroBin = 0
For i = 0 To n
Select Case PutCall
Case "Call":
EuroBin = EuroBin + Application.Combin(n, i) * p ^ i * (1 - p) ^ (n - i) * Application.Max(S * u ^ i * d ^ (n - i) - K, 0)
Case "Put":
EuroBin = EuroBin + Application.Combin(n, i) * p ^ i * (1 - p) ^ (n - i) * Application.Max(K - S * u ^ i * d ^ (n - i), 0)
End Select
Next i
EuroBin = Exp(-rf * T) * EuroBin
End Function


Après avoir essayé quelques bricoles je n'arrive à rien!
Merci pour votre aide!

PS : Il s'agit d'une fonction renvoyant le prix d'une option européenne par le modèle binomial.

2 réponses

AlKatou Messages postés 95 Date d'inscription vendredi 7 février 2003 Statut Membre Dernière intervention 28 novembre 2017
6 mars 2011 à 10:17
salut,

respectes-tu bien la casse de ta variable PutCall ? car "Call" est différent de "call", idem pour "Put". car pour moi, tu "passe" dans le "Case else" de ton select. et ta fonction te renvoie 0 dû fait de son initialisation par l'instruction EuroBin = 0.

teste également que n et u soit différent de zéro avant d'effectuer tes divisions sinon c'est le message d'erreur assuré.

AlKa
0
NHenry Messages postés 15115 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 8 mai 2024 159
6 mars 2011 à 13:01
Bonjour,

A voir le code, je te conseil ces quelques mesures :
- Mettre "Option Explicit" en haut de chaque module de code (et ensuite déclarer toutes les variables).
- Ensuite, PutCall, on préfèrerait utiliser un booléen ou une énumération.
- On type toujours ses variables, car cela facilitera la compréhension du code
- On évite les nom de variable qui ne veulent rien dire, à quoi sert "d", "T" ?

Ensuite, si tu conserve le type String pour le PutCall, utilises lCase pour passer le texte en minuscule, cela te permettra d'éviter les problèmes de casse

Mon site
0
Rejoignez-nous