2012-11-18 15 views
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和/或你的電腦。「遞歸二叉樹代碼,不能做超過5個步驟...爲什麼?

任何人都可以發現問題嗎? 我通過調用AmericanPutClassic(100,0)開始......

感謝

回答

2

我不知道你想做什麼,但這個問題已經被描述這麼多的時間,所以它不是好笑了。

讓我們來畫一幅畫:

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