谢谢各位热心解答。
那个运算结果的确是错误的,soar说的没错,结果应该是在18左右。
使用MC的原因如楼上所说,并非只为了欧式期权,只是定价中有欧式期权,就顺道测试一下MC欧式期权中实际应用意义。
VBA定价如果等待时间超过5秒就没意义了。
最后,受到各路英雄指点后,算是完成了一个减少方差的方法。
b是需要Pre run出来的。b=covar(X, Y)/var(X), 重新导入计算mu,mu的均值为结果。
但是我程序似乎还有错,因为当我增加T,并把s设与k相当接近的情况后(也就是一个很接近ATM的期权),BS和MC的误差变得相当大(见图)。
我感觉MC的计算或许有错。
以下是我的MC计算code (为了方便阅读,我省略了减少方差的部分)另外如果觉得这个过程可以优化的话,请猛拍砖~~
Function MC(ByVal s As Double, _
ByVal r As Double, _
ByVal T As Double, _
ByVal v As Double, _
Optional ByVal y As Double)
Dim variationRelative As Double
Dim rand As Double
rand = Application.NormSInv(Rnd())
variationRelative = (r - y - v ^ 2 / 2) * T + rand * v * T ^ (1 / 2)
MC = s * Exp(variationRelative)
End Function
Sub MC1()
Dim CP As String
Dim s, k, r, T, v, y As Double
Dim tempResult As Double, tempResultS As Double
Dim nbScenario
Dim prime As Double, meanPrime As Double
Sheets("Pricer").Activate
CP = Cells(2, 2)
s = Cells(3, 2)
k = Cells(4, 2)
r = Cells(5, 2)
T = Cells(6, 2)
v = Cells(7, 2)
y = Cells(8, 2)
nbScenario = 10000
If CP = "c" Then
For i = 1 To nbScenario
prime = WorksheetFunction.Max(0, (MC(s, r, T, v, y) - k) * Exp(-r * T))
tempResult = tempResult + prime
Next i
meanPrime = tempResult / nbScenario
ElseIf CP = "p" Then
For i = 1 To nbScenario
prime = WorksheetFunction.Max(0, (k - MC(s, r, T, v, y)) * Exp(-r * T))
tempResult = tempResult + prime
Next i
meanPrime = (tempResult / nbScenario)
End If
Cells(12, 2) = meanPrime