Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops VBA Excel中隐含波动率函数的值错误_Loops_Excel_Finance_Vba - Fatal编程技术网

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

Loops VBA Excel中隐含波动率函数的值错误,loops,excel,finance,vba,Loops,Excel,Finance,Vba,我编写了一个函数,用二分法求解欧洲看涨期权的隐含波动率。函数的输入是单元格引用。当我尝试使用该函数时,我得到一个#值!错误,我不知道为什么。我的代码如下 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 Dou

我编写了一个函数,用二分法求解欧洲看涨期权的隐含波动率。函数的输入是单元格引用。当我尝试使用该函数时,我得到一个#值!错误,我不知道为什么。我的代码如下

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
函数BSCall(ByVal S为双精度,ByVal K为双精度,ByVal T为双精度_
ByVal vol为双精度,可选ByVal R为双精度=0,可选ByVal Q为双精度=0)
将d1变暗为双精度
将d2变暗为双精度
d1=对数(S/K)+(R-Q+(vol)*(vol)*0.5)*T/(vol*Sqr(T))
d2=d1-(体积*Sqr(T))
BSCall=S*Exp(-Q*T)*Application.WorksheetFunction.Norm\u S\u Dist(d1,True)_
-K*Exp(-R*T)*应用程序.工作表函数.规范S_区(d2,真)
端函数
函数ErrorCalc(ByVal Price为Double,ByVal vol为Double,ByVal S为Double,ByVal K为Double,ByVal T为Double_
可选的ByVal R为Double=0,可选的ByVal Q为Double=0)
错误=价格-BSCall(S、K、T、vol、R、Q)
端函数
函数IVCall(ByVal价格为双精度,ByVal S为双精度,ByVal K为双精度,ByVal T为双精度_
可选ByVal R为Double=0,可选ByVal Q为Double=0_
可选tol=0.000000001,可选iter=1000_
可选minSig=0.0001,可选maxSig=4)为双精度
双倍调暗b
将a调暗为双色
双温变暗
半暗双色
昏暗的柜台一样长
双精度标准差
a=minSig
b=maxSig
如果ErrorCalc(价格,a,S,K,T)*ErrorCalc(价格,b,S,K,T)<0,则
退出功能
如果结束
如果ErrorCalc(价格、a、S、K、T)>0,则
温度=a
a=b
b=温度
如果结束
直到(tol>=10^-9或iter计数器)
中期=(a+b)/2
Error=ErrorCalc(价格、中期、S、K、T)
如果Abs(错误)tol,则
b=中等
ElseIf错误
更新下面的函数并运行代码

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


它计算一个欧洲呼叫选项的价格,这也是本期研究所需的。为BSCall()函数添加了代码。它部分工作。带有IVCall的单元格显示0
If ErrorCalc(Price,a,S,K,T)*ErrorCalc(Price,b,S,K,T),而不是显示值错误<0如果
ErrorCalc
中的bcoz值必须小于0,则退出函数End。因此函数退出并返回0。不,我刚刚注释掉了该代码块,但它仍然显示0。我找不到任何内容。一切都很好,当它进入循环时,函数endsI也尝试使用for循环和do while循环,但我遇到了同样的问题/错误。
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