GRGと金融工学・統計解析

趣味で金融工学や統計解析を勉強しており,このブログでは自分が面白いと思ったことの紹介などをしていきます.色々な方との議論などできたらいいなぁと思います.

S&P500と日経225の時系列分析(グレンジャー因果性・インパルス応答関数)

前回 – > S&P500と日経225の時系列分析(VARモデル) - GRGと金融工学・統計解析

はじめに

前回は,VARモデルを用いてS&P500と日経225のlog-returnの近年の関係性について調べていきました.今回は,折角VARモデルを用いたのだから,グレンジャー因果性やインパルス応答などについて触れたいと思います(少しずつ口調を軽くしていきたい・・・.なぜか文章を書くととても固くなってしまう・・・.).グレンジャー因果性やインパルス応答に関しては,以下のサイトが沖本本の内容をとても丁寧に説明しているため,ここでは省略していきます.

Rで計量時系列分析:VARモデルから個々の時系列データ間の因果関係を推定する - 六本木で働くデータサイエンティストのブログ

グレンジャー因果性

では,まずはじめにグレンジャー因果性についてです.Rのvarsパッケージを使って検定をしていきましょう.

#グレンジャー因果性

causality(VAR_parameter,cause = "SP500_return") #S&P500が日経225に影響を与えているか

$Granger

    Granger causality H0: SP500_return do not Granger-cause
    NIKKEI_return

data:  VAR object VAR_parameter
F-Test = 76.5, df1 = 4, df2 = 2342, p-value < 2.2e-16      # <-- 有意になっている


$Instant

    H0: No instantaneous causality between: SP500_return and
    NIKKEI_return

data:  VAR object VAR_parameter
Chi-squared = 38.29, df = 1, p-value = 6.096e-10

causality(VAR_parameter,cause = "NIKKEI_return") #日経225がS&P500に影響を与えているか

$Granger

    Granger causality H0: NIKKEI_return do not Granger-cause
    SP500_return

data:  VAR object VAR_parameter
F-Test = 0.93108, df1 = 4, df2 = 2342, p-value = 0.4448   # <-- 有意ではない


$Instant

    H0: No instantaneous causality between: NIKKEI_return and
    SP500_return

data:  VAR object VAR_parameter
Chi-squared = 38.29, df = 1, p-value = 6.096e-10

以上の結果から,S&P500から日経225に向けての因果性は統計的に認められるが,その逆は主張することは難しい,というようなことが言えそうです.しかしグレンジャー因果性だけでは,その影響の強度までは知ることができません.そこで用いられるのが,インパルス応答関数と呼ばれるものです.では,そのインパルス応答関数を見ていきます.

インパルス応答関数

#インパルス応答関数

impulse_func <- irf(VAR_parameter,n.ahead = 15,ci = 0.95,ortho = FALSE)
ortho_impulse_func <- irf(VAR_parameter,n.ahead = 15,ci = 0.95,ortho = TRUE)
plot(impulse_func)
plot(ortho_impulse_func)

今回は,非直交化インパルス応答関数と直交化インパルス応答関数を推定してその差があるかどうかも見ていきます.上記のサイトでは,直交化インパルス応答関数を中心に説明がなされているので,補足としてここで直感的な違いを説明します.例えば,S&P500のインパルス応答を推定する際には,S&P500の残差を1単位動かしたときにS&P500自身や日経225にどのような影響が出るのかを調べています.しかし,S&P500だけの残差を単純に動かしていいのでしょうか?S&P500の残差と日経225の残差の間には相関関係があるから,片方だけを動かすなんてことを許していいのか?というような問題が生じます.それを無視してインパルス応答関数を作ったものが,非直交化インパルス応答関数です.そして,コレスキー分解などを用いて残差の部分を直交化したものを用いてインパルス応答関数を作ったものが直交化インパルス応答関数です.直交化のイメージを持つために,数式を使って見ていきましょう.

{ \displaystyle
y_1 (t) = \alpha_1 + \beta_1 y_1 (t-1) + \epsilon_1 (t)
}

{ \displaystyle
y_2 (t) = \alpha_2 + \beta_2 y_2 (t-1) + \epsilon_2 (t)
}

という2つの式があったとします.\( \epsilon_1 , \epsilon_2 \)は相関があるとします.ここでその相関を無視して\( \epsilon_1 \)を動かしてインパルス応答関数を見たものが非直交化インパルス応答関数になります.では,直交化したらどのような形になるのか.それが次のような式となります.

{ \displaystyle
y_1 (t) = \alpha_1 + \beta_1 y_1 (t-1) + u_1 (t)
}

