固定收益证券久期与凸度的matlab计算.docx
《固定收益证券久期与凸度的matlab计算.docx》由会员分享,可在线阅读,更多相关《固定收益证券久期与凸度的matlab计算.docx(32页珍藏版)》请在冰豆网上搜索。
![固定收益证券久期与凸度的matlab计算.docx](https://file1.bdocx.com/fileroot1/2023-3/28/ceed56a6-f5fa-4d98-ac8e-0e9845467b69/ceed56a6-f5fa-4d98-ac8e-0e9845467b691.gif)
固定收益证券久期与凸度的matlab计算
第一讲固定收益证券的matlab计算
第一节固定收益基本知识
固定收益证券:
一组稳定现金流的证券.广义上还包括了债券市场上的衍生产品及优先股.以债券为主.
一.固定收益的品种
国债是固定收益的重要形式,以贴现债券(discountsecurity)与息票债券(couponbonds)两种形式发行.
贴现债券:
发行价低于面值,不支付利息,在到期日获取面值金融的收益.
息票:
按一定的票息率发行,每隔一段时间支付一次利息,到期按面值金额赎回.
美国的固定收益证券可以分为以下几个品种:
1.(短期)国库券(Treasurybills,T-bills)
期限小于一年,贴现发行,面值usu.1~10万美元.是流动性最高的债券品种,违约风险小,其利率usu当作无风险利率。
2.政府票据(Treasurynotes,T-notes)
即美国中期国债,期限1~10年,是coupon.
3.长期国债(Treasurybonds,T-bonds)
期限>10年,面值1~10万美元,是coupon.通常每半年付一息,到期偿本息。
4.零息票债券(Zero-couponbond)
零息票债券是指买卖价格相对布什有较大折让的企业或市政债券。
出现大额折让是由于债券并无任何利息,它们在发行时就加入折扣,或由一家银行除去息票,然后包装成为零息票债券发行,投资者在债券到期时以面值赎回。
零息票债券往往由附息债券所”剥离”出来:
购买息票国债的经纪人可以要求财政部停止债券的现金支付,使其成为独立证券序列,这时每一证券都具有获得原始债券收益的要求权.
如一张10年期国债被剥离成20张半年期债券,每张都可视为零息票,它们到期日从6个月到10年不等,最后本多支付是另一张零息证券,所有的支付都单独计算,并配有自己的CUSIP号码(统一由美国证券鉴定程序委员会颁布).具有这种标识的证券都可以在联邦银行及其分支机构上进行电子交易,财政部仍旧具有支付责任.由于这种债券息票被“剥离”了,因此被称为本息剥离式国债STRIPS(separatetradingofregisteredinterestandprincipalofsecurities).
1982年麻省海湾运输局发行了免税零息债券,标志着政府开始参与长期零息券的发行.
1987年5月起,美国财政部也允许一个被剥离债券的息票重新组合成息票.
5.美国CD存单
美国CD存单(certificatedeposit):
由银行等金融机构向存款人改选的证券,存单上标有一个到期日和利率,并且以任意面值发行,可以买卖,偿还期限小于1年.
6.回购协议(repurchaseagreement)
短期抵押贷款,是指一方向另一方出售证券的同时,承诺在未来的某一天按协定的价格将相同的证券买回,通常由借款方发起并贷出证券,回购中涉及的证券通常具有较高的信用质量.
回购协议建立了货币市场和债券市场之间的联系.
回购协议的步骤:
(1)以债券作为抵押借入资金;
(2)经过一段时间,按照约定的价格买回抵押债券.
7.可转换债券(convertiblesecurity)
可转换债券(简称可转债)是一种具有固定收益的证券,其特点是持有者可以转换为普通股股票,在合约的条款中规定了可转换债券转换为普通股的条件,持有者决定何时转换为股票.
可转换债券介于普通股和普通债券之间,故又称股票类连接证券.
可转债属于次级债券,如果企业破产,满足要求权的次序是:
优先债权次级债可转债优先股普通股.
可见,总体上看,可转债属于权益类证券,其特点是享有先于普通股获得股息偿付的优先权和较高的收益,并且有机会分离公司股份上涨的好处.
8.浮动利率债券(FRN))
浮动利率债券(FRN,floatingratenotes)是偿还期内利率发生变化的债券.
如2010年3月到期,按委付息的浮动利率债券,其基准为3个月libor.
浮动利率债券具有以下几个特征:
①规定了利率上限与利率下限
②基准利率大多为LIBOR,也可为汇率、股票指数、债券指数等;
③利率可以正向浮动,也可以反向浮动。
此部分进PPT不进资料
联邦住房银行(FederalHomeLoanBank,不是房地美FreddieMac,房地美的前称是FederalHomeLoanCorp.)曾在1999年3朋发行了反向浮动债券,该债券支付的利率计算公式如下:
18%-2.5×三个月的LIBOR。
同时规定反向浮动利率下限为3%,上限为15.5%。
二.固定收益相关概念
1.交易日(tradedate
交易日就是买卖双方达成交易的日期。
但实际情况可能比这更复杂。
如果是通过拍卖方式购入的证券,交易日是拍卖结果被确认、购买者被告知他们分摊数量及价格的日期;如果固定收益证券由一承购集团成员所购买,交易日与牵头者最终将承销证券分配给成员的日期一致。
2.结算日(SettlementDate
指买入方支付价格和卖出方交割证券的日期。
美国国债交割日为交易之后第一个营业日(T+1)。
交割日也可以由交易者之间商定,如果交割日刚好支付利息,则债券当天出售者获得当天的利息支付,而债券的购买者获得其余款项。
有时通过FedWine机构交割证券,交易日即为交割日。
3.到期日(Maturity
指固定收益证券债务合约终止的日期。
到期日发行人应还清所有本息。
很多固定收益证券如定期存款、短期国库券、商业票据、再回见协议、外汇掉期、零息票债券等,只有一个到期日,日期计算都以这个到期日为基准。
4.本金(Principal)
本金有时称面值(parvalue),是指固定收益票面金额。
5.票面利率(Couponrate)
即发行人支付给持有人的利息,有时也称名义利率(nominalrate).
票面利率一般指按照单利计算的年利息率,利息支付的频率不同,实际利率当然就不同。
6.月末法则(endofmonthruler)
指当债券到期日在某有的最后一天,而且该月天数小于30天,这时有两种情况:
①到期日在每月固定日期支付;②票息在每月的最后一天支付。
Matlab默认的是第②种情况。
如:
今天2011年2月28日,半每付息制,下一次发息日可能是2011年8月28日,也可能是2011年8月31日,如果不用月末法则就是前者,如果用月末法则就是后者。
7.起息日到交割日的天数(DSM)
DSM:
daysfromcoupontosettlement):
指从计息日(令)到交割日(不含)之间的天数。
注意,注意付息日作为下一个利息期限的第一天而不计入DCS。
8.交割日距离到期日的天数(DSM)
DSM:
daysfromsettlementtomaturity):
其一般规则是包括交割日而不包括到期日。
(这样买方有动力尽早交易,获得当天收益;卖方在交割当天就获得资金的使用权)
第二节应计天数简介
应计天数是指,债券起息日或上一付息日至结算日的天数,在此期间发生的利息称为应计利息,matlab中可用helpdaysdif代码查看。
>>helpdaysdif
Theelementtype"name"mustbeterminatedbythematchingend-tag"".
Couldnotparse(从语法上描述)thefile:
d:
\matlab7\toolbox\ccslink\ccslink\info.xml
DAYSDIFDaysbetweendatesforanydaycountbasis.
DAYSDIFreturnsthenumberofdaysbetweenD1andD2usingthegiven
daycountbasis.Enterdatesasserialdatenumbersordatestrings.
D=daysdif(D1,D2)
D=daysdif(D1,D2,Basis)
OptionalInputs:
Compounding,Basis
Inputs:
D1-[ScalarorVector]ofdates.
D2-[ScalarorVector]ofdates.
OptionalInputs:
注意此处SIA标志在matlab的help中没有显示。
请记下来
Basis-[ScalarorVector]ofday-countbasis.
ValidBasisare:
0=actual/actual(default)
1=30/360(SIA)
2=actual/360
3=actual/365
(NEW)4-30/360(PSAcompliant)
(NEW)5-30/360(ISDAcompliant)
(NEW)6-30/360(European)
(NEW)7-act/365(Japanese)
实务中计算方法如下:
1.Act/Act:
按照实际天数计算,分平闰年;
2.Act/360:
一年360天;
3.Act/365:
一年365天;
4.30/360(European):
每月30天,每年360天,起始日或到期日为31日的改为30日;
5.30/360(ISDA):
每月30日,每年360天,起始日或到期日为31日改为30日,到期日为31日,起始日不为30日、31日,则不变;
6.30/360(PSA):
每月30日,每年360天,起始日或到期日为31日改为30日,到期日为31日,起始日不为30日、31日,则不变,2月最后一天为30日;
7.30/360(SIA):
每月30日,每年360天,起始日或到期日为31日改为30日,到期日为31日,起始日不为30日、31日,则不变,不是闰年,起始日到期日都为2月28日,则都改为30日,闰年,起始日到期日都为2月29日,则改为30日;
8.Act/365(Japanese):
每月30天,每年365天,不考虑闰年;
由于各计数法则之间太难区别,我们只考matlab的用法:
格式:
NumDays:
=daysdiff(StrateDate,EndDate,Basis)
日期的格式可以是:
纯数字‘月/日/年’的形式,如3/1/1999表示1999年3月1日,也可以是数字加英文月份的前三个字母,这时按日-月-年来排,如1-Mar-1999。
代码2:
>>StartDate='2/27/2007';
>>EndDate='3/31/2007';
>>Basis=0;
>>NumDays=daysdif(StartDate,EndDate,Basis)
NumDays=
32
代码3:
>>daysdif('2/27/2007','3/31/2007',0)
ans=32
例1:
计算Act/Act法则之下2007年2月27日至2007年3月31日之间的天数。
代码1:
>>StartDate='27-Mar-2007';
>>EndDate='31-Mar-2007';
>>Basis=0;
>>StartDate='27-Feb-2007';
>>NumDays=daysdif(StartDate,EndDate,Basis)
NumDays=
32
请解释下面matlab计算天数的结果的原因:
例2:
请分别用30E/360,ISDA,PSA,SIA法计算例1中的应计天数。
解:
30E/360,ISDA,PSA,SIA对basis代码分别是:
E_Days=daysdif('2/27/2007','3/31/2007',6)
E_Days=33
>>ISDA_Days=daysdif('2/27/2007','3/31/2007',5)
ISDA_Days=34
>>ISDA_Days=daysdif('2/27/2007','3/31/2007',5)
ISDA_Days=34
>>PSA_Days=daysdif('2/27/2007','3/31/2007',4)
PSA_Days=34
按理说行向量(分逗号隔开)也可以,但我运行之后没有显示
>>SIA_Days=daysdif('2/27/2007','3/31/2007',1)
SIA_Days=34
特别注意:
由于matlab实际上是矩阵的计算,所以变量多可为向量形式,如我们可以把StrateDate和EndDate写成列向量,一次输入多个起始日和到期日。
在此,一般用列向量,列的间隔符号是英语分号。
例3:
计算1998-03-01分别至2001-03-01,2002-03-01和2003-03-01之间的应计天数(ACT/ACT)。
解:
>>StartDate=['3/1/1998';'3/1/1998';'3/1/1998'];
EndDate=['3/1/2001';'3/1/2002';'3/1/2003'];
NumDays=daysdif(StartDate,EndDate)
NumDays=
1096
1461
1826
***作业1:
请用matlab计算出下表中的应计天数
Start-enddate
SIA
Act/360
PSA
ISDA
30E/360
2007-2-27—2007-3-1
4
2
4
4
4
2007-2-28—2007-3-1
1
1
3
1
3
2008-2-28—2008-3-1
3
2
3
3
3
2008-2-28—2009-3-1
363
367
363
363
363
参考答案:
%固定收益证券作业1参考代码
%SIAAct/360PSAISDA30E/360的basis代码分别为1,2,4,5,6
>>StartDate=['2/27/2007';'2/28/2007';'2/28/2008';'2/28/2008'];
>>EndDate=['3/1/2007';'3/1/2007';'3/1/2008';'3/1/2009'];
>>forBasis=1:
1:
6
ifBasis==3
NumDays=[0;0;0;0]
elseNumDays=daysdif(StartDate,EndDate,Basis)
end
end
%将除0000之外的那几例依次填入表的1-5例即可.如果你不会用程序控制语句,也可以一步步地求.
第三节应计利息、贴现与现金流
一.应计利息(Accruedinterest)
公式略。
调用方式:
AccruInterest=acrubond(IssueDate,Settle,FirstCouponDate,Face,CouponRate,Period,Basis)
Period和Basis是可选项。
Period指付息频率。
Period=n表示一年付n次息。
例4:
公司债券发行日是2000年3月1日,到期日为2006年3月1日,每年支付两次利息,交割日是2000年7月17日,息票率10%,面值100元,交割日和下一付息日(2000-09-01)之间的天数按30/360(European)计息。
请计算应计利息。
解法一:
30E/360E制度下,半年是180天,交割日和下一付息日之间的天数,由于每月只算30天,所以是44天.
那么该债券在本次结算时,应算从上一个付息日到交割日之间的天数,即从2000-03-01至2000-7-17之间的天数,显然这是180=44=136天。
由于每半年付一次息,其利率实为10%/2=5%,
所以应该利息AI为:
AI=100×5%×136/180=3.7778
解法二:
>>IssueDate='3/1/2000';
>>Settle='17-jul-2000';
>>FirstCouponDate='1-sep-2000';
>>Face=100;
>>CouponRate=0.1;
>>Period=2;
>>Basis=6;
AccruInterest=acrubond(IssueDate,Settle,FirstCouponDate,Face,CouponRate,Period,Basis)
出来的是错误信息。
我查了一下help原来是这个7.0版的matlab这里的basis最高只支持到3。
无赖之下,basis=6只好用1来代。
因为1是30/360,与6的30E/360较接近。
AccruInterest=acrubond(IssueDate,Settle,FirstCouponDate,Face,CouponRate,Period,1)
AccruInterest=3.7778
二.贴现率计算
尚缺函数,或未找到相应函数.
三、计算内部收益率
内部收益率是使投资现金流现值等于价格的收益率,其计算公式为:
,其中:
Ci为第i年度现金流,P为债券价格,N为年数,r为内部收益率。
Matlab计算函数:
irr
调用方式:
Return=irr(Cashflow)
例6:
一项投资各期现金流如下表,请计算该投资的内部收益率是多少?
第0期
第1期
第2期
第3期
第4期
-5000
1000
2000
3000
4000
解:
>>Cashflow=[-5000,1000,2000,3000,4000];
>>irr(Cashflow)
ans=0.2727
如果把这里的-5000改成-4000,那么ans=0.3825,这很容易理解。
四、现金流现值与终值
1.现金流现值的计算
现金流现值的计算公式是:
matlab命令是:
PesentVal=pvvar(Cashflow,Rte)
PesentVal=pvvar(Cashflow,Rate,IrrCFDates)这里IrrCFDates是指现金流发生的日期,Rate是指的贴现率.
例7:
一项投资各年的现金流如下表,贴现率为0.08,求其现值。
年份
当前
第1年
第2年
第3年
第4年
第5年
金额/元
-10000
2000
1500
3000
3800
5000
解:
>>cashflow=[-10000,2000,1500,3000,3800,5000];
>>rate=0.08;
>>pvvar(cashflow,rate)
ans=1.7154e+003即:
现值为1715.4。
请学生思考
请说说这项投资划得来吗?
(划得来,因为现值在超过了投资10000元,1715.4就是超过投资的部分)
例8:
已知贴现率为0.09,投资各时期的现金流如下表,求其再值。
现金发放日期
12-Jan-2007
14-Feb-2008
3-Mar-2008
14-Jun-2008
1-Dec-2008
金额/元
-10000
2500
200
3000
4000
解:
>>cashflow=[-10000,2500,2000,3000,4000];
>>rate=0.09;
>>irrcfdates=['01/12/2007'
'02/14/2008'
'03/03/2008'
'06/14/2008'
'12/01/2008'];
>>PresentVal=pvvar(cashflow,rate,irrcfdates)
PresentVal=142.1648
注意:
irrcfdates这个向量应写成列向量,列向量的写法是用分号分隔或用回车符分隔。
此外,月和年要写成2位数,如3月1日不能写成1/3,只能写成01/03,这是因为列向量的各元素要保持一致。
此处可以让学生在笔记本上算算看
判断下列写法是否正确:
>>irrcfdates=['01/12/2007';'02/14/2008';'03/03/2008';'06/14/2008';'12/01/2008'](正确的写法)
irrcfdates=['1/12/2007';'2/14/2008';'3/3/2008';'7/14/2008';'12/1/2008'](错误的写法,格式不统一)
irrcfdates=['1/12/2007'
'2/14/2008'
'3/3/2008'
'7/14/2008'
'12/1/2008'](错误的写法,格式不统一)
>>irrcfdates=['1/12/2007','2/14/2008','3/3/2008','7/14/2008','12/1/2008'](错误的写法,写成了行向量)
如果贴现率是变化的,怎么办?
如果贴现率是变化的,现金流现值的公式是怎样的?
资料上没有现成的函数,我自己编了个函数,经过反复测试,成功运行。
注意matlab中函数文件名要和函数名保持一致。
可变贴现率下现金流现值的计算:
function[PreValFlow,PresetVal]=PV_variable(P,r)%可变贴现率下现金流现值的计算
%计算可变再现率和对应的现金流的现值.
%P为各期现金流,r为贴现率向量,注意第0期的利率一定要设成0对应P第的一期应为负值,表示投资.
%注意P为行向量,r也为行向量,此二向量的元素要一样多.否则计算会出错.
[a,b]=size(r);
fori=1:
1:
b
C(i)=P(i)/((1+r(i))^(i-1));%再变成1/(1+ri)i(次方)
end
PV_variable=sum(C);%注意要转置
PresetVal=PV_variable
'各期现值为:
'
PreValFlow=C
(见PV_variable.m文件)
也可以用excel来计算,也很方便。
见文件:
可变贴现率情况下的现金流现值计算.xls
无论是自编函数PV_variable.m还是excel,最后算出来的结果都一样。
例9已知一项5000元的投资在其后的第1-4年的现金流分别为:
1000,2000,3000,4000元,贴现率分别为5%,6%,7%,8%,求这四年的现金流的现值是多少?
解:
利用我自编的可变现金流现值的函数PV_variable进行计算。
cashflow=[-5000,1000,2000,3000,4000];
rate=[0,0.05,0.06,0.07,0.08]
PV_variable(cashflow,rate)
PresetVal=
3.1214e+003
各期现值为:
PreValFlow=
1.0e+003*
-5.00000.95241.78002.44892.9401
2.现金流终值
现金流终值是债券到期时的价值。
用fvvar函数。