主要内容

理解利率树模型

介绍

金融工具工具箱™支持以下利率树:金宝app

  • Black-Derman-Toy (BDT)

  • Black-Karasinski (BK)

  • Heath-Jarrow-Morton (HJM)

  • 船体 - 白色(HW)

  • Cox-Ingersoll-Ross (CIR)

Heath-Jarrow-Morton模型是利率衍生品定价中应用最广泛的模型之一。该模型考虑给定的利率初始期限结构和远期利率波动率的规范,以建立一个基于统计过程的表示利率演变的树。如需进一步解释,请参阅本书固定收益证券和利率期权模型罗伯特·a·贾罗著。

Black-Derman-Toy模型是常用于定价利率衍生物的另一个分析模型。该模型考虑给定的利率初始零率术语结构和长率的产量波动性的规范,以建立代表利率演变的树。有关进一步的解释,请参阅Fischer Blacker Black,Emanuel Derman和William玩具的“利率申请一个因子利率和申请的一个因子利率和申请。

Hull-White模型包含利率的初始术语结构和波动术语结构,以构建短速率的三种重组树。生成的树用于重视利率相关的证券。金融仪器工具箱软件中的Hull White模型的实现仅限于一个因素。

Black-Karasinski模型是Hull-White模型的一个单因素、对数正态版本。

关于哈尔白和黑卡拉辛斯基模型的进一步信息,见书期权、期货和其他衍生品作者:John C. Hull。

建立一个远期利率树

远期利率树是代表利率在一段时间内变化的基本单位。本节介绍如何使用金融工具工具箱创建远期利率树。

请注意

为了避免不必要的重复,本文使用HJM和BDT模型来说明利率树的创建和使用。HW和BK模型与BDT模型相似。如果存在具体的差异,它们在HW和BK树结构

MATLAB®创建速率树的功能是hjmtreeBDTTree..的hjmtree函数创建结构,HJMTree.,包含浓密树的时间和前进速率信息。的BDTTree.函数创建一个类似的结构,BDTTree,用于重组树。

该结构是一个自包含的单元,包括速率树(在FwdTree结构的字段)以及构建此树时使用的波动性、速率和时间规范。

这些函数采用三种结构作为输入参数:

可视化任何你创建的树的一个简单的方法是树景者函数,该函数以图形方式显示树。看树的图形表示和有关信息。树景者

调用序列

调用语法hjmtreeHJMTree = HJMTree (VolSpec, RateSpec, TimeSpec)

类似地,的调用语法BDTTree.BDTTree = BDTTree (VolSpec, RateSpec, TimeSpec)

这些函数中的每一个都需要VolSpecRateSpec,TimeSpec输入参数:

  • VolSpec是指定前向速率波动性过程的结构。你创造了VolSpec使用两个函数中的任何一个hjmvolspecbdtvolspec

    hjmvolspec函数支持最多三个因金宝app素的说明。它处理利率期限结构波动的这些模型:

    • 常数

    • 静止的

    • 幂数

    • Vasicek

    • 成比例的

    单因素模型假设利息术语结构受到单一不确定性的影响。包含多个因素允许您在兴趣结构的形状和位置指定不同类型的班次。看hjmvolspec获取详细信息。

    bdtvolspec函数只支持单个波动金宝app率因子。树上的节点对之间的波动性保持不变。您以十进制值向量的形式提供输入波动率值。看bdtvolspec获取详细信息。

  • RateSpec为初始利率曲线的利率规格。您可以使用函数创建这个结构intenvset.(见利率期限结构建模.)

  • TimeSpec是树时间布局规范。您使用该函数创建此变量hjmtimespecbdttimespec.它表示费率报价的级别时间和级别日期之间的映射。这个结构间接地决定了树中的层次数量。

指定波动率模型(VolSpec)

因为HJM支持金宝app多因素(多达3个)波动率模型,而BDT(也包括BK和HW)只支持单一的波动率因子,即金宝apphjmvolspecbdtvolspec函数需要不同的输入并产生略有不同的输出。有关示例,请参见创建HJM波动率模型.有关BDT的示例,请参见创建BDT波动模型

