Formule de Black and Scholes: Incompatibilité de types
Bonjour,
Le compilateur donne l'erreur: Erreur d'éxécution 13 Incompatibilité de types pour la ligne suivante:
d1 = (WorksheetFunction.Ln(St / K) + (r + 0.5 * WorksheetFunction.Power(sigma, 2)) * (M - t)) / (sigma * WorksheetFunction.Power((M - t), 0.5))
Voici le code complet, Merci de votre aide:
Sub BSCALLPRICE()
Dim St, t, C, K, r, M, sigma, d1, d2 As Double
''St = Worksheets("Feuil1").Cells(3, 1)
St = 105
''t = Worksheets("Feuil1").Cells(3, 6)
t = 0
''K = Worksheets("Feuil1").Cells(3, 2)
K = 100
''r = Worksheets("Feuil1").Cells(3, 4)
r = 0.02
''M = Worksheets("Feuil1").Cells(3, 5)
M = 1
''sigma = Worksheets("Feuil1").Cells(3, 3)
sigma = 0.15
d1 = (WorksheetFunction.Ln(St / K) + (r + 0.5 * WorksheetFunction.Power(sigma, 2)) * (M - t)) / (sigma * WorksheetFunction.Power((M - t), 0.5))
d2 = d1 - sigma * WorksheetFunction.Power((M - t), 0.5)
C = St * WorksheetFunction.NormInv(0, 1, d1) - K * Exp(-r * (M - t)) * WorksheetFunction.Norm_Inv(0, 1, d2)
Worksheets("Feuil1").Cells(3, 7) = C
End Sub
Salut Curveater,
Une erreur "d’exécution 13 Incompatibilité de types" peut venir du type de variable (Par exemple, j'aurais cette erreur si j'essaye de mettre du texte (String
) dans une variable que j'ai déclaré comme étant numérique (Long
))
Dans ton cas, c'est la variable d1
qui ressort et elle est du type Double
.
Une variable Double
est de type Numérique est prend les nombres à virgule flottante de -1.79769313486232D308 à 1.79769313486232D308.
Est ce que le résultat attendu en d1
fait bien partie de ces deux balises ?
Si ce n'est pas le cas, alors essaye de remplacer le type de ta variable par quelque chose qui lui correspond :
https://www.excel-pratique.com/fr/vba/variables.php
Restant à dispo
Bonjour,
pas d'erreur sur cette ligne avec le code que tu as mis.
par contre j'ai bien une erreur sur norminv et norm_inv
remarque dans l'instruction
Dim St, t, C, K, r, M, sigma, d1, d2 As Double
seul d2 est de type double, toutes les autres variables sont de type variant.
pour définir toutes ces variables de type double
Dim St as double, t as double , C as double, K as double, r as double, M as double, sigma as double, d1 as double, d2 As Double
Merci!
Voici le code corrigé.
Sub BSCALLPRICE()
Dim St, t, C, K, r, M, sigma, d1, d2 As Double
''St = Worksheets("Feuil1").Cells(3, 1)
St = 105
''t = Worksheets("Feuil1").Cells(3, 6)
t = 0
''K = Worksheets("Feuil1").Cells(3, 2)
K = 100
''r = Worksheets("Feuil1").Cells(3, 4)
r = 0.02
''M = Worksheets("Feuil1").Cells(3, 5)
M = 1
''sigma = Worksheets("Feuil1").Cells(3, 3)
sigma = 0.15
d1 = (WorksheetFunction.Ln(St / K) + (r + 0.5 * WorksheetFunction.Power(sigma, 2)) * (M - t)) / (sigma * WorksheetFunction.Power((M - t), 0.5))
d2 = d1 - sigma * WorksheetFunction.Power((M - t), 0.5)
C = St * WorksheetFunction.NormInv(d1, 0, 1) - K * Exp(-r * (M - t)) * WorksheetFunction.NormInv(d2, 0, 1)
Worksheets("Feuil1").Cells(3, 7) = C
End Sub
Le code me redonne l'erreur d'incompatibilité de types lorsque j'input les données à partir d'excel
Sub BSCALLPRICE()
Dim St, t, C, K, r, M, sigma, d1, d2 As Double
St = Worksheets("Feuil1").Cells(3, 1)
t = Worksheets("Feuil1").Cells(3, 6)
K = Worksheets("Feuil1").Cells(3, 2)
r = Worksheets("Feuil1").Cells(3, 4)
M = Worksheets("Feuil1").Cells(3, 5)
sigma = Worksheets("Feuil1").Cells(3, 3)
d1 = (WorksheetFunction.Ln(St / K) + (r + 0.5 * WorksheetFunction.Power(sigma, 2)) * (M - t)) / (sigma * WorksheetFunction.Power((M - t), 0.5))
d2 = d1 - sigma * WorksheetFunction.Power((M - t), 0.5)
C = St * WorksheetFunction.NormInv(d1, 0, 1) - K * Exp(-r * (M - t)) * WorksheetFunction.NormInv(d2, 0, 1)
Worksheets("Feuil1").Cells(3, 7) = C
End Sub
Cf fichier .xlsm en pièce jointe du msg précédent
Bonjour,
données en colonnes C et D considérées par excel comme du texte.
après réintroduction, la macro semble fonctionner.
Rebonsoir,
Si quelqu'un a quelque notions de finance des marchés et/ou d'utilisation des fonctions VBA NormInv et Normdist merci de bien vouloir jeter un oeuil à mon code et me signaler d'éventuelles erreurs grossières.
Bien cordialement.
Ludovic
Sub BSCALLPRICE()
Dim St, t, Ct, Ct2, Pt, K, K2, r, M, sigma, d1, d2, d12, d22 As Double
St = Worksheets("Feuil1").Cells(3, 1)
t = Worksheets("Feuil1").Cells(3, 6)
K = Worksheets("Feuil1").Cells(3, 2)
K2 = Worksheets("Feuil1").Cells(5, 2)
r = Worksheets("Feuil1").Cells(3, 4)
M = Worksheets("Feuil1").Cells(3, 5)
sigma = Worksheets("Feuil1").Cells(3, 3)
d1 = (WorksheetFunction.Ln(St / K) + (r + 0.5 * WorksheetFunction.Power(sigma, 2)) * (M - t)) / (sigma * WorksheetFunction.Power((M - t), 0.5))
d2 = d1 - sigma * WorksheetFunction.Power((M - t), 0.5)
If d1 < 0 Then
Ct = St * (1 - WorksheetFunction.NormInv(-d1, 0, 1)) - K * Exp(-r * (M - t)) * (1 - WorksheetFunction.NormInv(-d2, 0, 1))
Else
Ct = St * WorksheetFunction.NormInv(d1, 0, 1) - K * Exp(-r * (M - t)) * WorksheetFunction.NormInv(d2, 0, 1)
End If
d12 = (WorksheetFunction.Ln(St / K2) + (r + 0.5 * WorksheetFunction.Power(sigma, 2)) * (M - t)) / (sigma * WorksheetFunction.Power((M - t), 0.5))
d22 = d12 - sigma * WorksheetFunction.Power((M - t), 0.5)
If d12 < 0 Then
Ct2 = St * (1 - WorksheetFunction.NormInv(-d12, 0, 1)) - K2 * Exp(-r * (M - t)) * (1 - WorksheetFunction.NormInv(-d22, 0, 1))
Else
Ct2 = St * WorksheetFunction.NormInv(d12, 0, 1) - K2 * Exp(-r * (M - t)) * WorksheetFunction.NormInv(d22, 0, 1)
End If
Worksheets("Feuil1").Cells(3, 7) = Ct
Pt = Ct - St + K * Exp(-r * (M - t))
Worksheets("Feuil1").Cells(3, 8) = Pt
Worksheets("Feuil1").Cells(3, 10) = Pt + Ct2
End Sub
[code]Function partiepositive(x As Double) As Double
If x < 0 Then
partiepositive = 0
ElseIf x > 0 Then
partiepositive = x
End If
End Function
Sub MCCALLPRICE()
Dim N As Long
N = 10000
Dim St, t, Ct, Ct2, Pt, K, K2, r, M, sigma, d1, d2, d12, d22 As Double
St = Worksheets("Feuil1").Cells(3, 1)
t = Worksheets("Feuil1").Cells(3, 6)
K = Worksheets("Feuil1").Cells(3, 2)
K2 = Worksheets("Feuil1").Cells(5, 2)
r = Worksheets("Feuil1").Cells(3, 4)
M = Worksheets("Feuil1").Cells(3, 5)
sigma = Worksheets("Feuil1").Cells(3, 3)
Dim z As Double
Dim i As Long
Dim moyennecall, moyenneput As Double
moyennecall = 0
moyenneput = 0
For i = 1 To N
moyennecall = moyennecall + partiepositive(St * Exp((r - 0.5 * WorksheetFunction.Power(sigma, 2)) * (M - t) + sigma * WorksheetFunction.Power(M - t, 0.5) * WorksheetFunction.NormDist(z, 0, 1, False)) - K)
moyenneput = moyenneput + partiepositive(K - St * Exp((r - 0.5 * WorksheetFunction.Power(sigma, 2)) * (M - t) + sigma * WorksheetFunction.Power(M - t, 0.5) * WorksheetFunction.NormDist(z, 0, 1, False)))
Next
moyennecall = moyennecall / N
Worksheets("Feuil1").Cells(5, 7) = moyennecall
Worksheets("Feuil1").Cells(5, 8) = moyenneput
End Sub
[attachment=0]Pricer d'options vanilles.xlsm[/attachment]
Quel est l'équivalent de la fonction normcdf Matlab en vba?
N'y aurait-il pas un problème de précision connu avec la formule Norm_Inv:
la ligne
Ct = St * WorksheetFunction.Norm_Inv(d1, 0, 1) - K * Exp(-r * (M - t)) * WorksheetFunction.Norm_Inv(d2, 0, 1)
me renvoit l'erreur suivante:
Impossible de lire la propriété Norm_Inv de la classe WorksheetFunction
Sub BSCALLPRICE()
Dim St, t, Ct, Ct2, Pt, K, K2, r, M, sigma, d1, d2, d12, d22 As Double
St = Worksheets("Feuil1").Cells(3, 1)
t = Worksheets("Feuil1").Cells(3, 6)
K = Worksheets("Feuil1").Cells(3, 2)
K2 = Worksheets("Feuil1").Cells(5, 2)
r = Worksheets("Feuil1").Cells(3, 4)
M = Worksheets("Feuil1").Cells(3, 5)
sigma = Worksheets("Feuil1").Cells(3, 3)
d1 = (WorksheetFunction.Ln(St / K) + (r - 0.5 * WorksheetFunction.Power(sigma, 2)) * (M - t)) / (sigma * WorksheetFunction.Power((M - t), 0.5))
d2 = d1 - sigma * WorksheetFunction.Power((M - t), 0.5)
d1 = Round(d1, 4)
d2 = Round(d2, 4)
If d1 < 0 Then
Ct = St * (1 - WorksheetFunction.Norm_Inv(-d1, 0, 1)) - K * Exp(-r * (M - t)) * (1 - WorksheetFunction.Norm_Inv(-d2, 0, 1))
Else
Ct = St * WorksheetFunction.Norm_Inv(d1, 0, 1) - K * Exp(-r * (M - t)) * WorksheetFunction.Norm_Inv(d2, 0, 1)
End If
MsgBox (Ct)
d12 = (WorksheetFunction.Ln(St / K2) + (r - 0.5 * WorksheetFunction.Power(sigma, 2)) * (M - t)) / (sigma * WorksheetFunction.Power((M - t), 0.5))
d22 = d12 - sigma * WorksheetFunction.Pow[attachment=0]Pricer d'options vanilles.xlsm[/attachment]er((M - t), 0.5)
If d12 < 0 Then
Ct2 = St * (1 - WorksheetFunction.Norm_Inv(-d12, 0, 1)) - K2 * Exp(-r * (M - t)) * (1 - WorksheetFunction.Norm_Inv(-d22, 0, 1))
Else
Ct2 = St * WorksheetFunction.Norm_Inv(d12, 0, 1) - K2 * Exp(-r * (M - t)) * WorksheetFunction.Norm_Inv(d22, 0, 1)
End If
Worksheets("Feuil1").Cells(3, 7) = Ct
Pt = Ct - St + K * Exp(-r * (M - t))
Worksheets("Feuil1").Cells(3, 8) = Pt
Worksheets("Feuil1").Cells(3, 10) = Pt + Ct2
End Sub
Bonjour,
Sauf erreur de ma part, il faut détailler ceci, préciser le type pour chaque variable utilisée dans une fonction en accord avec celle-ci.
Dim St, t, Ct, Ct2, Pt, K, K2, r, M, sigma, d1, d2, d12, d22 As Double
edit : Oups, désolé, carrément en double avec ce qui précède !
Hello Steelson, j'ai testé ça ne change rien
J'ai trouvé c'est NormDist qu'il faut utiliser et non NormInv.
Merci pour votre aide.
Reste à trouver pourquoi la méthode de MontéCarlo ne fonctionne pas pour le put et renvoit 0.
Function partiepositive(x As Double) As Double
If x < 0 Then
partiepositive = 0
ElseIf x > 0 Then
partiepositive = x
End If
End Function
Sub MCCALLPRICE()
Dim N As Long
N = 10000
Dim St, t, Ct, Ct2, Pt, K, K2, r, M, sigma, d1, d2, d12, d22 As Double
St = Worksheets("Feuil1").Cells(3, 1)
t = Worksheets("Feuil1").Cells(3, 6)
K = Worksheets("Feuil1").Cells(3, 2)
K2 = Worksheets("Feuil1").Cells(5, 2)
r = Worksheets("Feuil1").Cells(3, 4)
M = Worksheets("Feuil1").Cells(3, 5)
sigma = Worksheets("Feuil1").Cells(3, 3)
Dim z As Double
Dim i As Long
Dim moyennecall, moyenneput As Double
moyennecall = 0
moyenneput = 0
For i = 1 To N
moyennecall = moyennecall + partiepositive(St * Exp((r - 0.5 * WorksheetFunction.Power(sigma, 2)) * (M - t) + sigma * WorksheetFunction.Power(M - t, 0.5) * WorksheetFunction.NormDist(z, 0, 1, False)) - K)
moyenneput = moyenneput + partiepositive(K - St * Exp((r - 0.5 * WorksheetFunction.Power(sigma, 2)) * (M - t) + sigma * WorksheetFunction.Power(M - t, 0.5) * WorksheetFunction.NormDist(z, 0, 1, False)))
Next
moyennecall = Exp(-r * (M - t)) * moyennecall / N
moyenneput = Exp(-r * (M - t)) * moyenneput / N
Worksheets("Feuil1").Cells(5, 7) = moyennecall
Worksheets("Feuil1").Cells(5, 8) = moyenneput
End Sub
[attachment=0]Pricer d'options vanilles.xlsm[/attachment]
Il fallait utiliser la fonction NormInv avec un randomize pour la formule de MontéCarlo.
Ce sujet est réglé.
Cdt.
Ludovic