用R语言用Nelson Siegel和线性插值模型对债券价格和收益率建模

虽然期望债券不会出现负利率,但也不是完全看不到。在危机时期,政府债券甚至公司债券都可以以负收益率交易(例如雀巢)。

由Kaizong Ye,Coin Ge撰写

保证金购买是指投资者先从银行或经纪人处借得资金购买证券,而所购买的证券作为借入资金的抵押。


  • 零息债券_是指以贴现方式发行,不附息票,而于到期日时按面值一次性支付本利的债券。
  • 债券的票面价值 债券的票面价值又称面值,是债券票面标明的货币价值,是债券发行人承诺在债券到期日偿还给债券持有人的金额。

债券可以参考价格或收益率。例如,将支付100元的零息债券的价格可以是90元。但收益率将为(100−90)/90=11%,而不是10%。

债券收益率_是投资于债券上每年产生出的收益总额与投资本金总量之间的比率。

债券可以在二级市场上交易(一级市场是债券发行过程)。如果利率增加,债券的价值就会增加,如果利率降低,债券的价值就会减少,这仅仅是因为该债券是在利率改变之前以便宜/昂贵的价格发行的。也可以做空债券。

  • 虽然期望债券不会出现负利率,但也不是完全看不到。在危机时期,政府债券甚至公司债券都可以以负收益率交易(例如雀巢)。

课程

R语言数据分析挖掘必知必会

从数据获取和清理开始,有目的的进行探索性分析与可视化。让数据从生涩的资料,摇身成为有温度的故事。

立即参加

债券定价

债券价格是通过使用票面利率和现金流来确定。

式中,CFt是t时的现金流,B(0,t)是贴现系数或0时价格

其中R(0,t)是在时间为t时在时间0的年度即期汇率。

B(0,t)也可以称为零息债券的价格。

我们可以暗示零息票利率与市场上不同期限的债券。然后我们可以用这些利率建立一个期限结构模型来为任何债券定价。严格违反期限结构可能是买入/卖出机会,也可能是套利机会。

calculate_bond_price<-function(face_value=1000,coupon_rate=0.05,maturity=1,yearly_coupons=0){
    #该函数根据给定的债券B(0,t)的面值,到期日,年息率和等距付款来计算其价格
    #如果 yearly_coupons == 0, 它只在到期时支付
    #如果 yearly_coupons == 1, 每年支付一次
    #如果 yearly_coupons == 2, 每半年支付一次
    if(yearly_coupons==0){
        face_value/((1+coupon_rate)^maturity)
    }else{
        face_value/((1+coupon_rate/yearly_coupons)^(yearly_coupons*maturity))
    }

}
calculate_bond_price()

定期复利

如果将利息永久添加到本金投资中,那么我们的复利就是利率。假设相同的示例,但每半年复算一次。

年名义利率为  

连续复利

现在,假设复利的频率很高,以至于在两次加息之间的时间间隔是无限小(接近零)。然后在极限情况下

因此,以我们的示例为例,连续复利的年利率是 

给定一组零息票债券价格,我们可以计算连续收益率 


R语言用神经网络改进Nelson-Siegel模型拟合收益率曲线分析

阅读文章


 #例如,债券价格为0.987,期限为半年。
calculate_yield(0.987,0.5)
## [1] 0.02617048

远期汇率

假设有两个到期日不同的债券

可以重新排列成


随时关注您喜欢的主题


imply_forward_rate<-function(R0t1=0.04,R0t2=0.045,t1=1,t2=2){

    ((1+R0t2)^t2/(1+R0t1)^t1)^(1/(t2-t1)) -1

}
imply_forward_rate()
## [1] 0.05002404

到期日的相关性

债券到期期限是指债券从发行之日起至偿清本息之日止的时间,也是债券发行人承诺履行合同义务的全部时间。

利率不仅随着到期日变化,而且随着时间变化。我们还将调用某些数据和计算。

让我们加载库并检查收益率曲线数据。

##             R_3M  R_6M  R_1Y  R_2Y  R_3Y  R_5Y  R_7Y R_10Y
## 1981-12-31 12.92 13.90 14.32 14.57 14.64 14.65 14.67 14.59
## 1982-01-31 14.28 14.81 14.73 14.82 14.73 14.54 14.46 14.43
## 1982-02-28 13.31 13.83 13.95 14.19 14.13 13.98 13.93 13.86
## 1982-03-31 13.34 13.87 13.98 14.20 14.18 14.00 13.94 13.87
## 1982-04-30 12.71 13.13 13.34 13.78 13.77 13.75 13.74 13.62
## 1982-05-31 13.08 13.76 14.07 14.47 14.48 14.43 14.47 14.30