创建HJM波动率模型

这个函数hjmvolspec生成的结构VolSpec,它指定波动过程 σ t T 用于创建前速率树木。在这个上下文资本T表示远期汇率的开始时间,和t表示观测时间。波动率过程可以由创建它的函数调用中顺序指定的因素组合来构造。每个因子规范都以一个指定因子名称的字符向量开始,然后是相关的参数。

HJM波动率规范示例。考虑一个使用单个因素的示例,具体地,恒定Σ因子。恒定因子规范只需要一个参数,值 σ .本例中对应的值为0.10。

HJMVolSpec = HJMVolSpec (“不变”,0.10)
HJMVolSpec = FinObj: 'HJMVolSpec' FactorModels: {'Constant'} FactorArgs: {{1x1 cell}} sigmasshift: 0 NumFactors: 1 NumBranch: 2 PBranch: [0.5000 0.5000] Fact2Branch: [-1 1]

NumFactors场的VolSpec结构,VolSpec。NumFactors = 1,揭示了用于生成的因素的数量VolSpec是一个。的FactorModels字段表示它是一个常数因素,NumBranches字段表示分支的数量。因此,所得树的每个节点都有两个分支,一个分支,另一个分支,而另一个分支。

现在考虑一个由比例因素和指数因素组成的双因素波动过程。