{ \displaystyle
y_2 (t) = \alpha_2 + \beta_2 y_2 (t-1) + \gamma_1 u_1 (t) + \gamma_2 u_2 (t) \dots (1)
}

ここで\( u_1 , u_2 \)は無相関です.このように残差の部分を無相関な残差で表現することができるようになります.これが直交化です.この形なら\( u_1 \)を動かせば\( y_1 \)の影響を相関を気にせず見ることができます.今回は,\( y_1 \)がS&P500のlog-return,\( y_2 \)が日経225のlog-returnを表しています.

少し長くなってしまいましたが,非直交化インパルス応答関数の結果は以下のようになりました.

f:id:GRG:20170310031054j:plain f:id:GRG:20170310031116j:plain

結果を見ると,前回言及したことがそのまま図示されているような形となっていることがわかります.S&P500のlog-returnが1単位上昇すると,次の日の日経225のlog-returnが急上昇していることがわかります.しかし,その効果は2日以降までは続かないことが明らかとなりました.

では逆に日経225のlog-returnが与える影響はどうでしょう.悲しいことに,日本の株式市場が頑張ったところで,アメリカの株式市場にはほとんど影響を及ぼさないことが見て取れます.これはグレンジャー因果性でみた結果と整合的です.

次に直交化インパルス応答関数を見てみましょう.

f:id:GRG:20170310031138j:plain f:id:GRG:20170310031147j:plain

直交化して変わった点は,S&P500のlog-returnが上昇したときには,同時点で日経225のlog-returnも上昇しているという点です.この結果はなぜ生じたのでしょうか?その理由は,コレスキー分解により日経225のlog-returnの残差の中にS&P500のlog-returnの残差の成分が出てくるからです((1)式を見ればわかります).

このようにS&P500の固有の撹乱項\( u_1 \)が日経225に影響を与えているような構造となるのは,コレスキー分解などの三角分解を用いるからですが,この構造のことを再帰的構造と呼びます.実はこれはとても重要な仮定となっており,インパルス応答関数を調べる際には,変数の並び方が重要であることを示しています.つまり,先ほどの数式を用いて説明すると,\( y_1 \)固有の撹乱項\( u_1 \)は\( y_2 \)に大きく影響を与えるのに対し,その逆はほとんどない!(1期間先の場合は影響なし.2期間以上先では微小ながら影響を与える)ということを意味しているからです.そのため,なるべく様々な変数に影響を与えていると考えられる変数を先に持ってこないとモデルがおかしなことになってしまうため注意が必要です.今回は,S&P500を先に持ってきているため,問題はないと考えられます.

最後に

今回は,グレンジャー因果性とインパルス応答関数について見ていきました.次回は,分散分解について触れていきたいと思います.他にも色々と興味があることがあるので,紹介していけたらいいなぁと思います.

ちなみに

前回や今回は,共和分について無視して差分をとって分析を行っています.しかし,実際の流れとしては共和分の存在を検定してからでないといけません.そこで,共和分の検定を行ってみたところ,共和分は存在しないというような結果が得られました.そのため,今回の推定の結果は変なプロセスを踏んでいるわけではなさそうです.共和分検定の結果は以下のようになりました.

#共和分検定
JO_test <- ca.jo(Dat,ecdet="const",type="eigen",K=4)
PO_test <- ca.po(Dat,demean="none",lag="long",type="Pz")
summary(JO_test)

###################### 
# Johansen-Procedure # 
###################### 

Test type: maximal eigenvalue statistic (lambda max) , without linear trend and constant in cointegration 

Eigenvalues (lambda):
[1] 0.2608555 0.2121007 0.0000000

Values of teststatistic and critical values of test:

           test 10pct  5pct  1pct
r <= 1 | 281.29  7.52  9.24 12.97
r = 0  | 356.67 13.75 15.67 20.20

Eigenvectors, normalised to first column:
(These are the cointegration relations)

                 SP500_return.l4 NIKKEI_return.l4   constant
SP500_return.l4     1.0000000000      1.000000000  1.0000000
NIKKEI_return.l4   -0.2777481844    -15.963568672  0.4697312
constant           -0.0003749595      0.006346735 -2.0376624

Weights W:
(This is the loading matrix)

                SP500_return.l4 NIKKEI_return.l4      constant
SP500_return.d       -1.1999481       0.02184248  4.107961e-20
NIKKEI_return.d       0.9008641       0.05736370 -5.206698e-20

summary(PO_test)

###
#重要なところだけ抜粋
###

Value of test-statistic is: 1728.919 

Critical values of Pz are:
                  10pct    5pct    1pct
critical values 33.9267 40.8217 55.1911