相关系数矩阵显示出收益率没有完全相关。

R_3MR_6MR_1YR_2YR_3YR_5YR_7YR_10Y
R_3M1.00000000.99833900.99400450.98375590.97447800.95461890.93995040.9230412
R_6M0.99833901.00000000.99817150.98998200.98171970.96322680.94917610.9332366
R_1Y0.99400450.99817151.00000000.99599370.99001950.97461740.96218950.9478956
R_2Y0.98375590.98998200.99599371.00000000.99848440.98968110.98088960.9694621
R_3Y0.97447800.98171970.99001950.99848441.00000000.99585830.98961850.9804575
R_5Y0.95461890.96322680.97461740.98968110.99585831.00000000.99836290.9936744
R_7Y0.93995040.94917610.96218950.98088960.98961850.99836291.00000000.9981232
R_10Y0.92304120.93323660.94789560.96946210.98045750.99367440.99812321.0000000

债券价格和收益率

在这一部分中,我们将看到构建债券价格和收益率的方法。

直接法

假设您得到以下债券利率。请记住,名义汇率是100。

息票到期价钱
债券15.01个101.0
债券25.52101.5
债券35.0399.0
债券46.04100.0

零息债券价格(B(0,t)

然后我们得到 

 get_zero_coupon()
## $B0t
## [1] 0.9619048 0.9119386 0.8536265 0.7890111
## 
## $R0t
## [1] 0.03960396 0.04717001 0.05417012 0.06103379

线性插值

R03<-0.055
R04<-0.06

R03p75<-((4-3.75)*0.055+(3.75-3)*0.06)/(4-3)
R03p75
## [1] 0.05875
##或使用R函数
yield_interpolate<-approxfun(x=c(3,4),y=c(0.055,0.06))
yield_interpolate(3.75)
## [1] 0.05875

三次插值

假设我们的费率如下: 

 #插值2.5年的债券
t_val<-2.5
sum(abcd_vec*((2.5)^(3:0)))
## [1] 0.0534375
## [1] 0.0534375

间接方法(Nelson Siegel)

尼尔森·西格尔(Nelson Siegel)模型是模拟利率收益率曲线的一种流行方法。

其中θ是到期日,β0是长期收益率,β1是斜率参数,β2是曲率参数,τ是比例参数。

 ns_data <-
data.frame(maturity=1:30) %>%
mutate(ns_yield=nelson_siegel_calculate(theta=maturity,tau=3.3,beta0=0.07,beta1=-0.02,beta2=0.01))

head(ns_data)

##   maturity   ns_yield
## 1        1 0.05398726
## 2        2 0.05704572
## 3        3 0.05940289
## 4        4 0.06122926
## 5        5 0.06265277
## 6        6 0.06376956
ggplot(data=ns_data, aes(x=maturity,y=ns_yield)) + geom_point() + geom_line()

可以使用参数来更好地估计收益曲线。

Nelson Siegel参数的估计

Nelson Siegel曲线估计。

##              beta_0     beta_1   beta_2    lambda
## 1981-12-31 14.70711 -5.3917409 3.269125 0.5123605
## 1982-01-31 14.35240 -0.7602066 2.834508 0.1887807
## 1982-02-28 13.74481 -0.9247232 2.681840 0.1236869

注意:我们将lambda称为tau(ττ)(形状参数)。

Beta灵敏度

考虑提供Fi未来现金流的债券价格  。因此,带有beta参数的价格变化如下。

 nelson_siegel_sensitivities(coupon_rate=0.05,maturity=2)
##      Beta0      Beta1      Beta2 
## -192.51332 -141.08199  -41.27936
nelson_siegel_sensitivities(coupon_rate=0.05,maturity=7)
##     Beta0     Beta1     Beta2 
## -545.4198 -224.7767 -156.7335
nelson_siegel_sensitivities(coupon_rate=0.05,maturity=15)
##     Beta0     Beta1     Beta2 
## -812.6079 -207.1989 -173.0285


可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498