%指数因子Sigma_0 = 0.1;λ= 1;%比例因子curveprop = [0.11765;0.08825;0.06865]Curveterm = [1;2;3];%建立VolSpecHJMVolSpec = HJMVolSpec ('成比例的'CurveProp CurveTerm,......1 e6,“指数”、Sigma_0λ)
HJMVolSpec = FinObj: 'HJMVolSpec' FactorModels: {'Proportional' '} FactorArgs: {{1x3 cell} {1x2 cell}} sigmasshift: 0 NumFactors: 2 NumBranch: 3 PBranch: [0.2500 0.2500 0.5000] Fact2Branch: [2x3 double]

输出表明,波动率规范是使用两个因素生成的。树的每个节点有三个分支。每个分支的概率从上到下分别是0.25 0.25和0.5。

创建BDT波动模型

这个函数bdtvolspec生成的结构VolSpec,它指定了挥发性过程。该函数需要三个输入参数:

  • 估值日期ValuationDate

  • 收益率波动结束日期VolDates

  • 收益率波动值VolCurve

一个可选的第四个论点InterpMethod可以包括指定插值方法。

用于调用的语法bdtvolspec是:

BDTVolSpec = BDTVolSpec (ValuationDate, VolDates, VolCurve,…InterpMethod)

地点:

  • ValuationDate是树上的第一个观测日期。

  • VolDates是表示产量波动性最终日期的日期的矢量。

  • VolCurve是收益率波动值的向量。

  • InterpMethod就是用插值的方法。默认值是线性

BDT波动率规范示例。考虑下面的例子:

valationdate = Datenum('01 -01-2000');EndDates = datenum (['01 -01-2001''01 -01-2002''01 -01-2003'“01-01-2004”“01-01-2005”]);波动率= [2;.19;只要;.17;16);

使用bdtvolspec创建一个波动率规范。由于没有明确指定插值方法,因此函数使用线性违约。

BDTVolSpec = BDTVolSpec (ValuationDate, EndDates, Volatility)
BDTVolSpec = FinObj: 'BDTVolSpec' ValuationDate: 730486 VolDates: [5x1 double] VolCurve: [5x1 double] VolInterpMethod: 'linear'

指定利率期限结构(RateSpec)

结构RateSpec是一种利率期限结构,它定义了初始远期利率规范,树利率就是从该规范派生出来的。利率期限结构建模说明如何使用该函数创建这些结构intenvset,给定利率,每个利率的开始和结束日期,以及复利值。

速率规格创建示例

考虑下面的例子:

复合= 1;率= (0.02;0.02;0.02;0.02);startdate可以= [' 01 - 1月- 2000' 01 - 1月- 2001'01-jan-2002'' 01 - 1月- 2003];enddates = [' 01 - 1月- 2001'01-jan-2002'' 01 - 1月- 2003' 01 - 1月- 2004];ValuationDate =' 01 - 1月- 2000;ratespec = intenvset(“复合”,1,“利率”率,......'startdates'startdate可以,“EndDates”,结束,......“ValuationDate”,估值)
RateSpec = FinObj: 'RateSpec' compound: 1 Disc: [4x1 double] Rates: [4x1 double] EndTimes: [4x1 double] StartTimes: [4x1 double] EndDates: [4x1 double] StartDates: [4x1 double] ValuationDate: 730486 Basis: 0 EndMonthRule: 1

使用的函数datedisp检查变量中定义的日期RateSpec.例如:

datedisp (RateSpec.ValuationDate) 01 - 1月- 2000

指定时间结构(TimeSpec

结构TimeSpec指定利率树的时间结构。这个结构定义了树的每一层的观察时间和相应日期之间的映射。

TimeSpec是使用的hjmtimespecbdttimespec函数。这些函数需要三个输入参数:

  • 估值日期ValuationDate

  • 到期日期成熟

  • 复合率复合

例如,调用时使用的语法hjmtimespec

TimeSpec = hjmtimespec(ValuationDate,到期日,复利)

地点:

  • ValuationDate是树上的第一个观测日期。

  • 成熟是表示树的现金流日期的日期向量。任何具有这些期限的工具现金流都落在树节点上。

  • 复合是年化时复利比率的频率。

创建时间规范

使用与创建利率期限结构相同的数据调用时间规格创建函数,RateSpec构建指定树的时间布局的结构。

HJM时间规范示例。考虑下面的例子:

成熟= EndDates;HJMTimeSpec = HJMTimeSpec (ValuationDate,到期,复利)
HJMTimeSpec = FinObj: 'HJMTimeSpec' ValuationDate: 730486到期:[4x1 double]复利:1基础:0 endmonth规则:1

建造时指定的期限TimeSpec不必与之相吻合EndDates的速率间隔RateSpec.自TimeSpec定义树的时间日期映射,速率RateSpec是插值得到初始利率与那些在TimeSpec

创建BDT时间规范。考虑下面的例子:

成熟= EndDates;BDTTimeSpec = BDTTimeSpec (ValuationDate,到期,复利)
BDTTimeSpec = FinObj: 'BDTTimeSpec' ValuationDate: 730486到期:[4x1 double]复利:1基础:0 endmonth规则:1

创建树

使用VolSpecRateSpec,TimeSpec您已经在前面创建了用于创建HJM和BDT树的函数的输入。

创建一个hjm树

%将波动系数重置为常量情况HJMVolSpec = HJMVolSpec (“不变”, 0.10);HJMTree = HJMTree (HJMVolSpec, RateSpec, HJMTimeSpec)
HJMTree = FinObj: 'HJMFwdTree' VolSpec: [1x1 struct] TimeSpec: [1x1 struct] RateSpec: [1x1 struct] tObs: [0 1 2 3] TFwd: {[4x1 double][3x1 double][2x1 double][3]}

创建BDT树

现在使用前面计算的值VolSpecRateSpec,TimeSpec作为函数的输入BDTTree.创建BDT树。

BDTTree = BDTTree (BDTVolSpec, RateSpec, BDTTimeSpec)
BDTTree = FinObj: 'BDTFwdTree' VolSpec: [1x1 struct] TimeSpec: [1x1 struct] RateSpec: [1x1 struct] tObs: [0 1.00 2.00 3.00] TFwd: {[4x1 double] [3x1 double] [2x1 double] [3.00]}

研究树木

在使用模型时,金融仪器工具箱使用树以代表转发费率,价格等。在最高级别,这些树木有缠绕在它们周围的结构。该结构封装了以完全解释树中包含的信息所需的信息。

考虑此示例,它使用Mat文件中的利率和投资组合数据德国包含在工具箱中。

将数据加载到MATLAB工作区中。

负载德国

显示从MAT文件加载的变量列表。

类属性名称大小字节BDTInstSet 1 x1 15956 struct BDTTree 1 x1 5138 struct BKInstSet 1 x1 15946 struct BKTree 1 x1 5904 struct CRRInstSet 1 x1 12434 struct CRRTree 1 x1 5058 struct EQPInstSet 1 x1 12434 struct EQPTree 1 x1 5058 struct HJMInstSet 1 x1 15948 struct HJMTree 1 x1 5838 struct HWInstSet 1 x1 15946 struct HWTree 1 x1 5904结构ITTInstSet 1x1 12438 struct ITTTree 1x1 8862 struct ZeroInstSet 1x1 10282 struct ZeroRateSpec 1x1 1580 struct

HJM树结构

您现在可以详细地检查HJMTree.结构包含在此文件中。

HJMTree.
HJMTree = FinObj: 'HJMFwdTree' VolSpec: [1x1 struct] TimeSpec: [1x1 struct] RateSpec: [1x1 struct] tObs: [0 1 2 3] TFwd: {[4x1 double][3x1 double][2x1 double][3]}

FwdTree包含实际的前向速率树。MATLAB表示作为单元阵列,其中每个单元阵列元素包含树级。

其他字段包含与解释中的值相关的其他信息FwdTree.最重要的是VolSpecTimeSpec,RateSpec,分别包含波动性、时间结构和费率结构信息。

第一个节点。观察远期汇率FwdTree.第一个节点表示估值日期,则= 0

HJMTree。FwdTree{1}
ANS = 1.0356 1.0468 1.0523 1.0563

请注意

金融工具工具箱的用途逆的折扣树形图中远期利率的符号。逆折价是指一项资产的现值乘以其未来价值的因素。一般来说,这些远期因素是贴现因素的倒数。

仔细观察RateSpec结构,用于生成此树,以查看这些值的来源。在单个数组中排列值。

[HJMTree.RateSpec。开始时间HJMTree.RateSpec.EndTimes......HJMTree.RateSpec.Rates]
Ans = 0 1.0000 0.0356 1.0000 2.0000 0.0468 2.0000 3.0000 0.0523 3.0000 4.0000 0.0563

如果您在第三列中找到相应的利率逆折,那么您就得到树的第一个节点的值。您可以使用该函数将利率转换为逆折rate2disc

盘= rate2disc (HJMTree.TimeSpec.Compounding,......HJMTree.RateSpec。率、HJMTree.RateSpec.EndTimes......HJMTree.RateSpec.StartTimes);兄弟会= 1. /片
FRates = 1.0356 1.0468 1.0523 1.0563

第二个节点。第二个节点表示第一流的观测时间,则= 1.这个节点显示两种状态:一种表示向上的分支,另一种表示向下的分支。

注意HJMTree.VolSpec.NumBranch = 2

HJMTree。VolSpec
ans = FinObj: 'HJMVolSpec' FactorModels: {'Constant'} FactorArgs: {{1x1 cell}} sigmasshift: 0 NumFactors: 1 NumBranch: 2 PBranch: [0.5000 0.5000] Fact2Branch: [-1 1]

检查与上分支相对应的节点的速率。

HJMTree.FwdTree {2} (:,: 1)
Ans = 1.0364 1.0420 1.0461

现在检查相应的下分支。

HJMTree.FwdTree {2} (:: 2)
Ans = 1.0574 1.0631 1.0672

第三节点。第三个节点表示第二次观测时间,则= 2.这个节点总共包含四个状态,两个表示向上的分支,另外两个表示向下的分支。检查节点对应于up状态的速率。

HJMTree.FwdTree {3} (:,: 1)
Ans = 1.0317 1.0526 1.0358 1.0568

接下来检查相应的down状态。

HJMTree.FwdTree {3} (:: 2)
Ans = 1.0526 1.0738 1.0568 1.0781

隔离指定节点。从第三层开始,在树单元数组中建立索引变得很复杂,隔离特定节点可能很困难。这个函数bushpath通过将到节点的路径指定为到达该节点的分支向量来隔离特定节点。举个例子,考虑从根节点开始,向上取分支,然后向下取分支,然后向下取另一个分支所到达的节点。假设树的每个节点只有两个分支,向上的分支对应1,向下的分支对应2。这个上下向下的路径就变成了矢量[1 2 2]

兄弟会= bushpath (HJMTree。FwdTree [1 2 2])
FRates = 1.0356 1.0364 1.0526 1.0674

bushpath返回由输入参数中指定的路径选中的所有节点的现货率,第一个对应根节点,最后一个对应目标节点。

使用直接索引获取隔离相同的节点

HJMTree。FwdTree{4}(:, 3, 2)
ans = 1.0674

如预期的那样,这个值对应于返回的速率的最后一个元素bushpath

您可以对Financial Instruments Toolbox生成的任何类型的树使用这些技术,如远期利率树或价格树。

BDT树结构

您现在可以详细地检查BDTTree结构。

BDTTree
BDTTree = FinObj: 'BDTFwdTree' VolSpec: [1x1 struct] TimeSpec: [1x1 struct] RateSpec: [1x1 struct] tObs: [0 1.00 2.00 3.00] TFwd: {[4x1 double] [3x1 double] [2x1 double] [3.00]} cflow: {[4x1 double] [3x1 double] [2x1 double] [4.00]}

FwdTree包含实际的速率树。MATLAB表示作为单元阵列,其中每个单元阵列元素包含树级。

其他字段包含与解释中的值相关的其他信息FwdTree.最重要的是VolSpecTimeSpec,RateSpec,分别包含波动性、时间结构和费率结构信息。

看着那(这RateSpec结构,用于生成此树,以查看这些值的来源。在单个数组中排列值。

[bdttree.ratespec.starttimes bdttree.ratespec.endimes.......BDTTree.RateSpec.Rates]
ANS = 0 1.0000 0.1000 0 2.0000 0.1100 0 3.0000 0.1200 0 4.0000 0.1250

看看这里的速率FwdTree.第一个节点表示估值日期,则= 0.第二个节点表示则= 1.检查第二个、第三个和第四个节点的速率。

bdttree.fwdtree {2}
Ans = 1.0979 1.1432

第二节点代表第一观察时间,则= 1.这个节点总共包含两种状态,一种表示向上的分支(1.0979),另一个代表向下的分支(1.1432).

请注意

本文档的约定是显示价格在上面的树枝上。所以,当显示利率在美国,上一级银行的利率下降,下一级银行的利率上升。

bdttree.fwdtree {3}
ANS = 1.0976 1.1377 1.1942

第三个节点表示第二次观测时间t奥林匹克广播服务公司= 2.这个节点总共包含三种状态,一种表示向上的分支(1.0976),一个代表中间的分支(1.1377),另一个代表向下的分支(1.1942).

BDTTree。FwdTree{4}
Ans = 1.0872 1.1183 1.1606 1.2179

第四个节点表示第三次观测时间,则= 3.这个节点总共包含四个状态,一个表示向上的分支(1.0872),两个代表中间的分支(1.11831.1606),另一个表示向下的分支(1.2179).

隔离指定节点。这个函数treepath通过将到节点的路径指定为到达该节点的分支向量来隔离特定节点。举个例子,考虑从根节点开始,向上取分支,然后向下取分支,最后向下取另一个分支到达的节点。假设树的每个节点只有两个分支,向上的分支对应1,向下的分支对应2。这个上下向下的路径就变成了矢量[1 2 2]

兄弟会= treepath (BDTTree。FwdTree [1 2 2])
FRates = 1.1000 1.0979 1.1377 1.1606

treepath返回由输入参数中指定的路径选中的所有节点的短期速率,第一个对应根节点,最后一个对应目标节点。

HW和BK树结构

HW和BK树结构与BDT树结构相似。如果检查文件中包含的示例HW树,就可以看到这一点德国

负载德国;HWTree
HWTree = FinObj: 'HWFwdTree' VolSpec: [1x1 struct] TimeSpec: [1x1 struct] RateSpec: [1x1 struct] tObs: [0 1.00 2.00 3.00] dObs: [731947.00 732313.00 732678.00 733043.00] CFlowT: {[4x1 double] [3x1 double] [3x3 double] [3x5 double]} Connect: {[2.00] [2.00 3.00 4.00][1.03] [1.05 1.04 1.02] [1.08 1.07 1.05 1.03 1.01] [1.09 1.08 1.06 1.04 1.02]

这种结构的所有字段都与BDT的对应字段相似。BDT中没有另外两个字段:prob连接.的prob字段表示树中每个节点的每个分支的发生概率。的连接字段描述给定树级别的节点与下一树级别的节点之间的连通性。

prob字段。BDT和单因素HJM模型在一个节点上的每个分支具有相同的概率,而HW和BK则不是。对于HW树和BK树来说prob字段表示某个特定分支在下一层从一个节点移动到另一个节点的可能性。

prob字段由每个树级别一个单元格的单元格数组组成。每个细胞都是3.——- - - - - -NUMNODES数组,上面一行表示向上移动的概率,中间一行表示中间移动的概率,最后一行表示向下移动的概率。

作为一个说明,考虑的前两个元素prob结构的字段,对应于树的第一级(根)和第二级。

HWTree。prob{1}
0.16666666666667 0.66666666666667 0.16666666666667
HWTree。prob{2}
0.12361333418768 0.16666666666667 0.21877591615172 0.65761074966060 0.66666666666667 0.65761074966060 0.21877591615172 0.16666666666667 0.12361333418768

从上往下读,里面的值HWTree。prob{1}对应于根节点上、中、下的概率。

HWTree。prob{2}是A.3.——- - - - - -3.矩阵的值。第一列表示顶部节点,第二列表示中间节点,最后一列表示底部节点。与根节点一样,第一、第二和第三行保存每个节点上、中和下分支的值。

正如预期的那样,任何节点的所有概率的总和等于1。

sum (HWTree.Probs {2})
1.0000 1.0000 1.0000

连接字段。将HW和BK树结构与BDT树结构区分开的另一个领域是连接.该字段描述给定级别中的每个节点如何连接到下一级别的节点。这个领域的需要来自于树中可能出现的非标准分支。

连接HW树结构的字段由单元阵列组成,每个树级具有一个单元格。

HWTree。连接
Ans = [2] [1x3 double] [1x5 double]

每个单元格包含一个1——- - - - - -NUMNODES向量。向量中的每个值都与对应树层中的一个节点相关,并表示该节点的中间分支所连接的下一树层中的节点的索引。

如果你从包含的值减去1连接,则显示上分支所连接的下一层节点的索引。如果你加入1对于这些值,您将显示相应下分支的索引。

举个例子,考虑一下HWTree。连接{1}

HWTree。连接{1}
ans = 2

这表明根节点的中间分支正如预期的那样连接到下一个级别的第二个(来自顶部)节点。如果你减去了1从这个值,你得到1,这告诉您up分支进入顶部节点。如果你加入1,你获得3.,它指向树的第二层的最后一个节点。

现在考虑这个例子中的级别3:

hwtree.connect {3}
2 2 3 4 4

在这一层,存在非标准分支。这很容易识别,因为两个节点的中间分支连接到下一层的同一个节点。

为了将其可视化,请考虑下面的树图。

很明显,在树的第三层,即顶部和底部节点上,存在非标准分支。第一个和第二个节点连接到下一层相同的三个节点。类似的分支发生在树的底部和靠近底部的节点。

另请参阅

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

相关的例子

更多关于