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三叉树算法恶心死啦,但是这次结果绝对木有问题:
Black-Karanskl三叉树的实现类似于Hull-White三叉树,第一阶段根据Hull-White三叉树,第二阶段需要用数值方法求解方程,但是感觉很奇怪,有时候解方程解不出来,自己找不出问题在哪,有问题请告诉我,欢迎指正,Hull书上的结果得到了(1~3期的结果),但是(4~6期的得不出来,书上也没有结果)。
对比一下
[FirstTree,RateTree,XTree,QTree]=BlackKarasnskiTree(3,6,0.25,0.22,[0.0343 0.03824 0.04183 4.512/100 0.04812 5.086/100])
本帖隐藏的内容
- function [FirstTree,RateTree,XTree,QTree]=BlackKarasnskiTree(T,N,Sigma,A,RateTerm)
- %% Black-Karasnski三叉树的实现
- %% by fantuanxiaot
- %% 具体可见RateTree
- %% [FirstTree,RateTree,XTree,QTree]=BlackKarasnskiTree(3,6,0.25,0.22,[0.0343 0.03824 0.04183 4.512/100 0.04812 5.086/100])
- %% [FirstTree,RateTree,XTree,QTree]=BlackKarasnskiTree(3,6,0.02,0.1,[0.0343 0.03824 0.04183 4.512/100 0.04812 5.086/100])
- %% [FirstTree,RateTree,XTree,QTree]=BlackKarasnskiTree(3,8,0.25,0.22,...
- %% [0.025 0.03 0.0343 0.03824 0.04183 4.512/100 0.04812 5.086/100])
- 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);
- %% 构建二期树
- QTree=zeros(2*MaxBin+1,N);
- RateTree=zeros(2*MaxBin+1,N);
- Alpha=zeros(length(RateTerm),1);
- XTree=zeros(2*MaxBin+1,N);
- for i=1:N
- % 第一列
- if i==1
- QTree(i,1)=1;
- Alpha(i)=log(RateTerm(i));
- XTree(1,1)=Alpha(i);
- RateTree(i,1)=FirstTree(i,1)+exp(Alpha(i));
- end
- % 第二列
- if i==2
- Price=exp(-RateTerm(i)*i*deltaT);
- Probability=ProTree{1,1};
- QTree(1:3,i)=QTree(1,1)*Probability*exp(-exp(Alpha(i-1))*deltaT);
- fun=@(alpha)(Price-sum(QTree(1:3,i).*exp(-deltaT*(exp(alpha+FirstTree(1:3,i))))));
- % 求解alpha值
- Alpha(i)=fsolve(fun,-3,optimset('MaxIter',200,'TolFun',1e-8));
- XTree(1:3,i)=Alpha(i)+FirstTree(1:3,i);
- RateTree(1:3,i)=exp(XTree(1:3,i));
- end
- % 三列以后
- if i>=3
- if i<=MaxBin+1
- Price=exp(-RateTerm(i)*i*deltaT);
- % 先得到Q值
- 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(-exp(Alpha(i-1)+FirstTree(1,i-1))*deltaT);
- % 底端
- elseif j==2*(i-1)+1
- Probability=ProTree{j-2,i-1};
- QTree(j,i)=Probability(3)*QTree(j-2,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j-2,i-1))*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(-exp(Alpha(i-1)+FirstTree(j-1,i-1))*deltaT);
- QTree(j,i)=QTree(j,i)+Probability2(1)*QTree(j,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j,i-1))*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(-exp(Alpha(i-1)+FirstTree(j-2,i-1))*deltaT);
- QTree(j,i)=QTree(j,i)+Probability2(2)*QTree(j-1,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j-1,i-1))*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(-exp(Alpha(i-1)+FirstTree(j-2,i-1))*deltaT);
- QTree(j,i)=QTree(j,i)+Probability2(2)*QTree(j-1,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j-1,i-1))*deltaT);
- QTree(j,i)=QTree(j,i)+Probability3(1)*QTree(j,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j,i-1))*deltaT);
- end
- end
- fun=@(alpha)(Price-sum(QTree(1:2*(i-1)+1,i).*exp(-deltaT*(exp(alpha+FirstTree(1:2*(i-1)+1,i))))));
- Alpha(i)=fsolve(fun,-3,optimset('MaxIter',200,'TolFun',1e-8));
- XTree(1:2*(i-1)+1,i)=Alpha(i)+FirstTree(1:2*(i-1)+1,i);
- RateTree(1:2*(i-1)+1,i)=exp(XTree(1:2*(i-1)+1,i));
- end
- % 到了横列
- if i>=MaxBin+2
- Price=exp(-RateTerm(i)*i*deltaT);
- 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(-exp(Alpha(i-1)+FirstTree(j,i-1))*deltaT);
- QTree(j,i)=QTree(j,i)+Probability2(1)*QTree(j+1,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j+1,i-1))*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(-exp(Alpha(i-1)+FirstTree(j-1,i-1))*deltaT);
- QTree(j,i)=QTree(j,i)+Probability2(2)*QTree(j,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j,i-1))*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(-exp(Alpha(i-1)+FirstTree(j-1,i-1))*deltaT);
- QTree(j,i)=QTree(j,i)+Probability2(2)*QTree(j,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j,i-1))*deltaT);
- QTree(j,i)=QTree(j,i)+Probability3(1)*QTree(j+1,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j+1,i-1))*deltaT);
- end
- end
- fun=@(alpha)(Price-sum(QTree(1:2*MaxBin+1,i).*exp(-deltaT*(exp(alpha+FirstTree(1:2*MaxBin+1,i))))));
- Alpha(i)=fsolve(fun,-3,optimset('MaxIter',500,'TolFun',1e-10));
- XTree(1:2*MaxBin+1,i)=Alpha(i)+FirstTree(1:2*MaxBin+1,i);
- RateTree(1:2*MaxBin+1,i)=exp(XTree(1:2*MaxBin+1,i));
- end
- end
- end
- %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


雷达卡







京公网安备 11010802022788号







