'Function Defs
Const pivalue = 3.14159265358979
Function norm(z As Double)
norm = 1 / Sqr(2 * pivalue) * Exp(-z ^ 2 / 2)
End Function
Function snorm(z As Double)
a1 = 0.31938153
a2 = -0.356563782
a3 = 1.781477937
a4 = -1.821255978
a5 = 1.330274429
If z < 0 Then w = -1 Else w = 1
k = 1 / (1 + 0.2316419 * w * z)
snorm = 0.5 + w * (0.5 - 1 / Sqr(2 * pivalue) * Exp(-z ^ 2 / 2) * (a1 * k + a2 * k ^ 2 + a3 * k ^ 3 + a4 * k ^ 4 + a5 * k ^ 5))
End Function
Function call_eur(s As Double, x As Double, t As Double, r As Double, sd As Double, q As Double)
Dim d1 As Double
Dim d2 As Double
If t > 0 Then
d1 = (Log(s / x) + (r - q + sd ^ 2 / 2) * t) / (sd * Sqr(t))
d2 = d1 - sd * (t ^ 0.5)
call_eur = s * Exp(-q * t) * snorm(d1) - x * Exp(-r * t) * snorm(d2)
Else
If s > x Then
call_eur = s - x
Else
call_eur = 0
End If
End If
End Function
Function put_eur(s As Double, x As Double, t As Double, r As Double, sd As Double, q As Double)
If t > 0 Then
d1 = (Log(s / x) + (r - q + sd ^ 2 / 2) * t) / (sd * Sqr(t))
d2 = d1 - sd * (t ^ 0.5)
put_eur = -s * Exp(-q * t) * snorm(-d1) + x * Exp(-r * t) * snorm(-d2)
Else
If s < x Then
put_eur = x - s
Else
put_eur = 0
End If
End If
End Function
Function call_delta_eur(s As Double, x As Double, t As Double, r As Double, sd As Double, q As Double)
Dim d1 As Double
d1 = (Log(s / x) + (r - q + sd ^ 2 / 2) * t) / (sd * Sqr(t))
call_delta_eur = Exp(-q * t) * snorm(d1)
End Function
Function put_delta_eur(s As Double, x As Double, t As Double, r As Double, sd As Double, q As Double)
Dim d1 As Double
d1 = (Log(s / x) + (r - q + sd ^ 2 / 2) * t) / (sd * Sqr(t))
put_delta_eur = Exp(-q * t) * (snorm(d1) - 1)
End Function
Function gamma_eur(s As Double, x As Double, t As Double, r As Double, sd As Double, q As Double)
Dim d1 As Double
d1 = (Log(s / x) + (r - q + sd ^ 2 / 2) * t) / (sd * Sqr(t))
gamma_eur = Exp(-q * t) * norm(d1) / (s * sd * Sqr(t))
End Function
Function vega_eur(s As Double, x As Double, t As Double, r As Double, sd As Double, q As Double)
Dim d1 As Double
d1 = (Log(s / x) + (r - q + sd ^ 2 / 2) * t) / (sd * Sqr(t))
vega_eur = Exp(-q * t) * s * Sqr(t) * norm(d1)
End Function
Function call_theta_eur(s As Double, x As Double, t As Double, r As Double, sd As Double, q As Double)
Dim d1 As Double
Dim d2 As Double
d1 = (Log(s / x) + (r - q + sd ^ 2 / 2) * t) / (sd * Sqr(t))
d2 = d1 - sd * (t ^ 0.5)
call_theta_eur = -s * Exp(-q * t) * norm(d1) * sd / (2 * Sqr(t)) _
+ q * s * Exp(-q * t) * snorm(d1) - r * x * Exp(-r * t) * snorm(d2)
End Function
Function put_theta_eur(s As Double, x As Double, t As Double, r As Double, sd As Double, q As Double)
Dim d1 As Double
Dim d2 As Double
d1 = (Log(s / x) + (r - q + sd ^ 2 / 2) * t) / (sd * Sqr(t))
d2 = d1 - sd * (t ^ 0.5)
put_theta_eur = -s * Exp(-q * t) * norm(d1) * sd / (2 * Sqr(t)) _
- q * s * Exp(-q * t) * snorm(-d1) + r * x * Exp(-r * t) * snorm(-d2)
End Function
Function call_rho_eur(s As Double, x As Double, t As Double, r As Double, sd As Double, q As Double)
Dim d1 As Double
Dim d2 As Double
d1 = (Log(s / x) + (r - q + sd ^ 2 / 2) * t) / (sd * Sqr(t))
d2 = d1 - sd * (t ^ 0.5)
call_rho_eur = x * t * Exp(-r * t) * snorm(d2)
End Function
Function put_rho_eur(s As Double, x As Double, t As Double, r As Double, sd As Double, q As Double)
Dim d1 As Double
Dim d2 As Double
d1 = (Log(s / x) + (r - q + sd ^ 2 / 2) * t) / (sd * Sqr(t))
d2 = d1 - sd * (t ^ 0.5)
put_rho_eur = -x * t * Exp(-r * t) * snorm(-d2)
End Function
Function call_impvol_eur(s As Double, x As Double, t As Double, r As Double, p As Double, q As Double) As Double
Dim d As Double
Dim sd As Double
Dim sdt As Double
Dim i As Integer
Dim k As Integer
Dim v As Double
sd = 0
Start:
k = 0
v = 1
sd = sd + 1
sdt = sd
For i = 1 To 16
v = v / 2
d = p - call_eur(s, x, t, r, sd, q)
If d > 0 Then
k = k + 1
sd = sd + v
Else:
sd = sd - v
End If
Next i
If k = 16 Then
GoTo Start:
Else:
If k = 0 Then sd = sdt - 1
call_impvol_eur = sd
End If
End Function
Function put_impvol_eur(s As Double, x As Double, t As Double, r As Double, p As Double, q As Double) As Double
Dim d As Double
Dim sd As Double
Dim sdt As Double
Dim i As Integer
Dim k As Integer
Dim v As Double
sd = 0
Start:
k = 0
v = 1
sd = sd + 1
sdt = sd
For i = 1 To 16
v = v / 2
d = p - put_eur(s, x, t, r, sd, q)
If d > 0 Then
k = k + 1
sd = sd + v
Else:
sd = sd - v
End If
Next i
If k = 16 Then
GoTo Start:
Else:
If k = 0 Then sd = sdt - 1
put_impvol_eur = sd
End If
End Function