金融工具工具箱™支持以下利率树:金宝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®创建速率树的功能是hjmtree
和BDTTree.
.的hjmtree
函数创建结构,HJMTree.
,包含浓密树的时间和前进速率信息。的BDTTree.
函数创建一个类似的结构,BDTTree
,用于重组树。
该结构是一个自包含的单元,包括速率树(在FwdTree
结构的字段)以及构建此树时使用的波动性、速率和时间规范。
这些函数采用三种结构作为输入参数:
波动率模型VolSpec
.(见指定波动率模型(VolSpec).)
利率期限结构RateSpec
.(见指定利率期限结构(RateSpec).)
树时间布局TimeSpec
.(见指定时间结构(TimeSpec).)
可视化任何你创建的树的一个简单的方法是树景者
函数,该函数以图形方式显示树。看树的图形表示和有关信息。树景者
.
的调用语法hjmtree
是HJMTree = HJMTree (VolSpec, RateSpec, TimeSpec)
.
类似地,的调用语法BDTTree.
是BDTTree = BDTTree (VolSpec, RateSpec, TimeSpec)
.
这些函数中的每一个都需要VolSpec
,RateSpec
,TimeSpec
输入参数:
VolSpec
是指定前向速率波动性过程的结构。你创造了VolSpec
使用两个函数中的任何一个hjmvolspec
或bdtvolspec
.
的hjmvolspec
函数支持最多三个因金宝app素的说明。它处理利率期限结构波动的这些模型:
常数
静止的
幂数
Vasicek
成比例的
单因素模型假设利息术语结构受到单一不确定性的影响。包含多个因素允许您在兴趣结构的形状和位置指定不同类型的班次。看hjmvolspec
获取详细信息。
的bdtvolspec
函数只支持单个波动金宝app率因子。树上的节点对之间的波动性保持不变。您以十进制值向量的形式提供输入波动率值。看bdtvolspec
获取详细信息。
TimeSpec
是树时间布局规范。您使用该函数创建此变量hjmtimespec
或bdttimespec
.它表示费率报价的级别时间和级别日期之间的映射。这个结构间接地决定了树中的层次数量。
因为HJM支持金宝app多因素(多达3个)波动率模型,而BDT(也包括BK和HW)只支持单一的波动率因子,即金宝apphjmvolspec
和bdtvolspec
函数需要不同的输入并产生略有不同的输出。有关示例,请参见创建HJM波动率模型.有关BDT的示例,请参见创建BDT波动模型.
这个函数hjmvolspec
生成的结构VolSpec
,它指定波动过程
用于创建前速率树木。在这个上下文资本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。
这个函数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
是一种利率期限结构,它定义了初始远期利率规范,树利率就是从该规范派生出来的。利率期限结构建模说明如何使用该函数创建这些结构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
是使用的hjmtimespec
或bdttimespec
函数。这些函数需要三个输入参数:
估值日期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
使用VolSpec
,RateSpec
,TimeSpec
您已经在前面创建了用于创建HJM和BDT树的函数的输入。
%将波动系数重置为常量情况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]}
现在使用前面计算的值VolSpec
,RateSpec
,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
您现在可以详细地检查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
.最重要的是VolSpec
,TimeSpec
,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生成的任何类型的树使用这些技术,如远期利率树或价格树。
您现在可以详细地检查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
.最重要的是VolSpec
,TimeSpec
,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.1183
和1.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树结构与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
在这一层,存在非标准分支。这很容易识别,因为两个节点的中间分支连接到下一层的同一个节点。
为了将其可视化,请考虑下面的树图。
很明显,在树的第三层,即顶部和底部节点上,存在非标准分支。第一个和第二个节点连接到下一层相同的三个节点。类似的分支发生在树的底部和靠近底部的节点。
bdtprice
|bdtsens
|bdttimespec
|BDTTree.
|bdtvolspec
|bkprice
|bksens
|bktimespec
|bktree
|bkvolspec
|bondbybdt
|bondbybk
|bondbyhjm
|bondbyhw
|bondbyzero
|capbybdt
|capbybk
|capbyblk
|capbyhjm
|Capbyhw.
|cfbybdt.
|cfbybk
|cfbyhjm
|cfbyhw
|cfbyzero
|fixedbybdt
|fixedbybk
|fixedbyhjm
|fixedbyhw
|超薄zero.
|floatbybdt
|floatbybk
|floatbyhjm
|floatbyhw
|floatbyzero
|floatdiscmargin
|floatmargin
|floorbybdt
|floorbybk
|floorbyblk
|floorbyhjm
|floorbyhw
|hjmprice
|hjmsens
|hjmtimespec
|hjmtree
|hjmvolspec
|hwcalbycap
|hwcalbyfloor
|hwprice
|hwsens
|hwtimespec
|hwtree
|hwvolspec
|instbond
|instcap
|instcf
|固定
|instfloat
|instfloor
|instoptbnd
|instoptembnd
|instoptemfloat
|Instoptfloat.
|InstangeFloat.
|instswap
|instswaption
|intenvprice
|intenvsens
|intenvset
|mmktbybdt
|mmktbyhjm
|oasbybdt
|oasbybk
|oasbyhjm
|oasbyhw
|optbndbybdt
|optbndbybk
|optbndbyhjm
|optbndbyhw
|optembndbybdt
|optembndbybk
|optembndbyhjm
|optembndbyhw
|optemfloatbybdt
|optemfloatbybk
|optemfloatbyhjm
|optemfloatbyhw
|optfloatbybdt
|optfloatbybk
|optfloatbyhjm
|optfloatbyhw
|rangefloatbybdt
|rangefloatbybk
|rangefloatbyhjm
|RangeFloatbyHW.
|swapbybdt
|swapbybk
|swapbyhjm
|快速的
|swapbyzero
|swaptionbybdt
|SwaptionByBk.
|swaptionbyblk
|swaptionbyhjm
|swaptionbyhw