urcaパッケージを使用した定常性検定 〜 続編

前回「urcaパッケージを使用した定常性検定」の続き。

今回はTOPIXのリターンについて、リターンの分布を調べる。
※)ちなみに、以前のエントリー「Rで確率・統計の中級 〜 株価の分布」では(TOPIXではないが)価格の分布を調べた。その時、価格分布は非定常であった。

TOPIXのデータをquantmodを利用してyahoo finance Japanから取得。

> library(quantmod)
> getSymbols('YJ998405.T', src='yahooj')
[1] "YJ998405.T"
> head(YJ998405.T)
           YJ998405.T.Open YJ998405.T.High YJ998405.T.Low YJ998405.T.Close
2007-01-04         1692.94         1701.45        1692.21          1698.95
2007-01-05         1697.06         1697.15        1670.35          1675.33
2007-01-09         1672.68         1696.02        1670.24          1692.12
2007-01-10         1690.59         1690.98        1657.44          1663.00
2007-01-11         1668.57         1675.94        1650.82          1656.72
2007-01-12         1670.33         1692.03        1667.65          1685.27

試しにplotしてみる(やらなくてもいいけど・・・)。

> plot(YJ998405.T)


終値だけを取得して別の変数に格納する。

> topix.close<-YJ998405.T$YJ998405.T.Close
> head(topix.close)
           YJ998405.T.Close
2007-01-04          1698.95
2007-01-05          1675.33
2007-01-09          1692.12
2007-01-10          1663.00
2007-01-11          1656.72
2007-01-12          1685.27

日次リターンを計算する。

> topix_returns<-diff(log(topix.close))
> head(log(topix.close))
           YJ998405.T.Close
2007-01-04         7.437766
2007-01-05         7.423765
2007-01-09         7.433737
2007-01-10         7.416378
2007-01-11         7.412595
2007-01-12         7.429681

とりあえず可視化。

> plot(topix_returns)

その前に、実はtopix_returnsにはNA要素が含まれているので取り除く。。。

> head(topix_returns)
           YJ998405.T.Close
2007-01-04               NA
2007-01-05     -0.014000252
2007-01-09      0.009972020
2007-01-10     -0.017358980
2007-01-11     -0.003783456
2007-01-12      0.017086044
> topix_returns<-topix_returns[-1,]
> head(topix_returns)
           YJ998405.T.Close
2007-01-05     -0.014000252
2007-01-09      0.009972020
2007-01-10     -0.017358980
2007-01-11     -0.003783456
2007-01-12      0.017086044
2007-01-15      0.011392958

TOPIXの日次リターンの分布を描く。

> topix_returns_mean<-mean(topix_returns)
> topix_returns_mean
[1] -8.698338e-05
> topix_returns_sd<-sd(topix_returns)
> topix_returns_sd
[1] 0.01517636
> hist(topix_returns, breaks=100, prob=T, cex.main=0.9)
> abline(v=topix_returns_mean, lwd=2)

よく見る結果。

ちなみに、データ期間を指定したい場合は、次のようにすればいい。

> hist(topix_returns['2007::2008'], breaks=100, prob=T, cex.main=0.9)

さて、TOPIXの日次リターンの分布グラフに正規分布を重ねて見る。
TOPIXの日次リターンの標準偏差TOPIX日次リターンの平均を用いた正規分布のグラフは関数dnormを使用して、次のようにして作成できる。

> x <- seq(-5*topix_returns_sd, 5*topix_returns_sd, length=nrow(topix_returns))
> plot(x, dnorm(x, topix_returns_mean, topix_returns_sd), col="red", lwd=2)

これをhistグラムを描いた後に、plot関数をlines関数に変えて実行すればいい。
※)probability=T と指定することによって相対度数で作図している。
※)cex.main=0.9はタイトルの拡大率を指定している。

> hist(topix_returns, breaks=100, cex.main=0.8, prob=TRUE)
> lines(x, dnorm(x, topix_returns_mean, topix_returns_sd), col="red", lwd=2)

さて、この図を見ると、リターンの分布は正規分布であるような、無いような。いったいどちらなのだろうか。
データの正規性(データが正規分布に従うかどうか)を調べる手法が「正規Q-Qプロット」であった。
※)「【Rによるデータサイエンス】線形回帰分析 〜 重回帰分析」で勉強した。

「正規Q-Qプロット」を使ってTOPIX日次リターンの正規性を調べる。
【Rによるデータサイエンス】非線形回帰分析 〜 一般化線形モデル」で学習したように、qqnormを使用して、引数に対する期待正規ランクスコアをプロットする。そして、qqlineを使用してqqnormにて書かれた上にデータの上四分位点と下四分位点を結ぶ直線を描く。

> qqnorm(as.numeric(topix_returns), main="TOPIX returns qqplot", cex.main=0.8)
> qqline(as.numeric(topix_returns), lwd=2, col="red")
> grid() #グリッド線を描く

これを見ると、TOPIXの日次リターンは正規分布とは言いがたい。

更にこれをshapiro検定で確かめてみる。
shapiro検定は「時系列データ分析の本を読んでの整理4」で勉強した。

> shpiroResult<-shapiro.test(as.numeric(topix_returns))
> summary(shpiroResult)
          Length Class  Mode     
statistic 1      -none- numeric  
p.value   1      -none- numeric  
method    1      -none- character
data.name 1      -none- character
> shpiroResult$p.value
[1] 3.766362e-30
> shpiroResult$statistic
       W 
0.934349 

p値が小さく、データが正規分布に従うという帰無仮説を棄却できそう。