HullWhiteTree_First的第一阶段函数也在此帖
Matlab的Hull-White三叉树实现
这个帖子的第二阶段hull-white算法有缺陷,本帖对其纠正:源码如下
本帖隐藏的内容
- %% 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*deltaT);
- 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*deltaT);
- 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*deltaT);
- 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(1)*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-White三叉树算法恶心死啦,但是这次结果绝对木有问题: