算术亚式期权定价

时间:2015-04-17 13:44:21

标签: excel-vba vba excel

我一直在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)

3 个答案:

答案 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