2015-10-19 176 views
1

我想使用牛頓法計算幾個調用選項到期的時間。我試着在下面的代碼中重新創建這個方法。 我得到一個奇怪的類型不匹配的變量名爲functionDerived。該變量是變量function0的派生形式。錯誤13發生在那一點。VBA:運行時錯誤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 
+0

這是部分在'functionDerived'真正正確的分配:'射頻(RF * K * EXP(-rf * T)+ Nd2accent)'?看起來好像你試圖調用一個函數'rf()',而你在上面提到'rf'是一個double。 – bovender

+0

確實是這個問題。謝謝! –

+0

@ bovender-你可以讓你的評論的答案。 – Davesexcel

回答

0

這個部分functionDerived轉讓是不正確的:

rf(rf * K * Exp(-rf * T) + Nd2accent) 

rf(...)是函數調用,但參數rf是雙精度型,所以這是類型不匹配。