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条答案
按热度按时间qgelzfjb1#
我不知道你想做什么,但这个问题已经被描述了这么多次,所以它不再有趣了。
让我们画一幅画:
你一开始就是这样
这是我的第一个危险信号。
然后,您需要:
其中
t = t + dt
这有什么不对的?因为有一种奇妙的东西叫做量子化。换句话说,总会有一段时间,因为超微小的微小差异,结果将不会正确。NSteps越大,情况就越糟糕。
然后雪上加霜的是,你把这行字
这意味着您的代码将跳过所有内容,并且不会返回任何内容,从而导致代码崩溃。
如何解决这个问题呢?如果您可以移动整数而不是浮点值,您将处于更有利的位置。因此,您可以使用
currentStep
来代替dt,这样: