Код рекурсивного биномиального дерева, не может сделать больше 5 шагов... почему?
function [y]=AmericanPutClassic (St,t)
% S0 = 100;
K = 100;
r = 0.05;
sigma = 0.3;
T = 2;
nsteps = 5;
% St
dt = T / nsteps;
u=exp(sigma*sqrt(dt));
d=1/u;
Pu=(exp(r*dt)-d)/(u-d);
Pd=1-Pu;
if t==T
y=max(K-St,0);
return
elseif t<T
upPrice=AmericanPutClassic(St*u,t+dt);
downPrice=AmericanPutClassic(St*d,t+dt);
PrevPrice=(Pu*upPrice+Pd*downPrice)*exp(-r*dt);
if max(K-St,0) > PrevPrice
y=max(K-St,0);
else
y=PrevPrice;
end
return
end
end
Я думаю, что мой код выполняет свою работу, но когда я делаю 'nsteps' выше 5, он ломается... Я продолжаю получать разные ошибки... теперь он просто говорит, что есть проблема с моим кодом, когда его значение больше 5... прежде чем он скажет: "??? Максимальный предел рекурсии 500 достигнут. Используйте set(0,'RecursionLimit',N), чтобы изменить предел. Имейте в виду, что превышение доступного пространства стека может привести к сбою MATLAB и / или вашего компьютера."
Кто-нибудь может определить проблему? Я начинаю с вызова AmericanPutClassic(100,0)...
Спасибо
1 ответ
Я не знаю, что вы пытаетесь сделать, но эта проблема описана так много раз на ТАК, что это уже не смешно.
Давайте нарисуем картину:
Вы начинаете с
dt = T / nsteps;
это мой первый красный флаг.
тогда вы делаете:
if t==T
где t = t + dt
Почему это не так? Из-за этой замечательной вещи, называемой квантованием. Другими словами, будет время, когда из-за очень маленькой микроразницы результат будет неправильным. Чем больше шагов, тем хуже будет.
А затем, чтобы добавить оскорбление раны, вы помещаете эту строку в
elseif t<T ... end
Это означает, что ваш код пропустит все, и вы ничего не вернете, что приведет к сбою кода.
Как решить это? Если вы можете перемещать целые числа вместо плавающих значений, вы окажетесь в лучшем положении. Таким образом, вместо дт, вы можете иметь currentStep
такой, что:
function [y]=AmericanPutClassic (St, currentStep)
if nargin < 2
currentStep = 0;
end
...
if currentStep>=nsteps % if t==T
...
else
...
upPrice=AmericanPutClassic(St*u,currentStep+1);
...
end