2015-06-03 6 views
4

Я создал программу, с помощью VBA для вычисления европейского вызова цены опциона, следующим образом:биномиальных европейских опционов модель ценообразования

Private Sub CallPrice_Click() 
Dim K As Single 
Dim So As Single 
Dim r As Single 
Dim T As Single 
Dim sigma As Single 
Dim u As Single 
Dim d As Single 
Dim p As Single 
Dim CP As Single 
Dim M As Single 
Dim S As Single 
Dim CB As Double 
Dim n As Integer 
Dim i As Integer 

K = Cells(2, 2) 
So = Cells(3, 2) 
r = Cells(4, 2) 
T = Cells(5, 2) 
sigma = Cells(6, 2) 
n = Cells(7, 2) 
u = Exp(sigma * Sqr(T/n)) 
d = 1/u 
p = (Exp(r * T/n) - d)/(u - d) 
CP = 0 
For i = 0 To n Step 1 
    M = WorksheetFunction.Max(So * (u^i) * d^(n - i) - K, 0) 
    CB = WorksheetFunction.Combin(n, i) 
    S = M * CB * (p^n) * (1 - p)^(n - i) 
    CP = CP + S 
Next i 
Cells(9, 2) = CP/(1 + r)^n 
End Sub 

Вот макет таблицы:

enter image description here

Когда я запустил программу, произошла ошибка.

enter image description here

enter image description here

Может кто-то здесь объяснить, что случилось в моей программе и как это исправить?

+0

Каковы значения 'n' и' i' при возникновении ошибки? – Rory

+0

@Rory Я не знаю, как проверить эти значения: '( –

+0

Вид -> Непосредственное окно, затем в виде непосредственного окна? например? I и затем нажмите кнопку ввода. Могу ли я предположить, что число в i равно 162? – 99moorem

ответ

1

Является ли ваше уравнение для S правильным? Похоже, что это должно быть:

S = M * CB * (p^i) ... 

вместо

S = M * CB * (p^n) ... 

Если уравнение действительно так, то вы можете использовать БИНОМРАСП вместо COMBIN, потому что по определению:

Binom_Dist(i, n, p, False) = (p^i) * (1 - p)^(n - i) * Combin(n, i) 

Таким образом, ваш код будет:

S = M * WorksheetFunction.Binom_Dist(i, n, p, False) 

вместо

CB = WorksheetFunction.Combin(n, i) 
S = M * CB * (p^n) * (1 - p)^(n - i) 

БИНОМРАСП не столь чувствителен к большому п, я.

1

Вы получаете ошибку переполнения. Если вы проверяете на рабочем листе:

COMBIN(5000, 161) = 3.3E+307 
COMBIN(5000, 162) = #NUM! 

COMBIN(5000, 4838) = #NUM! 
COMBIN(5000, 4839) = 3.3E+307 

Помните, что количество комбинаций экспоненциально возрастает до точки на полпути, в котором он начнет идти вниз по обратной скорости.

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