楼主: fantuanxiaot
32250 229

[源码分享] [原创]Black-Karanskl和Hull-White的Matlab三叉树实现[修正版by fantuanxiaot]   [分享]

助理

Ψ▄┳一大卫卍卐席尔瓦

大师

9%

还不是VIP/贵宾

-

威望
7
论坛币
-235076 个
通用积分
14.0175
学术水平
3780 点
热心指数
3816 点
信用等级
3451 点
经验
150465 点
帖子
7694
精华
32
在线时间
1322 小时
注册时间
2013-2-3
最后登录
2019-7-29

初级学术勋章 初级热心勋章 中级热心勋章 中级学术勋章 初级信用勋章 中级信用勋章 高级热心勋章 高级学术勋章 特级学术勋章 特级热心勋章 高级信用勋章 特级信用勋章

fantuanxiaot 发表于 2015-5-6 15:01:06 |显示全部楼层
本帖最后由 fantuanxiaot 于 2015-5-6 15:09 编辑

原帖:https://bbs.pinggu.org/thread-3697628-1-1.html

HullWhiteTree_First的第一阶段函数也在此帖

Matlab的Hull-White三叉树实现

这个帖子的第二阶段hull-white算法有缺陷,本帖对其纠正:源码如下

本帖隐藏的内容

  1. %%  HullWhite三叉树的第二阶段
  2. %%  第一阶段得到了初始的树
  3. %%  第二阶段拟合当前的利率期限结构
  4. function [FirstTree,SecondTree,ProTree,QTree]=HullWhiteTree_Second(T,N,Sigma,A,RateTerm)
  5. %%  举例:[FirstTree,SecondTree,~,QTree]=HullWhiteTree_Second(3,3,0.01,0.1,[3.824/100 4.512/100 5.086/100])
  6. %%  [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])
  7. %%  [FirstTree,SecondTree,~,QTree]=HullWhiteTree_Second(4,8,0.01,0.1,[0.03 0.0343 ...
  8. %%  0.03824 0.04183 4.512/100 0.04812 5.086/100 0.056])
  9. %%  RateTerm是利率的期限结构
  10. %%  利率树采用连续利率
  11. %%  先得到第一棵树
  12. if length(RateTerm)~=N
  13.     error('Reset Your RateTerm');
  14. end
  15. deltaT=T/N;
  16. MaxBin=ceil(0.184/(A*(deltaT)));
  17. [FirstTree,ProTree,~,~]=HullWhiteTree_First(T,N,Sigma,A);
  18. SecondTree=FirstTree;
  19. %%  构建二期树
  20. QTree=zeros(2*MaxBin+1,N);
  21. Alpha=zeros(length(RateTerm),1);
  22. for i=1:N
  23.     %  第一列
  24.     if i==1
  25.         QTree(i,1)=1;
  26.         Alpha(i)=RateTerm(i);
  27.         SecondTree(i,1)=SecondTree(i,1)+Alpha(i);
  28.     end
  29.     %  第二列
  30.     if i==2
  31.         Price=exp(-RateTerm(i)*i*deltaT);
  32.         Sum=0;
  33.         for j=1:3
  34.             Probability=ProTree{1,1};
  35.             QTree(j,i)=QTree(1,1)*Probability(j)*exp(-SecondTree(1,1)*deltaT);
  36.             Sum=Sum+QTree(j,i)*exp(-SecondTree(j,i)*deltaT);
  37.         end
  38.         Alpha(i)=(log(Sum)-log(Price))/deltaT;
  39.         SecondTree(1:3,i)=SecondTree(1:3,i)+Alpha(i);
  40.     end
  41.     %  三列以后
  42.     if i>=3
  43.         if i<=MaxBin+1
  44.             Price=exp(-RateTerm(i)*i*deltaT);
  45.             Sum=0;
  46.             for j=1:2*(i-1)+1
  47.                 %  顶端
  48.                 if j==1
  49.                     Probability=ProTree{j,i-1};
  50.                     QTree(j,i)=Probability(1)*QTree(j,i-1)*exp(-SecondTree(j,i-1)*deltaT);
  51.                     Sum=Sum+QTree(j,i)*exp(-SecondTree(j,i)*deltaT);
  52.                     %  最下端
  53.                 elseif j==2*(i-1)+1
  54.                     Probability=ProTree{j-2,i-1};
  55.                     QTree(j,i)=Probability(3)*QTree(j-2,i-1)*exp(-SecondTree(j-2,i-1)*deltaT);
  56.                     Sum=Sum+QTree(j,i)*exp(-SecondTree(j,i)*deltaT);
  57.                     %  上一端
  58.                 elseif j==2
  59.                     Probability1=ProTree{j-1,i-1};
  60.                     Probability2=ProTree{j,i-1};
  61.                     QTree(j,i)=QTree(j,i)+Probability1(2)*QTree(j-1,i-1)*exp(-SecondTree(j-1,i-1)*deltaT);
  62.                     QTree(j,i)=QTree(j,i)+Probability2(1)*QTree(j,i-1)*exp(-SecondTree(j,i-1)*deltaT);
  63.                     Sum=Sum+QTree(j,i)*exp(-SecondTree(j,i)*deltaT);
  64.                     %  下一端
  65.                 elseif j==2*(i-1)
  66.                     Probability1=ProTree{j-2,i-1};
  67.                     Probability2=ProTree{j-1,i-1};
  68.                     QTree(j,i)=QTree(j,i)+Probability1(3)*QTree(j-2,i-1)*exp(-SecondTree(j-2,i-1)*deltaT);
  69.                     QTree(j,i)=QTree(j,i)+Probability2(2)*QTree(j-1,i-1)*exp(-SecondTree(j-1,i-1)*deltaT);
  70.                     Sum=Sum+QTree(j,i)*exp(-SecondTree(j,i)*deltaT);                    
  71.                 else
  72.                     Probability1=ProTree{j-2,i-1};
  73.                     Probability2=ProTree{j-1,i-1};     
  74.                     Probability3=ProTree{j,i-1};
  75.                     QTree(j,i)=QTree(j,i)+Probability1(3)*QTree(j-2,i-1)*exp(-SecondTree(j-2,i-1)*deltaT);
  76.                     QTree(j,i)=QTree(j,i)+Probability2(2)*QTree(j-1,i-1)*exp(-SecondTree(j-1,i-1)*deltaT);
  77.                     QTree(j,i)=QTree(j,i)+Probability3(1)*QTree(j,i-1)*exp(-SecondTree(j,i-1)*deltaT);
  78.                     Sum=Sum+QTree(j,i)*exp(-SecondTree(j,i)*deltaT);   
  79.                 end
  80.             end
  81.             Alpha(i)=(log(Sum)-log(Price))/deltaT;
  82.             SecondTree(1:2*(i-1)+1,i)=SecondTree(1:2*(i-1)+1,i)+Alpha(i);      
  83.         end
  84.         %  到了横列
  85.         if i>MaxBin+1
  86.             Price=exp(-RateTerm(i)*i*deltaT);
  87.             Sum=0;           
  88.             for j=1:2*MaxBin+1
  89.                 %  顶端
  90.                 if j==1
  91.                     Probability1=ProTree{j,i-1};
  92.                     Probability2=ProTree{j+1,i-1};
  93.                     QTree(j,i)=QTree(j,i)+Probability1(2)*QTree(j,i-1)*exp(-SecondTree(j,i-1)*deltaT);
  94.                     QTree(j,i)=QTree(j,i)+Probability2(1)*QTree(j+1,i-1)*exp(-SecondTree(j+1,i-1)*deltaT);  
  95.                     Sum=Sum+QTree(j,i)*exp(-SecondTree(j,i)*deltaT);   
  96.                     %  底端
  97.                 elseif j==2*MaxBin+1
  98.                     Probability1=ProTree{j-1,i-1};
  99.                     Probability2=ProTree{j,i-1};  
  100.                     QTree(j,i)=QTree(j,i)+Probability1(3)*QTree(j-1,i-1)*exp(-SecondTree(j-1,i-1)*deltaT);
  101.                     QTree(j,i)=QTree(j,i)+Probability2(2)*QTree(j-1,i-1)*exp(-SecondTree(j-1,i-1)*deltaT);      
  102.                     Sum=Sum+QTree(j,i)*exp(-SecondTree(j,i)*deltaT);   
  103.                 else
  104.                     Probability1=ProTree{j-1,i-1};
  105.                     Probability2=ProTree{j,i-1};     
  106.                     Probability3=ProTree{j+1,i-1};  
  107.                     QTree(j,i)=QTree(j,i)+Probability1(3)*QTree(j-1,i-1)*exp(-SecondTree(j-1,i-1)*deltaT);
  108.                     QTree(j,i)=QTree(j,i)+Probability2(2)*QTree(j,i-1)*exp(-SecondTree(j,i-1)*deltaT);
  109.                     QTree(j,i)=QTree(j,i)+Probability3(1)*QTree(j+1,i-1)*exp(-SecondTree(j+1,i-1)*deltaT);
  110.                     Sum=Sum+QTree(j,i)*exp(-SecondTree(j,i)*deltaT);   
  111.                 end  
  112.             end
  113.             Alpha(i)=(log(Sum)-log(Price))/deltaT;
  114.             SecondTree(1:2*MaxBin+1,i)=SecondTree(1:2*MaxBin+1,i)+Alpha(i);  
  115.         end
  116.     end
  117. end
  118. %%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  119. %%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
