Rの金利期間構造パッケージ termstrc
ファイナンス系パッケージ探訪。fBonds、YieldCurveパッケージに続きtermstrcパッケージを使ってみたメモ
Journal of Statistical SoftwareからZero-Coupon Yield Curve Estimation with the Package termstrcが出ており、パッケージの詳しい説明が書かれているので、本気で使いたい場合は一読が必要
fBonds、YieldCurveと比較して、クーポン債にも適用できる、Cubicスプラインによる推定ができる、adjusted Svenssonモデルも適用できる、Rcpp使っている、その他、有用な関数が入っている、ということがtermstrcの特徴になっている
まずは、パッケージを読み込んで、中身を確認
library(termstrc)
パッケージマニュアルには、関数がかなり細かく説明されているが、逆に何を使ったらよいかわからなくなっている
基本的な使い方としては、データがゼロクーポン債(zeroyields)なのかクーポン債(couponbonds)なのかを指定して、estim_nssでモデルのパラメータを推定する
> data(gobbonds) > class(govbonds) [1] "couponbonds" > str(govbonds$GERMANY) List of 8 $ ISIN : chr [1:52] "DE0001141414" "DE0001137131" "DE0001141422" "DE0001137149" ... $ MATURITYDATE: Date[1:52], format: "2008-02-15" "2008-03-14" ... $ ISSUEDATE : Date[1:52], format: "2002-08-14" "2006-03-08" ... $ COUPONRATE : num [1:52] 0.0425 0.03 0.03 0.0325 0.0413 ... $ PRICE : num [1:52] 100 99.9 99.8 99.8 100.1 ... $ ACCRUED : num [1:52] 4.09 2.66 2.43 2.07 2.39 ... $ CASHFLOWS :List of 3 ..$ ISIN: chr [1:384] "DE0001141414" "DE0001137131" "DE0001141422" "DE0001137149" ... ..$ CF : num [1:384] 104 103 103 103 104 ... ..$ DATE: Date[1:384], format: "2008-02-15" "2008-03-14" ... $ TODAY : Date[1:1], format: "2008-01-30" > ns_res <- estim_nss(govbonds, c("GERMANY", "AUSTRIA", "FRANCE"), + matrange = c(0, 30), method = "ns", tauconstr = list(c(0.2, 5, 0.1), c(0.2, 5, 0.1), c(0.2, 5, 0.1))) [1] "Searching startparameters for GERMANY" beta0 beta1 beta2 tau1 5.132836 -1.274357 -3.208435 2.700100 [1] "Searching startparameters for AUSTRIA" beta0 beta1 beta2 tau1 5.050193 -1.327244 -2.629411 2.500100 [1] "Searching startparameters for FRANCE" beta0 beta1 beta2 tau1 5.108886 -1.217795 -3.068065 2.500100 > summary(ns_res) --------------------------------------------------- Goodness of fit: --------------------------------------------------- GERMANY AUSTRIA FRANCE RMSE-Prices 0.3582276 0.1801092 0.2214637 AABSE-Prices 0.1992019 0.1224709 0.1182047 RMSE-Yields (in %) 0.0847062 0.0185987 0.0392355 AABSE-Yields (in %) 0.0498615 0.0155659 0.0275024 --------------------------------------------------- Startparameters: --------------------------------------------------- beta0 beta1 beta2 tau1 GERMANY 5.13284 -1.27436 -3.20844 2.70010 AUSTRIA 5.05019 -1.32724 -2.62941 2.50010 FRANCE 5.10889 -1.21779 -3.06807 2.50010 --------------------------------------------------- Convergence information: --------------------------------------------------- optim() convergence info GERMANY 0 AUSTRIA 0 FRANCE 0 optim() solver message GERMANY NULL AUSTRIA NULL FRANCE NULL
クーポン債の場合には、データセットのように関数が適用できる形にデータを直したりするのが面倒かもしれない
パラメータを推定して、その時系列推移を見るという場合に結構使えるかもしれない。 ustycパッケージを使って、米国債イールドデータに適用してみる
library(ustyc) maturities <- c(1/12, 1/4, 1/2, 1, 2, 3, 5, 7, 10, 20, 30) yc <- getYieldCurve(year = "2014") yields <- as.matrix(yc$df[-12]) dates <- rownames(yields) datazeroyields <- zeroyields(maturities, yields, dates)
一応、これだけで、3Dプロットが出力できる
> datazeroyields This is a data set of zero-coupon yields. Maturities range from 0.0833333333333333 to 30 years. There are 250 observations between 2014-01-02 and 2014-12-31 . > class(datazeroyields) [1] "zeroyields" > plot(datazeroyields)
Nelson-Siegelモデルを当てはめる
ns_res <- estim_nss(datazeroyields, "ns", tauconstr = c(0.2, 6, 0.1))
まとめて、出力を見てみる
> ns_res --------------------------------------------------- Estimated Nelson/Siegel parameters: --------------------------------------------------- Number of oberservations: 250 [[1]] beta_0 beta_1 beta_2 tau_1 Min. :2.826 Min. :-4.350 Min. :-5.656 Min. :1.024 1st Qu.:3.358 1st Qu.:-3.853 1st Qu.:-4.890 1st Qu.:1.284 Median :3.698 Median :-3.634 Median :-4.343 Median :1.381 Mean :3.674 Mean :-3.601 Mean :-4.392 Mean :1.388 3rd Qu.:3.953 3rd Qu.:-3.313 3rd Qu.:-3.988 3rd Qu.:1.485 Max. :4.476 Max. :-2.801 Max. :-2.575 Max. :1.668 > summary(ns_res) --------------------------------------------------- Goodness of fit: --------------------------------------------------- [,1] RMSE-Yields (in %) 0.0334253 AABSE-Yields (in %) 0.0277030 --------------------------------------------------- Convergence information from optim (): --------------------------------------------------- [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 0 0 0 0 0 0 0 0 0 0 [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [1,] 0 0 0 0 0 0 0 0 0 … > head(param(ns_res)[[1]]) beta_0 beta_1 beta_2 tau_1 [1,] 4.471780 -4.345616 -5.655850 1.545545 [2,] 4.476129 -4.349701 -5.596621 1.545772 [3,] 4.447632 -4.340263 -5.538249 1.561728 [4,] 4.421710 -4.323720 -5.432554 1.570774 [5,] 4.420168 -4.326042 -5.409182 1.511038 [6,] 4.380350 -4.294240 -5.321058 1.522402
Nelson-Siegelモデルならば、パッケージの使用例に書かれているtauconstrを指定すればよいが、Svensson、adjusted Svenssonだとoptimのところで収束しない、もしくは、パラメータの推定値がおかしな場合があるので、変えた方がよい
パラメータの時系列推移と各ファクターの寄与をプロット
> plot(param(ns_res)) > fcontrib(param(ns_res), index = 1, m = 1:30, method = "ns")
一年を通して、長期金利が低下傾向だったので、このような感じになる
満期が長くなるにつれて、長期水準以外のファクターの影響は小さくなっていく
関数が適用できる形にデータを持っていけば、いろいろなモデルに当てはめられる、良い感じの出力やプロットが得られるところがtermstrcのメリット。簡単に使えるシンプルさだったら、YieldCurveパッケージ
ggplot2を使いたい、もっと自由にいろいろデータを加工、適用したいという時にはtermstrcは少し面倒。このようなパッケージを参考に、自分で関数を作りながらやったほうが勉強にもなるし、分析はしやすい…