这个例子说明了MATLAB®如何用于创建利率衍生证券投资组合,并使用Black-Karasinski利率模型为其定价。该例子还显示了一些对冲策略,以尽量减少对市场波动的敞口。
结构RateSpec
是一种利率期限结构,它定义了初始利率规范,从中派生出树利率。使用下表中的年化零息票利率信息填充RateSpec
结构。
从对2007年2月27日2008年2月27日0.0493 0.0459 2007年2月27日2009年2月27日2007年2月27日2010年2月27日0.0450 0.0446 2007年2月27日2012年2月27日2007年2月27日2014年2月27日0.0445 0.0450 2007年2月27日2017年2月27日2007年2月27日2027年2月27日0.0473
可以使用dataffeed工具箱™从美联储统计发布页面检索该数据。在这种情况下,Datafeed工具箱™将连接到FRED®并拉回以下国库券的利率。
术语符号=1=DGS1 2=DGS2 3=DGS3 5=DGS5 7=DGS7 10=DGS10 20=DGS20
创建连接对象:
c =弗雷德;
创建符号获取列表:
FredNames = {...“DGS1”;...% 1年“DGS2”;...%2年“DGS3”;...% 3年“DGS5”;...% 5年“DGS7”;...% 7年“DGS10”;...%十年“DGS20”};% 20年
定义术语:
Terms = [1;...% 1年2;...%2年3;...% 3年5;...% 5年7;...% 7年10;...%十年20);% 20年
设置StartDate可以
至2007年2月27日:
StartDate=datenum(2007年2月27日);
FredRet =获取(c FredNames StartDate可以);
设置ValuationDate
基于StartDate可以
:
ValuationDate = StartDate可以;
EndDates = [];
费率=[];
创建EndDates
:
for idx = 1:length(FredRet)
%调出与2007年2月27日相关的利率。所有的弗雷德利率返回%的百分比利率=[利率;...FredRet (idx) . data(1、2)/ 100);
%通过将Term添加到%StartDate的年份来确定EndDates...轮(datenum(…年(StartDate可以)+ (idx, 1),…月(StartDate可以),……天(StartDate可以))));
结束
使用的函数意图集
创建RateSpec
使用以下数据:
复合= 1;StartDate可以=”2007年- 2月27日;率= (0.0493;0.0459;0.0450;0.0446;0.0446;0.0450;0.0473);EndDates = {”2008年- 2月27日;”2009年- 2月27日;”2010年- 2月27日;”2012年- 2月27日;...”2014年- 2月27日;”2017年- 2月27日;”2027年- 2月27日};ValuationDate = StartDate可以;RateSpec = intenvset (“复合”,复配,startdate可以的,起始日期,...“EndDates”EndDates,“利率”率,“估价日期”ValuationDate)
等级规范=结构体字段:FinObj:“费率规格”复利:1盘:[7x1双精度]费率:[7x1双精度]结束时间:[7x1双精度]开始时间:[7x1双精度]结束日期:[7x1双精度]开始日期:733100估价日期:733100基准:0结束月规则:1
创建结构VolSpec
它使用以下数据指定波动性过程。
波动率= (0.011892;0.01563;0.02021;0.02125;0.02165;0.02065;0.01803);α= (0.0001);VolSpec = bkvolspec(ValuationDate, enddate, Volatility, enddate (end), Alpha)
沃尔斯派克=结构体字段:FinObj:'BKVolSpec'评估日期:733100 VolDates:[7x1双精度]VolCurve:[7x1双精度]AlphaCurve:1.0000e-04 AlphaDates:740405 VolDates:'linear'
结构TimeSpec
指定利率树的时间结构。此结构定义树的每个级别的观察时间与相应日期之间的映射。
TimeSpec = bktimespec(ValuationDate, EndDates)
TimeSpec =结构体字段:FinObj: 'BKTimeSpec' ValuationDate: 733100到期日:[7x1 double]复利:-1基础:0 endmonth规则:1
将以前计算的值用于RateSpec
,VolSpec
,TimeSpec
创建BK树。
BKTree = BKTree (VolSpec, RateSpec, TimeSpec)
BKTree=结构体字段:FinObj:'BKFwdTree'VolSpec:[1x1结构]TimeSpec:[1x1结构]RateSpec:[1x1结构]tObs:[01235710]dObs:[7331007334653733831734196734926735657736753]CFlowT:{1x7单元}Probs:{1x6单元}连接:{[2][234][23456 23456 23456 23456 23456 23456 23456][23456 2.]FwdTree:{1x7单元}
通过查看输出结构,可视化沿着树的利率演变BKTree
.功能bktree
返回一个反向贴现树,您可以将其转换为利率树cvtree
功能。
BKTreeR = cvtree (BKTree)
BKTreeR =结构体字段:FinObj:'BKRateTree'VolSpec:[1x1结构]TimeSpec:[1x1结构]RateSpec:[1x1结构]tObs:[01235710]dObs:[733100733465733831734196734926735657736753]CFlowT:{1x7单元}Probs:{1x6单元}连接:{[2][234][23456 23456 23456 23456 23456 23456 23456 7][2……}速率树:{1x7单元}
看看树的上、中、下分支路径。
OldFormat=get(0,“格式”);格式短%根节点上的速率:RateRoot=trintreepath(BKTreeR,0)
RateRoot=0.0481
沿上支率:RatePathUp = trintreepath(BKTreeR, [1 1 1 1 1])
RatePathUp =7×10.0481 0.0425 0.0446 0.0478 0.0510 0.0555 0.0620
沿中间分支的百分率:RatePathMiddle = trintreepath(BKTreeR,[2 2 2 2 2])日志含义
RatePathMiddle =7×10.0481 0.0416 0.0423 0.0430 0.0436 0.0449 0.0484
%沿下支路的费率:RatePathDown = trintreepath(BKTreeR,[3 3 3 3 3])日志含义
RatePathDown =7×10.0408 0.0401 0.0388 0.0373 0.0363 0.0378
您还可以显示树的图形表示,以交互方式检查树中节点的速率,直到成熟为止。这个函数树状视图
在左侧窗口中显示速率树的结构。右边窗口中的树显示是空白的,但是通过选择表格/图点击节点,你可以沿着路径检查速率。
treeview (BKTreeR);
创建一个由两种债券工具和5%债券期权组成的投资组合。
%两个债券CouponRate = [0.04, 0.05];解决=2007年2月27日的;成熟= {2009年2月27日的;‘2010年2月27日’}; 周期=1;5%债券的%美国期权OptSpec = {“电话”};罢工= 98;ExerciseDates =‘2010年2月27日’;AmericanOpt = 1;InstSet = instadd (“债券”,息票率,结算,到期,期限);InstSet = instadd (InstSet,“OptBond”, 2, OptSpec, Strike, ExerciseDates, AmericanOpt);分配名称和持股资产= [10;15; 3);名称= {“4%的债券”;“5%的债券”;“选项98”};InstSet = instsetfield (InstSet,“指数”1:3,的字段名, {“数量”},“数据”、控股);InstSet = instsetfield (InstSet,“指数”1:3,的字段名, {“姓名”},“数据”,姓名);
检查变量中包含的一组工具InstSet
.
instdisp (InstSet)
指数型偶合利率结算到期日基准月底发行的第一偶合债券最后偶合债券开始日期票面数量名称1债券0.04 2007年2月27日2009年2月10日1南南100 10 4%债券2债券0.05 2007年2月27日2010年2月1 0南南100 15 5%债券指数型IND OptSpec罢工日期美国债券数量名称3 OptBond 2呼叫98 2010年2月27日1 3选项98
计算投资组合中每种工具的价格。
[Price, PTree] = bkprice(BKTree, InstSet)
价格=3×198.8841 101.3470 3.3470
树=结构体字段:[0 1 2 3 5 7 10 20] Connect:{[2][2 3 4 4][2 3 4 5 5 6][2 3 4 5 5 6][2 3 4 5 6][2 2 3…}探头:{1x6 cell}
输出向量中的价格价格
对应于观测时刻0的价格(则
=0
),它被定义为利率树的估值日期。
在价格
向量,第一元素,98.884,表示第一仪器的价格(4% Bond);第二个元素101.347表示第二种工具(5%的债券)的价格,而3.347表示美国看涨期权的价格。
您还可以显示价格树的图形表示,以检查树节点上的价格,直到到期。
treeview (PTree InstSet);
在现有投资组合中添加工具:上限、下限、浮动利率票据、普通掉期以及可出售和可赎回债券。
%的帽子StrikeC = 0.035;InstSet = instadd (InstSet,“帽子”,罢工,解决,‘2010年2月27日’);%的地板上StrikeF = 0.05;InstSet = instadd (InstSet,“地板”StrikeF定居,2009年2月27日的);%浮动利率票据InstSet = instadd (InstSet,“浮动”30岁,2009年2月27日的);%香草交换LegRate = (0.04 - 5);InstSet = instadd (InstSet,“交换”LegRate定居,‘2010年2月27日’);%可出售和可赎回债券InstSet = instadd (InstSet,“OptEmBond”CouponRate定居,‘2010年2月27日’, {“把”;“电话”},...罢工,‘2010年2月27日’,“AmericanOpt”, 1“时间”1);%处理名称和持有量持股=[15;5;8;7;9;4];姓名={“3.5%上限”;“5%楼”;“30个基点浮动”;“4% / 5 bp交换”;“PuttBond”;“CallBond”};InstSet = instsetfield (InstSet,“指数”,4:9,的字段名, {“数量”},“数据”、控股);InstSet = instsetfield (InstSet,“指数”,4:9,的字段名, {“姓名”},“数据”,姓名);
检查变量中包含的一组工具InstSet
.
instdisp (InstSet)
指数型偶合利率结算到期日基准月底发行的第一偶合债券最后偶合债券开始日期票面数量名称1债券0.04 2007年2月27日2009年2月10日1南南100 10 4%债券2债券0.05 2007年2月27日2010年2月1 0南南100 15 5%债券指数型IND OptSpec罢工日期美国债券数量名称3 OptBond 2呼叫98 2010年2月27日1 3选项98Index Type Strike Settle Maturity CapReset Basis Principal Quantity Name 4 Cap 0.035 27-Feb-2007 27-Feb-2010 1 0 100 15 3.5% Cap Index Type Strike Settle Maturity FloorReset Basis Principal Quantity Name 5 Floor 0.05 27-Feb-2007 27-Feb-2009 1 0 100 5 5% Floor Index Type Spread Settle Maturity FloatReset Basis Principal EndMonthRule CapRate FloorRate Quantity Name 6 Float 30 27-Feb-2007 27-Feb-2009 1 0 100 1 Inf -Inf 8 30BP Float Index Type LegRate Settle Maturity LegReset Basis Principal LegType EndMonthRule StartDate Quantity Name 7 Swap [0.04 5] 27-Feb-2007 27-Feb-2010 [NaN] 0 100 [NaN] 1 NaN 7 4%/5BP Swap Index Type CouponRate Settle Maturity OptSpec Strike ExerciseDates Period Basis EndMonthRule IssueDate FirstCouponDate LastCouponDate StartDate Face AmericanOpt Quantity Name 8 OptEmBond 0.04 27-Feb-2007 27-Feb-2010 put 98 27-Feb-2007 27-Feb-2010 1 0 1 NaN NaN NaN NaN 100 1 9 PuttBond 9 OptEmBond 0.05 27-Feb-2007 27-Feb-2010 call 98 27-Feb-2007 27-Feb-2010 1 0 1 NaN NaN NaN NaN 100 1 4 CallBond
对冲背后的理念是尽量减少对市场波动的风险敞口。随着基础变化,构成投资组合的工具的比例可能需要调整,以将敏感性保持在预期范围内。
使用BK模型计算灵敏度。
[Delta, Gamma, Vega, Price] = bksens(BKTree, InstSet);
获取当前的投资组合持有量。
资产= instget (InstSet,的字段名,“数量”);
创建一个敏感矩阵。
灵敏度= [Delta Gamma Vega];
每一行敏感性
矩阵与投资组合中的不同工具相关联,每一列都有不同的灵敏度度量。
格式银行disp([价格持有敏感性])
98.88 10.00 -185.47 528.47 0 101.35 15.00 -277.51 1045.05 0 3.35 3.00 -223.52 11843.32 0 2.77 15.00 250.04 2921.11 -0.00 0.75 5.00 -132.97 11566.69 0 100.56 8.00 -0.80 2.02 0 -1.53 7.00 -272.08 1027.85 0.00 98.60 9.00 -168.92 21712.82 0
上面第一列是每种仪器的美元单价,第二列是每种仪器的合同数量,第三、第四和第五列是美元的delta、gamma和vega敏感性。
当前投资组合的敏感性是投资组合中各种工具的加权平均值。
TargetSens =持股' *敏感性
TargetSens =1×3-0.0725 3.1757 -0.0000
hedgeslf
假设你想得到一个delta,gamma和vega中性的投资组合hedgeslf
发现金融工具投资组合中最接近自筹资金的再分配(保持投资组合价值不变)。
[Sens, Value1, Quantity]= hedge(敏感度,价格,持股)
Sens =3×10.0091 -0.5821 -0.4055
Value1 = 4637.54
数量=9×110.0000 5.2592 -5.1130 7.0585 -3.0469 12.4539 -7.3590 8.4718 10.3731
这个函数hedgeslf
返回投资组合的美元敏感性(Sens
),重新平衡的投资组合的价值(Value1
)及每项文书的新编配(数量
).如果价值0
和Value1
表示重新平衡之前和之后的投资组合值,您可以通过比较投资组合值来验证成本。
Value0 =持股量*价格
值0=4637.54
在这个例子中,投资组合是完全对冲的(同时delta、gamma和vega中立)和自筹资金的(投资组合的价值在平衡(价值0
和Value1
)是一样的。
假设你想要给投资组合中的单个工具设定上下限。假设你想将所有工具的头寸限制在+/- 11个合约范围内。
应用这些约束条件将不允许在第五和第八种文书中使用当前的位置。所有其他乐器目前都在上限/下限范围内。
%指定上下边界lowbounds = [-11 -11 -11 -11 -11 -11 -11 -11];UpperBounds = [11 11 11 11 11 11 11 11 11 11 11 11];%使用portcons函数构建约束ConSet = portcons (“资产负债表”下界,UpperBounds);%对投资组合应用约束条件[Sens, Value, Quantity1] = hedgeslf(sensitivity, Price, Holdings, [], ConSet)
Sens =3×10 0 0
值=0
Quantity1 =9×10 0 0 0 0 0 0 0
注意hedgeslf
功能加强了第五和第八种工具的界限,投资组合继续得到充分的对冲和自我融资。
集(0,“格式”, OldFormat);