用R語言用Nelson Siegel和線性插值模型對債券價格和收益率建模|附代碼數據

2023-04-14     tecdat拓端

原標題:用R語言用Nelson Siegel和線性插值模型對債券價格和收益率建模|附代碼數據

原文連結:http://tecdat.cn/?p=11758

最近我們被客戶要求撰寫關於Nelson Siegel和線性插值模型的研究報告,包括一些圖形和統計輸出。

保證金購買是指投資者先從銀行或經紀人處借得資金購買證券,而所購買的證券作為借入資金的抵押

債券基礎

  • 零息債券是指以貼現方式發行,不附息票,而於到期日時按面值一次性支付本利的債券。
  • 債券的票麵價值 債券的票麵價值又稱面值,是債券票面標明的貨幣價值,是債券發行人承諾在債券到期日償還給債券持有人的金額。
  • 債券可以參考價格或收益率。例如,將支付100元的零息債券的價格可以是90元。但收益率將為(100−90)/90=11%,而不是10%。
  • 債券收益率是投資於債券上每年產生出的收益總額與投資本金總量之間的比率。
  • 債券可以在二級市場上交易(一級市場是債券發行過程)。如果利率增加,債券的價值就會增加,如果利率降低,債券的價值就會減少,這僅僅是因為該債券是在利率改變之前以便宜/昂貴的價格發行的。也可以做空債券。
  • 雖然期望債券不會出現負利率,但也不是完全看不到。在危機時期,政府債券甚至公司債券都可以以負收益率交易(例如雀巢)。

債券定價

債券價格是通過使用票面利率和現金流來確定。

式中,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()

## [1] 952.381

如果我們有合適的證券,我們也可以從息票支付債券中構建零息票債券。

  • 1年期純貼現債券在95出售。
  • 兩年期8%的債券售價99元。

2年期純折價債券的價格為99-0.08(95)= 91.4。

複利類型

簡單複利

假設利率為0.05,期限為2年。100美元的價格在到期時將是多少。

定期複利

如果將利息永久添加到本金投資中,那麼我們的複利就是利率。假設相同的示例,但每半年復算一次。

年名義利率為

連續複利

現在,假設複利的頻率很高,以至於在兩次加息之間的時間間隔是無限小(接近零)。然後在極限情況下

因此,以我們的示例為例,連續複利的年利率是

給定一組零息票債券價格,我們可以計算連續收益率

#例如,債券價格為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_10YR_3M1.00000000.99833900.99400450.98375590.97447800.95461890.93995040.9230412R_6M0.99833901.00000000.99817150.98998200.98171970.96322680.94917610.9332366R_1Y0.99400450.99817151.00000000.99599370.99001950.97461740.96218950.9478956R_2Y0.98375590.98998200.99599371.00000000.99848440.98968110.98088960.9694621R_3Y0.97447800.98171970.99001950.99848441.00000000.99585830.98961850.9804575R_5Y0.95461890.96322680.97461740.98968110.99585831.00000000.99836290.9936744R_7Y0.93995040.94917610.96218950.98088960.98961850.99836291.00000000.9981232R_10Y0.92304120.93323660.94789560.96946210.98045750.99367440.99812321.0000000點擊標題查閱往期內容

R語言使用隨機技術差分進化算法優化的Nelson-Siegel-Svensson模型

左右滑動查看更多

01

02

03

04

債券價格和收益率

在這一部分中,我們將看到構建債券價格和收益率的方法。

直接法

假設您得到以下債券利率。請記住,名義匯率是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

點擊文末 「閱讀原文」

獲取全文完整代碼數據資料。

本文選自《用R語言用Nelson Siegel和線性插值模型對債券價格和收益率建模》。

點擊標題查閱往期內容

分解商業周期時間序列:線性濾波器、HP濾波器、Baxter濾波器、Beveridge Nelson分解等去趨勢法

R語言中的Nelson-Siegel模型在匯率預測的應用

R語言用神經網絡改進Nelson-Siegel模型擬合收益率曲線分析

分解商業周期時間序列:線性濾波器、HP濾波器、Baxter濾波器、Beveridge Nelson分解等去趨勢法

用R語言用Nelson Siegel和線性插值模型對債券價格和收益率建模

R語言用神經網絡改進Nelson-Siegel模型擬合收益率曲線分析

R語言和QuantLib中Nelson-Siegel模型收益曲線建模分析

R語言使用隨機技術差分進化算法優化的Nelson-Siegel-Svensson模型

用R語言用Nelson Siegel和線性插值模型對債券價格和收益率建模R語言用神經網絡改進Nelson-Siegel模型擬合收益率曲線分析

R語言中的Nelson-Siegel模型在匯率預測的應用

python使用LASSO回歸預測股票收益

R語言數據的收益率和波動性交易

R語言用線性模型進行預測:加權泊松回歸,普通最小二乘,加權負二項式模型,多重插補缺失值

使用SAS,Stata,HLM,R,SPSS和Mplus的分層線性模型HLM

R語言用線性回歸模型預測空氣品質臭氧數據

文章來源: https://twgreatdaily.com/ebcfe7577dd4bb3d546a4ec0b1d1963e.html