function putprice = lookbackusa(s0,sigma,rfrate,q,t,ngrid)
%计算美式看跌回望期权价格的函数
%计算构建二叉树所需要的参数
a=exp((rfrate-q)*t/ngrid);
u=exp(sigma*(t/ngrid)^0.5);
d=1/u;
p=(a-d)/(u-d);
q=1-p;
X=cell(ngrid+1,ngrid+1);
for i=1:(ngrid+1)
for j=1:i
for k=1:j
X{i,j}.StrikeV(k)=S(s0,u,d,i-k+1,j-k+1)-S(s0,u,d,i,j);
end;
if(i==ngrid+1)
X{ngrid+1,j}.OptV=X{ngrid+1,j}.StrikeV;
end;
end;
end;
for subi=ngrid:-1:1
for subj=1:subi
X{subi,subj}.NoStrikeV(1)=exp(-rfrate*t/ngrid)*...
(p*X{subi+1,subj}.OptV(1)+q*X{subi+1,subj+1}.OptV(2));
if(subj>1)
for subk=2:subj
X{subi,subj}.NoStrikeV(subk)=exp(-rfrate*t/ngrid)*...
(p*X{subi+1,subj}.OptV(subk-1)+q*X{subi+1,subj+1}.OptV(subk+1));
end;
end;
X{subi,subj}.OptV=max(X{subi,subj}.NoStrikeV,X{subi,subj}.StrikeV);
end;
end;
putprice=X{1,1}.OptV;
end
function s=S(szero,u,d,i,j)
s=szero*u^(i-1)*d^(2*(j-1));
end