1
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)...

谢谢

4

1 回答 1

3

我不知道您要做什么,但是这个问题已经被描述了很多次了,所以它不再有趣了。

让我们画一张图:

你从

dt = T / nsteps;

这是我的第一个危险信号。

然后你做:

if t==T

在哪里t = t + dt

为什么这是错的?因为这个奇妙的东西叫做量化。换句话说,会有一段时间,因为超小的微差,结果是不正确的。nsteps 越大,情况就越糟。

然后雪上加霜,你把这条线放进去

elseif t<T ... end

这意味着您的代码将跳过所有内容,并且您不会返回任何内容,从而导致您的代码崩溃。

如何解决这个问题?如果您可以移动整数而不是浮动值,那么您将处于更好的位置。因此,您可以拥有 dt 而不是 dt,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
于 2012-11-18T21:24:04.343 回答