【发布时间】:2016-04-09 21:26:04
【问题描述】:
我想使用牛顿法计算几个看涨期权的到期时间。我尝试在下面的代码中重新创建此方法。
我得到名为functionDerived 的变量的奇怪类型不匹配。该变量是变量function0 的派生形式。此时出现错误 13。
计算中的变量有以下几种:
opT integer;
S double;
sigma double;
K double;
rf double;
q double;
T integer;
optionbidprice double;
这是我的代码:
Public Function calculateOptionExpiration(opT, S, sigma, K, rf, q, T, optionBidPrice)
'************************************************************************
'Variables
'************************************************************************
Dim function0 As Double
Dim functionDerived As Double
Dim optionPrice As Double
Dim differenceZero As Double
Dim Tnext As Integer
Dim Pii As Double
Dim d1 As Double
Dim d2 As Double
Dim ND1 As Double 'Cumulative standard normal probability for value d1
Dim ND2 As Double 'Cumulative standard normal probability for value d2
Dim Nd1accent As Double 'Derivation, N'(x), see book page 456
Dim Nd2accent As Double
'************************************************************************
'Newton's method to calculate time to option expiration T
'************************************************************************
'theta formula page 456, use this in newton's method
'Step 1: f(T) = 0
Pii = Application.WorksheetFunction.Pi
d1 = BSD1(S, K, rf, q, T, sigma)
d2 = BSD2(S, K, rf, q, T, sigma)
ND1 = Application.NormSDist(d1)
ND2 = Application.NormSDist(d2)
Nd1accent = (1 / Sqr(2 * Pii)) * Exp(-d1 ^ 2 / 2)
function0 = ((-S * Nd1accent * sigma * Exp(-q * T)) / (2 * Sqr(T))) + _
(q * S * ND1 * Exp(-q * T)) - (rf * K * Exp(-rf * T) * ND2)
'Step 2 : f'(T)
Nd2accent = (1 / Sqr(2 * Pii)) * Exp(-d2 ^ 2 / 2)
functionDerived = (q / 2) * (S * Nd1accent * sigma * Exp(-q * T) * 2 ^ (-1) * T ^ (-3 / 2)) _
- q * (q * S * Nd1accent * Exp(-q * T)) + rf(rf * K * Exp(-rf * T) + Nd2accent)
'step 3: Tnext = T - function0/functionderived, find the T so that option bid - optionprice = 0
Do Until differenceZero = 0
optionPrice = BSMOptPrice(opT, S, sigma, K, rf, q, T)
differenceZero = optionBidPrice - optionPrice
Tnext = T - (function0 / functionDerived)
T = Tnext
Loop
calculateOptionExpiration = Tnext
【问题讨论】:
-
functionDerived的分配中的这一部分真的正确吗:rf(rf * K * Exp(-rf * T) + Nd2accent)?看起来好像您正在尝试调用函数rf()而您在上面提到rf是双精度。 -
这确实是问题所在。谢谢!
-
@bovender- 你可以让你的评论成为答案。
-
@Jolien.A 你会这么好心并接受我的回答,这样我就可以赢得一些声誉吗?谢谢。