复制代码


Hull-White三叉树算法恶心死啦,但是这次结果绝对木有问题:

HullWhiteTree1.jpg


HullWhiteTree2.jpg


Black-Karanskl三叉树的实现类似于Hull-White三叉树,第一阶段根据Hull-White三叉树,第二阶段需要用数值方法求解方程,但是感觉很奇怪,有时候解方程解不出来,自己找不出问题在哪,有问题请告诉我,欢迎指正,Hull书上的结果得到了(1~3期的结果),但是(4~6期的得不出来,书上也没有结果)。

Hull_BK3.jpg


Hull_BK1.jpg




Hull_BK2.jpg


对比一下


BlackKarasnskiTree1.jpg


[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])



本帖隐藏的内容

  1. function [FirstTree,RateTree,XTree,QTree]=BlackKarasnskiTree(T,N,Sigma,A,RateTerm)
  2. %%  Black-Karasnski三叉树的实现
  3. %%  by fantuanxiaot
  4. %%  具体可见RateTree
  5. %%  [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])
  6. %%  [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])
  7. %%  [FirstTree,RateTree,XTree,QTree]=BlackKarasnskiTree(3,8,0.25,0.22,...
  8. %%  [0.025 0.03 0.0343 0.03824 0.04183 4.512/100 0.04812 5.086/100])
  9. if length(RateTerm)~=N
  10.     error('Reset Your RateTerm');
  11. end
  12. deltaT=T/N;
  13. MaxBin=ceil(0.184/(A*(deltaT)));
  14. [FirstTree,ProTree,~,~]=HullWhiteTree_First(T,N,Sigma,A);
  15. %%  构建二期树
  16. QTree=zeros(2*MaxBin+1,N);
  17. RateTree=zeros(2*MaxBin+1,N);
  18. Alpha=zeros(length(RateTerm),1);
  19. XTree=zeros(2*MaxBin+1,N);
  20. for i=1:N
  21.     %  第一列
  22.     if i==1
  23.         QTree(i,1)=1;
  24.         Alpha(i)=log(RateTerm(i));
  25.         XTree(1,1)=Alpha(i);
  26.         RateTree(i,1)=FirstTree(i,1)+exp(Alpha(i));
  27.     end
  28.     %  第二列
  29.     if i==2
  30.         Price=exp(-RateTerm(i)*i*deltaT);
  31.         Probability=ProTree{1,1};
  32.         QTree(1:3,i)=QTree(1,1)*Probability*exp(-exp(Alpha(i-1))*deltaT);
  33.         fun=@(alpha)(Price-sum(QTree(1:3,i).*exp(-deltaT*(exp(alpha+FirstTree(1:3,i))))));
  34.         %  求解alpha值
  35.         Alpha(i)=fsolve(fun,-3,optimset('MaxIter',200,'TolFun',1e-8));
  36.         XTree(1:3,i)=Alpha(i)+FirstTree(1:3,i);
  37.         RateTree(1:3,i)=exp(XTree(1:3,i));
  38.     end
  39.     %  三列以后
  40.     if i>=3
  41.         if i<=MaxBin+1
  42.             Price=exp(-RateTerm(i)*i*deltaT);
  43.             %  先得到Q值
  44.             for j=1:2*(i-1)+1
  45.                 %  顶端
  46.                 if j==1
  47.                     Probability=ProTree{j,i-1};
  48.                     QTree(j,i)=Probability(1)*QTree(j,i-1)*exp(-exp(Alpha(i-1)+FirstTree(1,i-1))*deltaT);
  49.                     %  底端
  50.                 elseif j==2*(i-1)+1
  51.                     Probability=ProTree{j-2,i-1};
  52.                     QTree(j,i)=Probability(3)*QTree(j-2,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j-2,i-1))*deltaT);
  53.                 elseif j==2
  54.                     Probability1=ProTree{j-1,i-1};
  55.                     Probability2=ProTree{j,i-1};
  56.                     QTree(j,i)=QTree(j,i)+Probability1(2)*QTree(j-1,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j-1,i-1))*deltaT);
  57.                     QTree(j,i)=QTree(j,i)+Probability2(1)*QTree(j,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j,i-1))*deltaT);
  58.                 elseif j==2*(i-1)
  59.                     Probability1=ProTree{j-2,i-1};
  60.                     Probability2=ProTree{j-1,i-1};
  61.                     QTree(j,i)=QTree(j,i)+Probability1(3)*QTree(j-2,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j-2,i-1))*deltaT);
  62.                     QTree(j,i)=QTree(j,i)+Probability2(2)*QTree(j-1,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j-1,i-1))*deltaT);  
  63.                 else
  64.                     Probability1=ProTree{j-2,i-1};
  65.                     Probability2=ProTree{j-1,i-1};     
  66.                     Probability3=ProTree{j,i-1};
  67.                     QTree(j,i)=QTree(j,i)+Probability1(3)*QTree(j-2,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j-2,i-1))*deltaT);
  68.                     QTree(j,i)=QTree(j,i)+Probability2(2)*QTree(j-1,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j-1,i-1))*deltaT);  
  69.                     QTree(j,i)=QTree(j,i)+Probability3(1)*QTree(j,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j,i-1))*deltaT);
  70.                 end
  71.             end
  72.             fun=@(alpha)(Price-sum(QTree(1:2*(i-1)+1,i).*exp(-deltaT*(exp(alpha+FirstTree(1:2*(i-1)+1,i))))));
  73.             Alpha(i)=fsolve(fun,-3,optimset('MaxIter',200,'TolFun',1e-8));
  74.             XTree(1:2*(i-1)+1,i)=Alpha(i)+FirstTree(1:2*(i-1)+1,i);
  75.             RateTree(1:2*(i-1)+1,i)=exp(XTree(1:2*(i-1)+1,i));
  76.         end
  77.         %  到了横列
  78.         if i>=MaxBin+2
  79.             Price=exp(-RateTerm(i)*i*deltaT);
  80.             for j=1:2*MaxBin+1
  81.                 %  顶端
  82.                 if j==1
  83.                     Probability1=ProTree{j,i-1};
  84.                     Probability2=ProTree{j+1,i-1};
  85.                     QTree(j,i)=QTree(j,i)+Probability1(2)*QTree(j,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j,i-1))*deltaT);
  86.                     QTree(j,i)=QTree(j,i)+Probability2(1)*QTree(j+1,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j+1,i-1))*deltaT);   
  87.                 elseif j==2*MaxBin+1
  88.                     Probability1=ProTree{j-1,i-1};
  89.                     Probability2=ProTree{j,i-1};  
  90.                     QTree(j,i)=QTree(j,i)+Probability1(3)*QTree(j-1,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j-1,i-1))*deltaT);
  91.                     QTree(j,i)=QTree(j,i)+Probability2(2)*QTree(j,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j,i-1))*deltaT);   
  92.                 else
  93.                     Probability1=ProTree{j-1,i-1};
  94.                     Probability2=ProTree{j,i-1};     
  95.                     Probability3=ProTree{j+1,i-1};                     
  96.                     QTree(j,i)=QTree(j,i)+Probability1(3)*QTree(j-1,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j-1,i-1))*deltaT);
  97.                     QTree(j,i)=QTree(j,i)+Probability2(2)*QTree(j,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j,i-1))*deltaT);
  98.                     QTree(j,i)=QTree(j,i)+Probability3(1)*QTree(j+1,i-1)*exp(-exp(Alpha(i-1)+FirstTree(j+1,i-1))*deltaT);
  99.                 end
  100.             end
  101.             fun=@(alpha)(Price-sum(QTree(1:2*MaxBin+1,i).*exp(-deltaT*(exp(alpha+FirstTree(1:2*MaxBin+1,i))))));
  102.             Alpha(i)=fsolve(fun,-3,optimset('MaxIter',500,'TolFun',1e-10));
  103.             XTree(1:2*MaxBin+1,i)=Alpha(i)+FirstTree(1:2*MaxBin+1,i);        
  104.             RateTree(1:2*MaxBin+1,i)=exp(XTree(1:2*MaxBin+1,i));
  105.         end
  106.     end
  107. end
  108. %%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  109. %%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
