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

Rechercher des sujets similaires à "formule black scholes incompatibilite types"