金融ネタとか備忘録とか

社会人6年目になりました(23年4月)。個人的に勉強したことをメモしていきます(2018年3月)。

RによるSVモデルの推計

概要

shiba-ryu0209.hatenablog.com

SVモデルについて

SVモデルの説明は,渡部(2000)とShepard(2005)*1を援用。

ボラティリティ変動モデル (シリーズ 現代金融工学)

ボラティリティ変動モデル (シリーズ 現代金融工学)

株式のt期の収益率Rtは,t-1期の期待値Et-1(Rt)と予測不可能なショックεtで説明される。

 R_{t} = E_{t-1} ( R_{t} ) + \varepsilon_{t}

予測不可能なショックεtは,変数σtと平均0,分散1のi.i.d系列にしたがう確率変数ztの積。

 \varepsilon_{t} = \sigma_{t} z_{t}, \ \sigma_{t} > 0, \ z_{t} ~ i.i.d., \ E [ z_{t} ] = 0, \ Var( z_{t} ) = 1

σtの2乗を,ボラティリティと呼ぶ。

SVモデルは,ボラティリティの対数値の変動を線形ARMAによって定式化。 通常,AR(1)モデル

 \ln ( \sigma_{t}^{2} ) = \omega + \phi \ln ( \sigma_{t-1}^{2} ) + \eta_{t}, \ \eta_{t}~i.i.d.N ( 0, \sigma_{ \eta }^{2} )

が用いられる。Φが1に近ければ近いほど,ショックの持続性が高い。

データの取得

とりあえず,quantmodパッケージを使って日経平均株価終値の日次データを取得。

(適当に)今回も前回同様にQQE導入以降で。ついでに対数差分をとって日次収益率に変換。

#パッケージの読込
library("quantmod")

#データの読込
nikkei <- getSymbols("^N225", src = "yahoo", from = as.Date("2013-04-04"),
                     to = as.Date("2017-08-18"), auto.assign = FALSE) 
nikkei.price <- nikkei$N225.Close

#対数差分をとって収益率に変換
nikkei.return <- diff(log(nikkei.price))[-1]
nikkei.return <- na.spline(nikkei.return)

得た日次収益率をプロットすると,次のように。 f:id:shiba_ryu0209:20170826195017j:plain

SVモデルの推計

Rパッケージstochvolを使って推計する。 パッケージのマニュアル*2を見ると,

“Efficient algorithms for fully Bayesian estimation of stochastic volatility (SV) models via Markov chain Monte Carlo (MCMC) methods.”

と書いてある。

関数svsampleを使うと推定できる(らしい)ので,やってみる(事前分布は適当に設定)。

#SVモデルの推計
#サンプリング回数は10000回
res <- svsample(nikkei.return, draws = 10000, burnin = 2000,
                priormu = c(-10,1), priorphi = c(20,1.1), priorsigma = 0.1) 
summary(res, showlatent = FALSE)

推定結果は次の通り。

Summary of 10000 MCMC draws after a burn-in of 2000.

Prior distributions:
mu        ~ Normal(mean = -10, sd = 1)
(phi+1)/2 ~ Beta(a0 = 20, b0 = 1.1)
sigma^2   ~ 0.1 * Chisq(df = 1)

Posterior draws of parameters (thinning = 1):
            mean     sd      5%    50%    95%  ESS
mu        -8.971 0.1964 -9.2912 -8.968 -8.661 5809
phi        0.948 0.0169  0.9179  0.950  0.973  324
sigma      0.298 0.0448  0.2302  0.295  0.377  203
exp(mu/2)  0.011 0.0011  0.0096  0.011  0.013 5809
sigma^2    0.091 0.0276  0.0530  0.087  0.142  203

Φの推定値を見ると0.948であり,ボラティリティのショックには高い持続性があることがわかる。

パッケージ内のvolplot関数を使うと,推定ボラティリティの推移をプロットしてくれる。

volplot(res, col = c(2,1,2))

f:id:shiba_ryu0209:20170828153535p:plain

また,パッケージ内のparatraceplot関数を使うと,推定パラメータの推移をプロットしてくれる。

par(mfrow = c(3,1))
paratraceplot(res)

f:id:shiba_ryu0209:20170828154218p:plain

パッケージ内のparadensplot関数を使うと,事前分布と事後分布をプロットしてくれる。

par(mfrow = c(2,2))
paradensplot(res)

f:id:shiba_ryu0209:20170828154521p:plain

補足
  • 推定ボラティリティの推移の図の横軸を推定期間の営業日にしたかったが,日付関連のプログラミングがよく分からなかったので今度挑戦したい(アホですみません)。

  • SVモデルの論文をいくつか読んで,事前分布の設定を勉強しないといけないなと実感

  • 多変量モデルでも推計できるらしいので,いつか活用したい