已知债券的价格,如何计算债券到期收益率?

问题

基金业从业考试中,对应债券投资中的债券价值分析有如下类似的题目:

某3年期债券的面值为100元,每年付息一次,票面利率为8%,若该债券的市场价格为102元,则其到期收益率为()。A:8.00%B:7.84%C:7.19%.D:6.87%

这样的题目如何计算求解呢?

本题考查到期收益率的计算。债券的估值也是基于现金流贴现估值法(discounted cash flow,DCF)。任何资产的内在价值等于投资者对持有该资产的未来现金流的现值。债券市场价格和到期收益率的关系式为:

P=\sum\limits_{t=1}^{n}\frac{C}{(1+y)^t}+\frac{M}{(1+y)^n)} ......(1)

式中:P表示债券市场价格;C表示每期支付的利息;n表示时期数;M表示债券面值,y表示到期收益率。

回到本题,n=3年,每年付息一次,M=100元,票面利率为8%,C=面值x票面利率=100x8%=8(元),P=102元。将数值代入公式,求解表达式:

102=\frac{8}{1+y}+\frac{8}{(1+y)^2}+\frac{108}{(1+y)^3)} ......(2)

这样的方程是一元三次方程,求解是比较麻烦的。教科书给出的方法是采用代入法,将选项一个一个代入公式中,使得等式两边相等的数值即为所求的到期收益率。

如果这个问题不是一个选择题,而是一个问答题。也就是已经知道债券的价格,如何求解到期收益率呢?

我想到了用电脑编程来求解。

目前最简单高效的编程应该是Python。可以采用迭代法来求解,也就是所谓的用电脑算力来暴力求解。假设一个收益率y0作为初值,不断迭代y(增加或者减少一个步幅),直到计算出来的现值p和已经知道的现值的差距小于某一个误差门限。本程序设置的到期收益率迭代步幅为delta_y=0.0001,相当于0.01%;现值迭代收敛误差门限delta_p=0.01。python代码如下: 

 

c=8 #债券票面利息
p0=102 #债券现值
y0 = float(c/p0) #当期收益率
y=y0 #到期收益率初始化为当期收益率
p=c/(1+y)+c/(1+y)**2+(100+c)/(1+y)**3 #现值计算公式
delta_y = 0.0001 #到期收益率迭代步幅
delta_p = 0.01 #现值迭代收敛误差门限

while(abs(p-p0)>delta_p): #已经现值求收益率,迭代法,
  if(p>p0): #超过现值,需要提升收益率,降低现值
    y+=delta_y
    p=c/(1+y)+c/(1+y)**2+(100+c)/(1+y)**3
    if (p<p0):
      break
  else:  #低于现值,需要降低收益率,提升现值
    y-=delta_y
    p=c/(1+y)+c/(1+y)**2+(100+c)/(1+y)**3
    if (p>p0):
      break
print(f'coupon rate:{c:.2f}%')#打印票面利率
print(f'spot rate:{y0*100:.2f}%') #打印即期收益率
print(f'yield rate:{y*100:.2f}%')  #打印到期收益率
print(f'present value:{p:.4f}')   #打印现值  
在电脑中运行这个程序,求解的结果如下:

coupon rate:8.00%
spot rate:7.84%
yield rate:7.23%
present value:102.0039

因此,本文开始的这个计算题目,正确答案应该选C。

到期收益率的初值假设

Python程序中,到期收益率的迭代初值假设为当期收益率(y0)。是债券的年利息收入与当前的债券市场价格的比率。其计算公式为:

y_0=\frac{C}{P}
  • y0表示当前收益率,C表示债券每期利息;P表示债券市场价格。

虽然假设到期收益率的初值y0为其他值也可能最终迭代得到正确结果,但是假设y0为当期收益率是一个优选,可以节省迭代步数,减少计算量。

教科书也讲到债券到期收益率和当期收益率的关系

  • 债券市场价格越接近面值,期限越长,则其当期收益率越接近到期收益率
  • 不论当期收益率和到期收益率的近似程度如何,当期收益率的变动总是预示着到期收益率的同向变动。当债券市场价格走高时,当期收益变低,到期收益率也会变低;反之;如果市场利率走高,带动债券到期收益率走高,债券的市场价格会下跌。

另外,教科书也提到:债券市场价格越偏离债券面值,期限越短,则当期收益率越偏离到期收益率。比如,假设我们将债券的现值由102元调整为110元,重新运行程序,结果如下:

coupon rate:8.00%
spot rate:7.27%
yield rate:4.37%
present value:109.9952

可以看到。到期收益率为4.37%,较大偏离即期收益率7.27%。

债券价格-收益率曲线

实际上方程(1)表示了债券价格和到期收益率之间的函数关系。根据方程(2),可以用Python编程绘出债券价格-到期收益率曲线。采用的代码如下:

from pylab import *
c=8 #债券票面利息
y = np.linspace(0.001,0.9,256,endpoint=True)
p=c/(1+y)+c/(1+y)**2+(100+c)/(1+y)**3
plot(y,p)
xlabel("y yield rate")
ylabel("p price")
title("p=c/(1+y)+c/(1+y)**2+(100+c)/(1+y)**3")
show()

运行上述代码,得到债券价格-到期收益率曲线如下图:

上图给出了价格-收益率曲线。这是一根单调向下的曲线,也就是随着到到期收益率的增加,债券的价格是下行的。

另外一个重要特征是,这条曲线是向下凸起的。这反映了债券的凸性,意味着,当收益率升高一个单位幅度时,债券价格下降的幅度比较小。当收益率降低一个单位时,债券价格上升的幅度比较大。

扩展:三种类型债券的内在价值分析

我们上面讨论了固定利率债券。实际上还有另外两种类型债券,分别为:

  • 零息债券
  • 统一公债

零息债券以低于面值的贴现方式发行,不支付利息,到期按债券面值偿还的债券。债券的内在价值由以下公式决定:

图片加载中

$$P=\frac{M}{(1+r)^t}$$ ......(3)

式中,P表示零息债券的内在价值或者现值;M表示面值;r表示年化市场利率;t表示债券到期时间,单位是年。

统一公债是一种没有到期日的特殊债券。在现代企业中,优先股的股东可以无限期获得固定股息,因此也相当于一种统一公债。

统一公债的内在价值的计算公式和公式(1)类似,表示如下:

P=\frac{C}{1+r}+\frac{C}{(1+y)^2)}+...+\frac{C}{(1+r)^n}=\frac{C}{r} ......(4)

上式中,

r>0,n\to\infty

根据式(4),如果持有1股优先股,每年固定的分红为10元,市场利率为10%,则1股的市场价格为100元。相当于10年回本。如果期望5年回本,则或者每年取得的固定分红为20元,或者1股优先股的价格降低为50元。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值