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