复制代码


BlackKarasnskiTree2.jpg






关键词:fantuanxiaot MATLAB Black atlab matla 衍生品 最大的 Sigma 监控

已有 10 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
离歌レ笑 + 100 精彩帖子
回眸明天 + 100 + 5 + 5 + 5 精彩帖子
kychan + 100 + 5 + 5 + 5 精彩帖子
zbin7451f + 100 + 5 + 5 + 5 精彩帖子
chenyi112982 + 5 + 5 精彩帖子
chengzhifu2013 + 60 + 60 + 5 + 5 + 5 好贴
杰式悦敏 + 5 + 1 + 1 精彩帖子
xujingtang + 60 + 2 精彩帖子
狂热的爱好者 + 3 + 3 + 3 精彩帖子
jerker + 5 精彩帖子

总评分: 经验 + 480  论坛币 + 225  学术水平 + 33  热心指数 + 36  信用等级 + 29   查看全部评分

本帖被以下文库推荐

stata SPSS
Edwardliu 在职认证  发表于 2015-5-6 15:17:16 |显示全部楼层

回帖奖励 +3

回复

使用道具 举报

ydb8848 发表于 2015-5-6 15:19:00 |显示全部楼层

回帖奖励 +3

回复

使用道具 举报

lipj 发表于 2015-5-6 15:19:16 |显示全部楼层

回帖奖励 +3

回复

使用道具 举报

ydb8848 发表于 2015-5-6 15:19:49 |显示全部楼层

回帖奖励 +3

回复

使用道具 举报

ydb8848 发表于 2015-5-6 15:21:38 |显示全部楼层

回帖奖励 +3

回复

使用道具 举报

ydb8848 发表于 2015-5-6 15:36:18 |显示全部楼层

回帖奖励 +3

回复

使用道具 举报

ydb8848 发表于 2015-5-6 15:44:47 |显示全部楼层

回帖奖励 +3

回复

使用道具 举报

ydb8848 发表于 2015-5-6 15:48:35 |显示全部楼层
回复

使用道具 举报

512661101 发表于 2015-5-6 15:50:51 |显示全部楼层

回帖奖励 +3

先看看哈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 我要注册

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2019-10-24 02:39