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 の代わりに、次の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 に答える