计算当前价格买入的国债的到期收益率

1 一个实例

假设今天是2018/3/5日,国债010107的面值为100,票面利率为4.26%,每年分红两次,一次是1/31日,一次是7/31日,到期日为2021/7/31日,当前价格为100.88,问,如果以当前价格买入,持有到期的收益率是多少?

首先列出该债券未来的现金流如下:

18/7/31 19/1/31 19/7/31 20/1/31 20/7/31 21/1/31 21/7/31
2.13 2.13 2.13 2.13 2.13 2.13 102.13

直接计算终值,这里按单利计算:

\[ 2.13*6 + 102.13 = 114.91 \]

因此总的收益率为:

\[ \frac{114.91}{100.88} - 1 = 0.139 \]

从今天开始计算至到期的时间为:

d1=as.Date("2018-03-05")
d2=as.Date("2021-07-31")
days=as.numeric(difftime(d2,d1),units='days')
years=days/365.0
3.40821917808219

接下来,利用收益率除以时间即可,也就是

\[ \frac{0.139}{3.408} = 4.08\% \]

所以这里的4.08就是到期收益率。

1.1 对报价的修正

这里有一个问题需要注意,就是上交所的国债标价,100.88元。这个价格是国债不含利息的价格,因此要购入这个国债,需要付出的钱要多余100.88,而其所含的利息为

d1=as.Date("2018-03-05")
d0=as.Date("2018-01-31")
days=as.numeric(difftime(d1,d0),units='days')
interests=4.26*days/365.0
0.385150684931507

故而,最终的收益率为: \[ \frac{114.91}{100.88+0.385} - 1 = 0.1347 \] 年收益率为: \[ \frac{0.1347}{3.408} =3.95\% \]

2 公式

\[ 到期收益率 = \frac{终值/(买入价格+当前已产生利息) - 1}{距离到期的时间(以年为单位)} \]

其中,终值为各期利息与最后的本利之和。因此需要弄清楚到底该债券还要派几次息,分别列出并求和。再把最后一期的本息加在一起,得到最后的终值。这里还是要给出一个公式,方便今后的使用:

\[ r = \frac{ \frac{nm + (M+m)}{买入价格+票面年息*(买入的日期-上次派息的日期)/365} - 1}{(到期日-买入日)/365} \]

注意,这里的买入价格是不含息的价格,即上交所的国债报价。其中的m为每次派息的值,n为派息的次数。M为最后的返还的面值,m为最后一期的派息,一般这个派息与前面各次派息的值一样,因此仍旧使用m来表示。

3 验证

把这个结果与上交所公布的结果不完全一致,这一天,上交所公布的利息为0.4元,收益率为3.98,和上面的结果略有出入,但差距不大。

上交所公布这个结果的地方为: http://www.sse.com.cn/market/bonddata/profit/

每天收盘以后就会更新当天的数据,因此可以直接查询这里的数据。如果盘中需要进行结果就需要自己进行计算了。

4 利用贴现法计算到期收益率

还是基于上面的例子,以4%的贴现率可以计算一个现值,如果这个现值比当前的标价高,就说明当前的到期收益率大于4%,然后利用5%的贴现率计算现值,再与报价进行比较,如此即可逼近当前报价下的到期收益率。

这里首先以5%的贴现率来进行计算:

对于n个整年的贴现,可直接写为 \(\frac{C}{(1+r)^n}\) , 推广一下,不满一年或者非整年的贴现计算,其中的n应该为小数。比如18/7/31的2.13贴现到18/3/5的计算如下:

d1=as.Date("2018-03-05")
d2=as.Date("2018-07-31")
years=as.numeric(difftime(d2,d1),units='days')/365.0
pv=2.13/(1+0.05)^years
2.08827542675857

因此,最终的计算为

days=c(as.Date("2018-07-31"),as.Date("2019-01-31"),as.Date("2019-07-31"),
       as.Date("2020-01-31"),as.Date("2020-07-31"),as.Date("2021-01-31"),
       as.Date("2021-07-31"))
val=c(2.13,2.13,2.13,2.13,2.13,2.13,102.13)
d0=as.Date("2018-03-05")
years=as.numeric(difftime(days,d0),units="days")/365.0
pv = val/(1+0.05)^years
sum(pv)

计算出来的结果为98.28, 如果去贴现率为4%,那么计算出来的结果为101.33。

如果取上交所公布的收益率3.98,那么计算出来的结果为101.39.

如果减去利息0.38,得到报价为

5% 97.9
4% 100.95
3.98% 101.01

相对于当天的报价100.88,可知,其到期收益率约为略微大于4%。

由此可见,利用R来计算未来现金流的贴现是比较方便的,只要计算未来发放现金的日期与当前日期的差值(以年为单位表示)就可以直接贴现到当前日期。

5 利用tvm包计算到期收益率

参考文章 R包tvm



本文地址: http://www.bagualu.net/wordpress/archives/6774 转载请注明




发表评论

电子邮件地址不会被公开。 必填项已用*标注