主程序:
[a,b]=Two_and_Three(10,12,1,0.03,0.16,10)
代码如下:
本帖隐藏的内容
- function [Two_Call_Option_Pricing_Matrix,Three_Call_Option_Pricing_Matrix]=Two_and_Three(varargin)
- % copyright by fantuanxiaot
- % 关注fantuanxiaot的量化分析新浪博客:http://blog.sina.com.cn/u/2029278253
- % 期权定价作图的二叉树图和三叉树图
- % Rate年无风险收益率,K是执行价格,T是到期时间(以年计量)
- % Sigma是年波动率,S是基期价格
- % N是划分的时间段数
- % 参数的输入
- S=varargin{1};
- K=varargin{2};
- T=varargin{3};
- Rate=varargin{4};
- Sigma=varargin{5};
- N=varargin{6};
- % 单期收益率
- r=Rate*T/360/N;
- DeltaT=T/N;
- %% 二叉树期权定价矩阵:Two_Call_Option_Pricing_Matrix
- % 初始化期权价格矩阵
- Two_Call_Option_Pricing_Matrix=zeros(N+1);
- % 在Q测度下的风险中性概率
- U=exp(Sigma*sqrt(DeltaT));
- D=1/U;
- P=(exp(r*DeltaT)-D)/(U-D);
- % 最后一列的期权价值
- for i=1:N+1
- Two_Call_Option_Pricing_Matrix(i,N+1)=max(0,S*D^(i-1)*U^(N+1-i)-K);
- end
- % 期权价值向前推移
- % Call_Option_Pricing_Matrix形成了期权价格递归矩阵
- for j=N:-1:1
- for i=1:j
- Two_Call_Option_Pricing_Matrix(i,j)=exp(-DeltaT*r)*...
- (Two_Call_Option_Pricing_Matrix(i,j+1)*P+Two_Call_Option_Pricing_Matrix(i+1,j+1)*(1-P));
- end
- end
- %% 三叉树期权定价矩阵:Three_Call_Option_Pricing_Matrix
- % 初始化期权价格矩阵
- Three_Call_Option_Pricing_Matrix=zeros(2*N+1,N+1);
- U=exp(Sigma*sqrt(3*DeltaT));
- D=1/U;
- % 在Q测度下的风险中性概率
- PU=1/6-(r-(Sigma*T/N)^2/2)*sqrt(DeltaT/(12*(Sigma*T/N)^2));
- PM=2/3;
- PD=1/6+(r-(Sigma*T/N)^2/2)*sqrt(DeltaT/(12*(Sigma*T/N)^2));
- for j=1:(2*N+1)
- Three_Call_Option_Pricing_Matrix(j,N+1)=max(S*U^(N+1-j)-K,0);
- end
- for i=N:-1:1
- for j=1:(2*i-1)
- Three_Call_Option_Pricing_Matrix(j,i)=exp(-DeltaT*r)*(PU*Three_Call_Option_Pricing_Matrix(j,i+1)...
- +PM*Three_Call_Option_Pricing_Matrix(j+1,i+1)+PD*Three_Call_Option_Pricing_Matrix(j+2,i+1));
- end
- end
- %% 二叉树期权定价作图
- figure(1)
- set(figure(1),'color','w')
- hold on
- xlim([-0.1 1.1])
- ylim([-0.1 1.1])
- % 先形成期权定价位置元胞矩阵:position_matrix
- for i=1:(N+1)
- position_matrix{i,N+1}=[1 (N+1-i)/N];
- end
- for i=1:N
- high=0.5-(i-1)/N*0.5;
- if i==1
- delta=0;
- else
- delta=(1-2*high)/(i-1);
- end
- for j=1:i
- position_matrix{j,i}=[(i-1)/N 1-high-(j-1)*delta];
- end
- end
- for i=1:N
- for j=1:i
- position_1=[position_matrix{j,i};position_matrix{j,i+1}];
- hold on
- if mod(i,2)==0
- plot(position_1(:,1)+0.02,position_1(:,2),'go-','markersize',16,...
- 'markerfacecolor','g','markeredgecolor','w')
- position_2=[position_matrix{j,i};position_matrix{j+1,i+1}];
- plot(position_2(:,1)+0.02,position_2(:,2),'go-','markersize',16,...
- 'markerfacecolor','g','markeredgecolor','w')
- else
- plot(position_1(:,1)+0.02,position_1(:,2),'mo-','markersize',16,...
- 'markerfacecolor','m','markeredgecolor','w')
- position_2=[position_matrix{j,i};position_matrix{j+1,i+1}];
- plot(position_2(:,1)+0.02,position_2(:,2),'mo-','markersize',16,...
- 'markerfacecolor','m','markeredgecolor','w')
- end
- end
- end
- hold on
- if mod(N+1,2)==0
- for i=1:(N+1)
- pos=position_matrix{i,N+1};
- plot(pos(1)+0.02,pos(2),'go-','markersize',16,...
- 'markerfacecolor','g','markeredgecolor','w')
- end
- else
- for i=1:(N+1)
- pos=position_matrix{i,N+1};
- plot(pos(1)+0.02,pos(2),'mo-','markersize',16,...
- 'markerfacecolor','m','markeredgecolor','w')
- end
- end
- hold on
- for i=1:(N+1)
- for j=1:i
- index=num2str(Two_Call_Option_Pricing_Matrix(j,i));
- pos=position_matrix{j,i};
- text(pos(1),pos(2),index,'fontsize',10,'fontname','Times New Roman');
- end
- end
- title('欧式看涨期权定价的二叉树作图','fontsize',16,'fontname','楷体')
- ylabel('Call Options Value','fontsize',16,'fontname','Times New Roman')
- xlabel('时间分段','fontsize',16,'fontname','楷体')
- hold off
- %% 三叉树期权定价作图
- clear position_matrix
- figure(2)
- set(figure(2),'color','w')
- hold on
- xlim([-0.1 1.1])
- ylim([-0.1 1.1])
- % 三叉树的position_matrix生成
- % 三叉树位置元胞的最后一列生成
- for i=1:(2*N+1)
- position_matrix{i,N+1}=[1 (2*N+1-i)/(2*N)];
- end
- for i=1:N
- high=0.5-(i-1)/N*0.5;
- if i==1
- delta=0;
- else
- delta=(1-2*high)/(2*(i-1));
- end
- for j=1:(2*(i-1)+1)
- position_matrix{j,i}=[(i-1)/N 1-high-(j-1)*delta];
- end
- end
- hold on
- for i=1:N
- for j=1:(2*(i-1)+1)
- position_1=[position_matrix{j,i};position_matrix{j,i+1}];
- position_2=[position_matrix{j,i};position_matrix{j+1,i+1}];
- position_3=[position_matrix{j,i};position_matrix{j+2,i+1}];
- hold on
- if mod(i,3)==0
- plot(position_1(:,1)+0.02,position_1(:,2),'ro-','markersize',16,...
- 'markerfacecolor','r','markeredgecolor','w')
- plot(position_2(:,1)+0.02,position_2(:,2),'ro-','markersize',16,...
- 'markerfacecolor','r','markeredgecolor','w')
- plot(position_3(:,1)+0.02,position_3(:,2),'ro-','markersize',16,...
- 'markerfacecolor','r','markeredgecolor','w')
- elseif mod(i,3)==1
- plot(position_1(:,1)+0.02,position_1(:,2),'go-','markersize',16,...
- 'markerfacecolor','g','markeredgecolor','w')
- plot(position_2(:,1)+0.02,position_2(:,2),'go-','markersize',16,...
- 'markerfacecolor','g','markeredgecolor','w')
- plot(position_3(:,1)+0.02,position_3(:,2),'go-','markersize',16,...
- 'markerfacecolor','g','markeredgecolor','w')
- else
- plot(position_1(:,1)+0.02,position_1(:,2),'mo-','markersize',16,...
- 'markerfacecolor','m','markeredgecolor','w')
- plot(position_2(:,1)+0.02,position_2(:,2),'mo-','markersize',16,...
- 'markerfacecolor','m','markeredgecolor','w')
- plot(position_3(:,1)+0.02,position_3(:,2),'mo-','markersize',16,...
- 'markerfacecolor','m','markeredgecolor','w')
- end
- end
- end
- if mod(N+1,2)==0
- for i=1:(2*N+1)
- pos=position_matrix{i,N+1};
- plot(pos(1)+0.02,pos(2),'ro-','markersize',16,...
- 'markerfacecolor','r','markeredgecolor','w')
- end
- elseif mod(N,2)==1
- for i=1:(2*N+1)
- pos=position_matrix{i,N+1};
- plot(pos(1)+0.02,pos(2),'go-','markersize',16,...
- 'markerfacecolor','g','markeredgecolor','w')
- end
- else
- for i=1:(2*N+1)
- pos=position_matrix{i,N+1};
- plot(pos(1)+0.02,pos(2),'mo-','markersize',16,...
- 'markerfacecolor','m','markeredgecolor','w')
- end
- end
- hold on
- for i=1:(N+1)
- for j=1:(2*i-1)
- index=num2str(Three_Call_Option_Pricing_Matrix(j,i));
- pos=position_matrix{j,i};
- text(pos(1),pos(2),index,'fontsize',10,'fontname','Times New Roman');
- end
- end
- title('欧式看涨期权定价的三叉树作图','fontsize',16,'fontname','楷体')
- ylabel('Call Options Value','fontsize',16,'fontname','Times New Roman')
- xlabel('时间分段','fontsize',16,'fontname','楷体')
- hold off
- end