债券价格与收益率的Matlab实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
案例分析:债券定价与收益率的Matlab实现一、计算公式
(一)债券价格计算
1、一次还本付息债券的定价公式
P=P T(1+r c)T (1+r)T
其中,P T为债券面值,r c为票面利率,r为必要收益率/到期收益率/贴现率,T是债券期限。
2、附息债券的定价公式
P=∑
r c×P T (1+
r
n)
t
T×n
t=1+
P T (1+
r
n)
T×n
=r c×P T
r
[1?
1
(1+r/n)
]+
P T
(1+r/n)
其中,P T为债券面值,r c为票面利率,r为必要收益率/到期收益率/贴现率,T是债券期限(以年为单位),n为年付息次数。
实际上,附息债券的定价包括两类:其一,付息日的债券定价;其二,付息日之间的债券定价。上面的定价公式适用于情况一。当投资者在两个付息日之间购买债券时,债券发行人通常将在下一个付息日将本期利息支付给债券购买者,债券出售者无法获得本期利息。但是,由于出售者是在两个付息日之间卖出债券,他对本期利息也享有
部分权利。故此,债券购买者必须将下次利息支付的一部分付给出售者作为补偿,这部分利息被称为应计利息(Accrued interest)。美国的中长期国债按照“实际天数/实际天数”原则计算利息,即上一期付息日至交割日之间的实际天数除以上一期付息日至下一期付息日之间的实际天数。根据财政部、中国人民银行和中国证券监督管理委员会《关于试行国债净价交易有关事宜的通知》(财库[2001]12号),中国的附息国债采用净价交易制度,应计利息=面值×票面利率×应计息天数÷365(天)。其中,应计息天数是指上一期付息日至交割日的实际日历天数(1年按365天计算,闰年2月29日不计算利息),计息原则是“算头不算尾”,即付息日当天计算利息,到期日当天不计算利息。
债券报价通常不包含应计利息,即净价,而投资者购买债券支付的金额是包括应计利息的价格,即全价,全价=净价+应计利息。下面介绍债券全价和应计利息的常用计算方法:
P=
1
(1+r/n)T1/T2
[∑
r c
n×P T
(1+r/n)t?1
T
t=1
+
P T
(1+r/n)T?1
]
应计利息=P T×r c
n
×
T3
T2
式中,T1表示交割日至下一期付息日之间的实际天数,T2表示上一期付息日至下一期付息日(即两个付息日)之间的实际天数,T3表示上一期付息日至交割日之间的实际天数,T表示交割日至清偿日或到期日之间的付息次数,P表示债券全价,P T表示债券面值,r c表示票面利率,r表示市场利率或贴现率,n表示年付息次数。
(二)到期收益率计算
在衡量债券收益率的指标中,到期收益率(Yield to maturity,YTM)是应用最广泛的指标。到期收益率是指使得债券未来现金流的现值正好等于债券当前的市场价格的贴现率。它是按复利计算的收益率,考虑了货币的时间价值,能够较好地反映债券的实际收益。
1、零息债券的到期收益率
零息债券只有一笔现金流,它的到期收益率计算公式为:
P=
P T
(1+r YTM)T
式中,T是距离到期日的年数,r YTM是到期收益率,P T和P分别为债券面值和债券的市场价格。
2、附息债券的到期收益率
计算附息债券的到期收益率是计算债券价值的逆过程,可以将式(16-4)和(16-8)中的r替换为到期收益率r YTM得到。
第一,在付息日购买的债券的到期收益率计算方法,如下所示:
P=∑
r c
n×P T (1+r YTM/n)t
T
t=1+
P T
(1+r YTM/n)T
上式也适用于n=1,即每年支付一次利息的情形。
第二,在付息日之间购买的债券的到期收益率计算方法,如下所示:
P=
1
(1+r YTM/n)
[∑
r c
n×P T
(1+r YTM/n)
T
t=1
+
P T
(1+r YTM/n)
]
二、Matlab实现
(一)债券价格计算
Matlab的Financial Toolbox提供了计算债券价格的bndprice 函数,该函数既可用于在付息日交割的债券定价,也适用于在两个付息日之间交割的债券定价。
常用调用格式:
[Price, AccruedInt] = bndprice(Yield, CouponRate, Settle, Maturity, Period, Basis)
主要输入参数:
?Yield:到期收益率
?CouponRate:票面利率
?Settle:结算日
?Maturity:到期日
?Period:年付息次数,默认值为2,可选0、1、2、3、4、6、12。
?Basis:(可选项)债券的天数计算方法,默认值为0(实际值/实际值),常见选项具体如下:
?0:实际值/实际值
?1:30/360
?2:实际值/360
?3:实际值/365
输出参数:
?Price:价格(净价),全价=净价+交割日利息
?AccruedInt:交割日的利息
注意:银行间债券市场于2001年7月开始实行净价交易,沪深交易所市场也于2002年开始实行净价交易。在净价交易条件下,由于交易价格不含有应计利息,所以其价格形成及变动能够更加准确地体现债券的内在价值、供求关系及利率的变动趋势。通过净价交易,有利于投资者对市场利率走势和债券交易决策做出更为理性的判断。
【算例1】
债券A:到期收益率为3%,票面利率4%,年付息2次,面值为100,交割日为2016年6月1日,到期日为2018年6月1日。交割日在付息日。
债券B:到期收益率为3%,票面利率4%,年付息2次,面值为100,交割日为2016年3月1日,到期日为2018年6月1日。交割日在多于1个付息期的两次付息日之间。
债券C:到期收益率为3%,票面利率4%,年付息2次,面值为100,交割日为2018年3月1日,到期日为2018年6月1日。交割日在不足1个付息期的两次付息日之间。
计算代码如下:
% 到期收益率
Yield=0.03;
% 票面利率
CouponRate=0.04;
% 交割日
Settle_A='01-Jun-2016';
Settle_B='01-Mar-2016';
Settle_C='01-Mar-2018';
% 到期日
Maturity='01-Jun-2018';
% 债券A的净价和应计利息
[Price_A,Accured_A]=bndprice(Yield,CouponRate,Settle_A, Maturity);
% 债券B的净价和应计利息
[Price_B,Accured_B]=bndprice(Yield,CouponRate,Settle_B, Maturity);
% 债券C的净价和应计利息
[Price_C,Accured_C]=bndprice(Yield,CouponRate,Settle_C, Maturity);
% 计算结果输出
Price=[Price_A;Price_B;Price_C]
Accured=[Accured_A;Accured_B;Accured_C]
计算结果如下:
Price =
101.9272
102.1577
100.2462
Accured =
0.9945
0.9890
(二)到期收益率计算
Matlab的Financial Toolbox提供了债券到期收益率的计算函数bndyield。该函数既可用于在付息日交割的债券到期收益率计算,也适用于在两个付息日之间交割的债券到期收益率计算。
常用调用格式:
Yield = bndyield(Price, CouponRate, Settle, Maturity, Period, Basis)
主要输入参数:
?Price:债券净价
?CouponRate:票面利率
?Settle:结算日
?Maturity:到期日
?Period:年付息次数,默认值为2,可选0、1、2、3、4、6、12。
?Basis:(可选项)债券的天数计算方法,默认值为0(实际值/实际值),常见选项具体如下:
?0:实际值/实际值
?1:30/360
?2:实际值/360
?3:实际值/365
输出参数:
?Yield:到期收益率
【算例2】
债券A:票面利率为5%,面值为100元,每年付息两次(6月底和12月底),交割日为1997年12月31日,到期日为2002年6月30日,净价为104.8106元。
债券B:票面利率为5%,面值为100元,每年付息两次(6月底和12月底),交割日为1997年12月31日,到期日为2002年6月30日,净价为95.4384元。
债券C:票面利率为5%,面值为100元,每年付息两次(6月底和12月底),交割日为1998年1月20日,到期日为2002年6月30
日,净价为99.9951元。
计算代码如下:
% 票面利率都为5%
CouponRate=0.05;
% 债券净价
Price_A=104.8106;
Price_B=95.4384;
Price_C=99.9951;
% 交割日
Settle_AB='31-Dec-1997';
Settle_C ='20-Jan-1998';
% 到期日都是2002年6月30日
Maturity='30-Jun-2002';
% 调用bndyield函数
Yield_A=bndyield(Price_A,CouponRate,Settle_AB,Maturity) Yield_B=bndyield(Price_B,CouponRate,Settle_AB,Maturity) Yield_C=bndyield(Price_C,CouponRate,Settle_C ,Maturity)
计算结果如下:
Yield_A =
0.0383
Yield_B =
0.0618
Yield_C =
0.0500
本案例分析中所有代码均在MatlabR2014a环境下运行。
参考资料:
[1]郑志勇、王洪武. 金融数量分析—基于MATLAB编程[M]. 北京:
北京航空航天出版社, 2018.
[2]张志涌、杨祖樱. Matlab教程[M]. 北京:北京航空航天大学出
版社, 2017.