The first Hull–White model was described by John C. Hull and Alan White in 1990. The model is still popular in the market today.
来源:Hull的《期权期货与其他衍生品》
Hull-White三叉树实现分为两阶段
第一阶段:
本帖隐藏的内容
- %% 函数构建Hull_White三叉树
- %% Hull_White三叉树的第一步构建
- %% 监控步骤请参考Hull的期权期货和其他衍生品
- %% by fantuanxiaot
- function [InitialTree,ProTree,IdTree,DisplayMatrix]=HullWhiteTree_First(T,N,Sigma,A)
- %% InitialTree是HullWhite第一步建模的初始树
- %% ProTree是概率树
- %% DisplayMatrix是显示树结点
- %% IdTree是树的地址
- %% T是利率树的时间
- %% N,Sigma,A都是参数
- %% 举例:[InitialTree,ProTree,IdTree,DisplayMatrix]=HullWhiteTree_First(3,3,0.01,0.1)
- %% [InitialTree,ProTree,IdTree,DisplayMatrix]=HullWhiteTree_First(3,6,0.01,0.1)
- % 最大的结点
- deltaT=T/N;
- MaxBin=ceil(0.184/(A*(deltaT)));
- %% 构建初始的利率树
- InitialTree=zeros(2*MaxBin+1,N);
- deltaR=Sigma*sqrt(3*deltaT);
- ProTree=cell(2*MaxBin+1,N);
- % ProTree内存储Pu/Pm/Pd的三个元素
- IdTree=cell(2*MaxBin+1,N);
- DisplayMatrix=cell(N,4);
- %% 构建树
- Index=1;
- for i=1:N
- if i<=MaxBin
- RateV=i-1:-1:1-i;
- for j=1:2*(i-1)+1
- % 第一棵树
- InitialTree(j,i)=RateV(j)*deltaR;
- Pu=1/6+1/2*((A*RateV(j)*deltaT)^2-A*RateV(j)*deltaT);
- Pm=2/3-(A*RateV(j)*deltaT)^2;
- Pd=1/6+1/2*((A*RateV(j)*deltaT)^2+A*RateV(j)*deltaT);
- % 第二棵树
- ProTree{j,i}=[Pu;Pm;Pd];
- % 第三棵树
- IdTree{j,i}=[i-1,RateV(j)]' ;
- % 第四棵树
- DisplayMatrix(Index,:)=num2cell([Index Pu Pm Pd]);
- Index=Index+1;
- end
- end
- if i>=MaxBin+1
- RateV=MaxBin:-1:-MaxBin;
- for j=1:2*MaxBin+1
- % 第一棵树
- InitialTree(j,i)=RateV(j)*deltaR;
- % 第三棵树
- IdTree{j,i}=[i-1,RateV(j)]';
- if j==1
- Pu=7/6+0.5*((A*RateV(j)*deltaT)^2-3*(A*RateV(j)*deltaT));
- Pm=-1/3-(A*RateV(j)*deltaT)^2+2*(A*RateV(j)*deltaT);
- Pd=1/6+0.5*((A*RateV(j)*deltaT)^2-A*RateV(j)*deltaT);
- elseif j==2*MaxBin+1
- Pu=1/6+1/2*((A*RateV(j)*deltaT)^2+A*RateV(j)*deltaT);
- Pm=-1/3-(A*RateV(j)*deltaT)^2-2*(A*RateV(j)*deltaT);
- Pd=7/6+0.5*((A*RateV(j)*deltaT)^2+3*(A*RateV(j)*deltaT));
- else
- Pu=1/6+1/2*((A*RateV(j)*deltaT)^2-A*RateV(j)*deltaT);
- Pm=2/3-(A*RateV(j)*deltaT)^2;
- Pd=1/6+1/2*((A*RateV(j)*deltaT)^2+A*RateV(j)*deltaT);
- end
- ProTree{j,i}=[Pu;Pm;Pd];
- % 第四棵树
- DisplayMatrix(Index,:)=num2cell([Index Pu Pm Pd]);
- Index=Index+1;
- end
- end
- end
- %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
实现初步树
Hull期权期货结果:
[InitialTree,ProTree,IdTree,DisplayMatrix]=HullWhiteTree_First(3,3,0.01,0.1)
(deltaT=1年)
Hull书籍结果
(deltaT=1年)
:
Matlab结果(deltaT=1年):
另外一个例子(deltaT=半年):
[InitialTree,ProTree,IdTree,DisplayMatrix]=HullWhiteTree_First(3,6,0.01,0.1)
第二阶段:
第二阶段 依据第一阶段 构建的初始树与当前的利率期限结构建模:
本帖隐藏的内容
- %% HullWhite三叉树的第二阶段
- %% 第一阶段得到了初始的树
- %% 第二阶段拟合当前的利率期限结构
- function [FirstTree,SecondTree,ProTree,QTree]=HullWhiteTree_Second(T,N,Sigma,A,RateTerm)
- %% 举例:[FirstTree,SecondTree,~,QTree]=HullWhiteTree_Second(3,3,0.01,0.1,[3.824/100 4.512/100 5.086/100])
- %% [FirstTree,SecondTree,~,QTree]=HullWhiteTree_Second(3,6,0.01,0.1,[0.0343 0.03824 0.04183 4.512/100 0.04812 5.086/100])
- %% [FirstTree,SecondTree,~,QTree]=HullWhiteTree_Second(4,8,0.01,0.1,[0.03 0.0343 ...
- %% 0.03824 0.04183 4.512/100 0.04812 5.086/100 0.056])
- %% RateTerm是利率的期限结构
- %% 利率树采用连续利率
- %% 先得到第一棵树
- if length(RateTerm)~=N
- error('Reset Your RateTerm');
- end
- deltaT=T/N;
- MaxBin=ceil(0.184/(A*(deltaT)));
- [FirstTree,ProTree,~,~]=HullWhiteTree_First(T,N,Sigma,A);
- SecondTree=FirstTree;
- %% 构建二期树
- QTree=zeros(2*MaxBin+1,N);
- Alpha=zeros(length(RateTerm),1);
- for i=1:N
- % 第一列
- if i==1
- QTree(i,1)=1;
- Alpha(i)=RateTerm(i);
- SecondTree(i,1)=SecondTree(i,1)+Alpha(i);
- end
- % 第二列
- if i==2
- Price=exp(-RateTerm(i)*i);
- Sum=0;
- for j=1:3
- Probability=ProTree{1,1};
- QTree(j,i)=QTree(1,1)*Probability(j)*exp(-SecondTree(1,1)*deltaT);
- Sum=Sum+QTree(j,i)*exp(-SecondTree(j,i)*deltaT);
- end
- Alpha(i)=(log(Sum)-log(Price))/deltaT;
- SecondTree(1:3,i)=SecondTree(1:3,i)+Alpha(i);
- end
- % 三列以后
- if i>=3
- if i<=MaxBin+1
- Price=exp(-RateTerm(i)*i);
- Sum=0;
- for j=1:2*(i-1)+1
- % 顶端
- if j==1
- Probability=ProTree{j,i-1};
- QTree(j,i)=Probability(1)*QTree(j,i-1)*exp(-SecondTree(j,i-1)*deltaT);
- Sum=Sum+QTree(j,i)*exp(-SecondTree(j,i)*deltaT);
- % 最下端
- elseif j==2*(i-1)+1
- Probability=ProTree{j-2,i-1};
- QTree(j,i)=Probability(3)*QTree(j-2,i-1)*exp(-SecondTree(j-2,i-1)*deltaT);
- Sum=Sum+QTree(j,i)*exp(-SecondTree(j,i)*deltaT);
- % 上一端
- elseif j==2
- Probability1=ProTree{j-1,i-1};
- Probability2=ProTree{j,i-1};
- QTree(j,i)=QTree(j,i)+Probability1(2)*QTree(j-1,i-1)*exp(-SecondTree(j-1,i-1)*deltaT);
- QTree(j,i)=QTree(j,i)+Probability2(1)*QTree(j,i-1)*exp(-SecondTree(j,i-1)*deltaT);
- Sum=Sum+QTree(j,i)*exp(-SecondTree(j,i)*deltaT);
- % 下一端
- elseif j==2*(i-1)
- Probability1=ProTree{j-2,i-1};
- Probability2=ProTree{j-1,i-1};
- QTree(j,i)=QTree(j,i)+Probability1(3)*QTree(j-2,i-1)*exp(-SecondTree(j-2,i-1)*deltaT);
- QTree(j,i)=QTree(j,i)+Probability2(2)*QTree(j-1,i-1)*exp(-SecondTree(j-1,i-1)*deltaT);
- Sum=Sum+QTree(j,i)*exp(-SecondTree(j,i)*deltaT);
- else
- Probability1=ProTree{j-2,i-1};
- Probability2=ProTree{j-1,i-1};
- Probability3=ProTree{j,i-1};
- QTree(j,i)=QTree(j,i)+Probability1(3)*QTree(j-2,i-1)*exp(-SecondTree(j-2,i-1)*deltaT);
- QTree(j,i)=QTree(j,i)+Probability2(2)*QTree(j-1,i-1)*exp(-SecondTree(j-1,i-1)*deltaT);
- QTree(j,i)=QTree(j,i)+Probability3(1)*QTree(j,i-1)*exp(-SecondTree(j,i-1)*deltaT);
- Sum=Sum+QTree(j,i)*exp(-SecondTree(j,i)*deltaT);
- end
- end
- Alpha(i)=(log(Sum)-log(Price))/deltaT;
- SecondTree(1:2*(i-1)+1,i)=SecondTree(1:2*(i-1)+1,i)+Alpha(i);
- end
- % 到了横列
- if i>MaxBin+1
- Price=exp(-RateTerm(i)*i);
- Sum=0;
- for j=1:2*MaxBin+1
- % 顶端
- if j==1
- Probability1=ProTree{j,i-1};
- Probability2=ProTree{j+1,i-1};
- QTree(j,i)=QTree(j,i)+Probability1(2)*QTree(j,i-1)*exp(-SecondTree(j,i-1)*deltaT);
- QTree(j,i)=QTree(j,i)+Probability2(3)*QTree(j+1,i-1)*exp(-SecondTree(j+1,i-1)*deltaT);
- Sum=Sum+QTree(j,i)*exp(-SecondTree(j,i)*deltaT);
- % 底端
- elseif j==2*MaxBin+1
- Probability1=ProTree{j-1,i-1};
- Probability2=ProTree{j,i-1};
- QTree(j,i)=QTree(j,i)+Probability1(3)*QTree(j-1,i-1)*exp(-SecondTree(j-1,i-1)*deltaT);
- QTree(j,i)=QTree(j,i)+Probability2(2)*QTree(j-1,i-1)*exp(-SecondTree(j-1,i-1)*deltaT);
- Sum=Sum+QTree(j,i)*exp(-SecondTree(j,i)*deltaT);
- else
- Probability1=ProTree{j-1,i-1};
- Probability2=ProTree{j,i-1};
- Probability3=ProTree{j+1,i-1};
- QTree(j,i)=QTree(j,i)+Probability1(3)*QTree(j-1,i-1)*exp(-SecondTree(j-1,i-1)*deltaT);
- QTree(j,i)=QTree(j,i)+Probability2(2)*QTree(j,i-1)*exp(-SecondTree(j,i-1)*deltaT);
- QTree(j,i)=QTree(j,i)+Probability3(1)*QTree(j+1,i-1)*exp(-SecondTree(j+1,i-1)*deltaT);
- Sum=Sum+QTree(j,i)*exp(-SecondTree(j,i)*deltaT);
- end
- end
- Alpha(i)=(log(Sum)-log(Price))/deltaT;
- SecondTree(1:2*MaxBin+1,i)=SecondTree(1:2*MaxBin+1,i)+Alpha(i);
- end
- end
- end
- %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
具体实现:
Hull书籍例子:
[FirstTree,SecondTree,~,QTree]=HullWhiteTree_Second(3,3,0.01,0.1,[3.824/100 4.512/100 5.086/100])结果可见SecondTree(第二阶段利率树):
[FirstTree,SecondTree,~,QTree]=HullWhiteTree_Second(3,6,0.01,0.1,[0.0343 0.03824 0.04183 4.512/100 0.04812 5.086/100])
[FirstTree,SecondTree,~,QTree]=HullWhiteTree_Second(4,8,0.01,0.1,[0.03 0.0343 ...
0.03824 0.04183 4.512/100 0.04812 5.086/100 0.056])