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)......
由于
答案 0 :(得分:2)
我不知道你要做什么,但是这个问题已经被描述了很多次,所以它不再有趣了。
让我们画一幅画:
你从
开始dt = T / nsteps;
这是我的第一个红旗。
然后你做:
if t==T
其中t = t + dt
为什么这是错的?因为这个奇妙的东西叫量化。换句话说,有一段时间由于超小的微差异,结果将是不正确的。更大的步骤,这将是更糟糕的。
然后再加上侮辱伤害,你把这一行放在
中elseif t<T ... end
这意味着您的代码将跳过所有内容,并且您将不会返回任何内容,从而导致代码崩溃。
如何解决这个问题?如果你可以移动整数而不是浮动值,你将处于更好的位置。因此,您可以使用currentStep
代替dt,这样:
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