我一直在sigma2d行的定义上得到无效的过程调用或参数错误。 知道如何避免此代码错误吗?
Private Sub CommandButton4_Click()
Application.Range("E19").value = ""
Application.Range("F19").value = ""
S0 = Application.Range("C5").value 'arithmetic average of underlying 1
K = Application.Range("C6").value 'strike
T = Application.Range("C10").value 'maturity
sigma = Application.Range("C8").value 'volatility
r = Application.Range("C8").value 'risk free rate
nsteps = Application.Range("C12").value 'no of timesteps
nsimulations = Application.Range("C13").value ' no of mc simulations
div = Application.Range("C9").value 'dividends
Randomize
Dim M1 As Double, M2 As Double, sigma2d As Double
Dim d1 As Double, d2 As Double, Nd1 As Double, Nd2 As Double
M1 = (Exp((r - div) * T) - 1) / (r - div) * T
v = (2 * Exp((2 * r) - (2 * div) + (sigma * sigma) * T)) * S0 * S0
w = (r - div + (sigma * sigma)) * (2 * r - 2 * q + (sigma * sigma)) * T * T
Z = 2 * S0 * S0 / ((r - div) * T * T)
y = (1 / 2 * (r - div) + sigma * sigma)
h = Exp((r - div) * T) / (r - div + (sigma * sigma))
M2 = (v / w) + Z * (y - h)
M3 = M1 * M1
sigma2d = Log(M2 / M3)
d1 = (Log(M1 / K) + (sigma2d * T) / 2) / sigma * Sqr(T)
d2 = d1 - sigma * Sqr(T)
callArith = Exp(-r * T) * (M1 * Nd1 - K * Nd2)
Application.Range("E19").value = Application.Max(ExactCall, 0)
答案 0 :(得分:2)
您是否尝试记录负数?设置断点并在该行之前检查变量。也许你在产生负面之前有一个错误。
答案 1 :(得分:0)
首先检查Log
函数的参数是否为正。
如果失败,可能是由于项目中缺少参考。这表现在这种奇怪的方式。看看“工具”,“参考资料”,看看是否有遗失。
您可以改为编写sigma2d = Vba.Log(M2 / M3)
,但这只是一个简短的修复,因为缺少引用会让您在别处感到头痛。
还有一件事,为什么不创建一个函数,将所有变量作为函数参数传递?如果你这样做,你的电子表格会更稳定。
(另外,在您的代码末尾,d1
定义不正确。您需要sigma * Sqr(T)
周围的括号。
答案 2 :(得分:0)
我认为您需要一对()
或做"/T"
,因为您在这里乘以T
:
M1 = (Exp((r - div) * T) - 1) / (r - div) * T