2015-04-17 4 views
1

Я продолжаю получать неправильный вызов процедуры или аргумент ошибки в определении строки 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

Сначала проверьте аргумент функции Log положительна.

В противном случае это может быть связано с отсутствием ссылки в проекте. Это проявляется в этом любопытном образе. Посмотрите на «Инструменты», «Ссылки» и посмотрите, нет ли одного.

Вместо этого вы можете написать sigma2d = Vba.Log(M2/M3), но это только очень короткое исправление, так как отсутствующие ссылки вызовут головные боли в другом месте.

Еще одна вещь, почему бы не создать функцию вместо этого, передав все переменные в качестве параметров функции? Если вы это сделаете, ваша таблица будет более стабильной.

(Кроме того, в конце вашего кода неверно определение d1. Вам нужны скобки вокруг sigma * Sqr(T)).

2

Вы пытаетесь сделать журнал отрицательного числа? Установите контрольную точку и проверьте переменные до этой строки. Возможно, перед вами возникла ошибка, вызвавшая отрицательный эффект.

+0

Это, наверное, ответ. – Bathsheba

+0

Сообщите мне, если вы его заработаете и можете принять мой ответ или нет! – Sam

Смежные вопросы