- %二叉树+亚式期权
- % tree
- %avgVinEachPath -各个节点各个路径均值
- %亚式期权
- function [btree,asianoption]=asoption(S0,K,delta,sigma,n)
- S0=100;%初始价格
- K=105;%行权价
- delta=0.1;%
- sigma=0.5;%波动率
- r=0.1;%无风险利率
- n=1000;%步长
- %
- u=exp(r*delta+sigma*sqrt(delta));
- d=1/u;
- p=(1+r-d)/(u-d);
- q=1-p;
- %1
- %q=0.5
- %a=exp(r*delta);
- %d=a-a*sqrt(exp(sigma^2*delta)-1);
- %u=a+a*sqrt(exp(sigma^2*delta)-1)
- %2
- %q=0.5;
- %a=exp(r*delta);
- %d=a-sigma*sqrt(delta);
- %u=a+sigma*sqrt(delta);
- %3
- %q=0.5
- %d=exp((r-sigma^2/2)*delta-sigma*sqrt(delta));
- %u=exp((r-sigma^2/2)*delta+sigma*sqrt(delta));
- %求各个节点的值
- btree=zeros(n+1);
- btree(1,1)=S0;
- for i=1:n
- for j=0:i
- btree(i+1,j+1)=S0^u^j*d^(i-j);
- end;
- end;
- %计算各个节点各个路径的均值
- avgVinEachPath(1,1)=S0;
- for i=2:n+1;
- path=i*(i-1)/2;
- %每行的第一个节点和最后一个节点
- avgVinEachPath(path+1,1)=(avgVinEachPath(i-1,1)*(i-1)+btree(i,1))/i;
- avgVinEachPath(path+i,1)=(avgVinEachPath(i-1,1)*(i-1)+btree(i,i))/i;
- %每行中的其他点
- for j=2:i-1
- nplc=(i-1)*(i-2)/2+j-1;
- nprc=nplc+1;
- l1=length(find(avgVinEachPath(nplc,:)>0));
- r1=length(find(avgVinEachPath(nprc,:)>0));
- count=1;
- for lk=1:l1
- avgVinEachPath(path+j,count)=(avgVinEachPath(nplc,lk)*(i-1)+btree(i,j))/i;
- count=count+1;
- end;
- for rk=1:r1
- avgVinEachPath(path+j,count)=(avgVinEachPath(nprc,rk)*(i-1)+btree(i,j))/i;
- count=count+1;
- end
- end
- end
- %计算payoff
- i=n+1;
- j=n+1;
- path=i*(i-1)/2;
- %取出默末期节点的路径均值
- temp=avgVinEachPath(path+1:path+j,:);
- %求max(avg-E,0)
- temp=temp-K;
- temp(temp<0)=0;
- %乘上节点相应的涨跌概率
- for i=1:n+1
- temp(i,:)=temp(i,:)*q^(n+1-i)*p^(i-1);
- end
- %求和并乘上exp(-风险率*期数)
- asianoption=sum(sum(temp))*exp(-r*n);
-
复制代码程序不知道哪里出了问题,在死循环中无法运行成功…求大神指点…感觉是
计算各个节点各个路径的均值那里错了……