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
| Function BSM(ByVal S As Double, ByVal K As Double, ByVal T As Double, ByVal Vol As Double, ByVal r As Double, ByVal q As Double, ByVal CP As String) As Double
' Fonction qui calcule le prix d'une option vanille européenne selon le modèle de Black, Scholes et Merton (1973)
' S est le prix de l'ASJ
' K est le strike de l'option
' T est la maturité restante de l'option
' vol est la volatilité annuelle des rendements composés continuement
' r est le taux sans risque (annuel) composé continument
' q est le taux de dividende (annuel) composé continument
' CP désigne le type d'option (Call ou Put) : "Call" pour un Call ou "Put" pour un Put
'Ici on déclaire directement les variables dans la fonction. Byval plutôt que byref pour pouvoir utiliser les valeurs des variables plutôt
'que leur référence dans le calcul de la vol implicite par exemple
Dim d1 As Double, d2 As Double, Nd1 As Double, Nd2 As Double, error As Variant, LCase As Variant
d1 = Log((S * Exp(-q * T)) / (K * Exp(-r * T))) / (Vol * Sqr(T)) + 0.5 * Vol * Sqr(T)
d2 = d1 - Vol * Sqr(T)
Nd1 = Application.WorksheetFunction.NormSDist(d1)
Nd2 = Application.WorksheetFunction.NormSDist(d2)
CP = LCase(CP)
Ici:
If CP = "call" Then
BSM = S * Exp(-q * T) * Nd1 - K * Exp(-r * T) * Nd2
ElseIf CP = "put" Then
BSM = -S * Exp(-q * T) * (1 - Nd1) + K * Exp(-r * T) * (1 - Nd2)
Else
error = MsgBox("il faut rentrer ""call"" pour un Call et ""put"" pour un Put", vbOKCancel)
If error = vbOK Then
CP = InputBox("Alors un Put ou un Call ?")
GoTo Ici
Else
Exit Function
End If
End If |
Partager