用R語言用Nelson Siegel和線性插值模型對債券價格和收益率模組化
原文連結:http://tecdat.cn/?p=11758
債券基礎
- 鍵 是一個合同,作者與初始付款義務以預定的時間(s)(成熟)的錢付預定量。這類似于借入利息和付款結構的錢。
- 零息債券 是一種特殊類型的鍵,其在到期時支付出僅一次沒有中間付款。
- 債券的面額/票面金額/本金是發行人在到期時所支付的金額。标準價值通常為$ 1000。
- 債券可以參考價格或收益。例如,将支付$ 100的零息債券的價格可以是$ 90。但收益率将是(100-90)/ 90 = 11%(100-90)/ 90 = 11%,而不是10%10%。
- 債券價格的一個常見約定是,它們最終收于100。這就是為什麼當利率上升時,債券價格下降,反之亦然。另一種慣例是美分兌美元(例如,90美分兌美元)。
- 債券收益率被稱為年利率。例如,十年期政府債券的收益率為2%,這意味着它的年收益将為2%,而不是10年後。
- 債券可以在二級市場上交易(一級市場是債券發行過程)。如果利率增加,債券的價值就會增加,如果利率降低,債券的價值就會減少,這僅僅是因為該債券是在利率改變之前以便宜/昂貴的價格發行的。也可以做空債券。
- 即使不期望債券産生負利率,也不是完全看不見的。在危機時期,政府債券甚至公司債券可以負收益進行交易。
定價債券
債券價格是通過使用票面利率和現金流量确定債券的現值來确定的。

其中CFt是時間tt的現金流量,B(0,t)是美元的折扣率或時間00的價格。
其中R(0,t)是在時間為tt時在時間00的年度即期匯率。我們可以重新安排
B(0,t)也可以稱為零息債券的價格。大多數債券不是零息債券,但是有可能使用零息債券構造幾乎所有支付結構。
我們可以暗示與市場債券不同期限的零息票利率。然後,我們可以使用這些利率建立期限結構模型來對任何債券定價。嚴格違反期限結構可能是買賣機會,也可能是套利機會。
calculate_bond_price<-function(face_value=1000,coupon_rate=0.05,maturity=1,yearly_coupons=0){
#This function calculates the price of the bond B(0,t) given
#its face value, maturity, annual coupon rate and equidistant payment
#if yearly_coupons == 0, it only pays out at the maturity
#if yearly_coupons == 1, it pays out annually
#if yearly_coupons == 2, it pays out semiannually
if(yearly_coupons==0){
face_value/((1+coupon_rate)^maturity)
}else{
face_value/((1+coupon_rate/yearly_coupons)^(yearly_coupons*maturity))
}
}
calculate_bond_price()
## [1] 952.381
如果我們有适當的證券,我們也可以從付息債券中構造零息債券。從講義中假設我們有兩個紐帶。
- 1年期純貼現債券在$ 95出售。
- 兩年期8%的債券售價99美元。
2年期純折價債券的價格為99-0.08(95)= 91.499-0.08(95)= 91.4(通過買入兩年期債券多頭和買入一年期債券空頭0.08個機關(以抵消第一個債券的收益)年優惠券)。
複利類型
簡單複合
這是僅應用一次利率的方法。假設利率為0.05,期限為2年。100美元的價格在到期時将是多少。
定期複利
如果将利息永久添加到本金投資中,那麼我們的複利就是利率。假設相同的示例,但每半年複算一次。
産生的年名義利率為 。
連續複利
現在,假設複利的頻率很高,以至于在兩次加息之間的時間間隔是無限的(接近零)。然後在極限情況下
看起來很熟悉?
是以,以我們的示例為例,連續複利的年利率是
給定一組零息票債券價格,我們可以計算連續收益率
#Example bond price is 0.987 and maturity is half a year.
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_3M | R_6M | R_1Y | R_2Y | R_3Y | R_5Y | R_7Y | R_10Y | |
---|---|---|---|---|---|---|---|---|
1.0000000 | 0.9983390 | 0.9940045 | 0.9837559 | 0.9744780 | 0.9546189 | 0.9399504 | 0.9230412 | |
0.9981715 | 0.9899820 | 0.9817197 | 0.9632268 | 0.9491761 | 0.9332366 | |||
0.9959937 | 0.9900195 | 0.9746174 | 0.9621895 | 0.9478956 | ||||
0.9984844 | 0.9896811 | 0.9808896 | 0.9694621 | |||||
0.9958583 | 0.9896185 | 0.9804575 | ||||||
0.9983629 | 0.9936744 | |||||||
0.9981232 | ||||||||
債券價格和收益率
在這一部分中,我們将看到提取和建構債券價格和收益率的方法。
直接法
假設您得到以下債券利率。請記住,名義匯率是100。
優惠券 | 到期 | 價錢 | |
---|---|---|---|
債券1 | 5.0 | 1個 | 101.0 |
債券2 | 5.5 | 2 | 101.5 |
債券3 | 3 | 99.0 | |
債券4 | 6.0 | 4 | 100.0 |
零息債券價格(B(0,t)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
##Or use the R function
yield_interpolate<-approxfun(x=c(3,4),y=c(0.055,0.06))
yield_interpolate(3.75)
## [1] 0.05875
三次插值
假設我們的費率如下:
#Interpolate for a bond of 2.5 years
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參數的估計
YieldCurve
上述R包 具有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
- 這些R講義也将遵循固定收益證券:Martellini,Priaulet和Priaulet撰寫的“估值風險管理和投資組合政策”。
- 債券可以在收益率之上額外溢價或折價購買或出售。純折扣意味着沒有額外的折扣或溢價。
▍關注我們
【大資料部落】第三方資料服務提供商,提供全面的統計分析與資料挖掘咨詢服務,為客戶定制個性化的資料解決方案與行業報告等。
▍咨詢連結:http://y0.cn/teradat
▍聯系郵箱:[email protected]