简体   繁体   English

VBA Excel中的隐含波动率函数中的值错误

[英]Value Error in implied volatility function in VBA Excel

I wrote a function to solve for implied volatility of a European Call option,using the bisection method. 我使用二分法编写了一个函数来解决欧式看涨期权的隐含波动率。 The inputs for the function are cell references. 该函数的输入是单元格引用。 When I try to use the function, I get a #Value! 当我尝试使用该函数时,我得到一个#Value! error and I am not sure why. 错误,我不确定为什么。 My code is below. 我的代码如下。

Function BSCall(ByVal S As Double, ByVal K As Double, ByVal T As Double, _
ByVal vol As Double, Optional ByVal R As Double = 0, Optional ByVal Q As Double = 0)
Dim d1 As Double
Dim d2 As Double

d1 = Log(S / K) + (R - Q + (vol) * (vol) * 0.5) * T / (vol * Sqr(T))
d2 = d1 - (vol * Sqr(T))

BSCall = S * Exp(-Q * T) * Application.WorksheetFunction.Norm_S_Dist(d1, True) _
- K * Exp(-R * T) * Application.WorksheetFunction.Norm_S_Dist(d2, True)
End Function

Function ErrorCalc(ByVal Price As Double, ByVal vol As Double, ByVal S As Double, ByVal K As      Double, ByVal T As Double, _
Optional ByVal R As Double = 0, Optional ByVal Q As Double = 0)

Error = Price - BSCall(S, K, T, vol, R, Q)
End Function

Function IVCall(ByVal Price As Double, ByVal S As Double, ByVal K As Double, ByVal T As Double, _
Optional ByVal R As Double = 0, Optional ByVal Q As Double = 0, _
Optional tol = 0.000000001, Optional iter = 1000, _
Optional minSig = 0.0001, Optional maxSig = 4) As Double

Dim b As Double
Dim a As Double
Dim temp As Double
Dim mid As Double
Dim counter As Long
Dim sigma As Double

a = minSig
b = maxSig


If ErrorCalc(Price, a, S, K, T) * ErrorCalc(Price, b, S, K, T) < 0 Then
    Exit Function
End If

If ErrorCalc(Price, a, S, K, T) > 0 Then
    temp = a
    a = b
    b = temp
End If

Do Until (tol >= 10^ - 9 Or iter <> counter)
mid = (a + b) / 2
Error = ErrorCalc(Price, mid, S, K, T)
If Abs(Error) <= tol Then
    sigma = mid
    Exit Do
ElseIf Error > tol Then
    b = mid
ElseIf Error < tol Then
    a = mid
End If

counter = counter + 1
Loop
IVCall = sigma
End Function

Update the below function and run the code. 更新以下功能并运行代码。

Function BSCall(ByVal S As Double, ByVal K As Double, ByVal T As Double, _
ByVal vol As Double, Optional ByVal R As Double = 0, Optional ByVal Q As Double = 0) As Double
Dim d1 As Double
Dim d2 As Double

d1 = Log(S / K) + (R - Q + (vol) * (vol) * 0.5) * T / (vol * Sqr(T))
d2 = d1 - (vol * Sqr(T))

BSCall = Round(S * Exp(-Q * T) * Application.WorksheetFunction.Norm_S_Dist(d1, True) _
- K * Exp(-R * T) * Application.WorksheetFunction.Norm_S_Dist(d2, True), 4)
End Function


Function ErrorCalc(ByVal Price As Double, ByVal vol As Double, ByVal S As Double, ByVal K As Double, ByVal T As Double, _
Optional ByVal R As Double = 0, Optional ByVal Q As Double = 0) As Double

ErrorCalc = Price - BSCall(S, K, T, vol, R, Q)
End Function

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM