Код рекурсивного биномиального дерева, не может сделать больше 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
Другие вопросы по тегам