相関 〜 続編
トヨタ自動車のデータを取得。
> getSymbols("YJ7203", src='yahooj') [1] "YJ7203" > head(YJ7203) YJ7203.Open YJ7203.High YJ7203.Low YJ7203.Close YJ7203.Volume YJ7203.Adjusted 2007-01-04 8110 8140 8060 8090 6986200 8090 2007-01-05 8100 8100 7860 7900 10876000 7900 2007-01-09 7900 7930 7810 7870 9750900 7870 2007-01-10 7890 7890 7660 7690 11632000 7690 2007-01-11 7750 7790 7630 7660 10417100 7660 2007-01-12 7740 7840 7720 7820 11302500 7820
TOPIXのデータを取得。
> getSymbols("YJ998405", src='yahooj') [1] "YJ998405" > head(YJ998405) YJ998405.Open YJ998405.High YJ998405.Low YJ998405.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
それぞれ、終値のみを抽出。
> YJ7203.close<-YJ7203$YJ7203.Adjusted > YJ998405.close<-YJ998405$YJ998405.Close > length(YJ7203.close) [1] 2211 > length(YJ998405.close) [1] 2211
グラフを描く。
> plot(YJ998405.close)#TOPIXの株価 > plot(YJ7203.close) #トヨタ自動車の株価 > df.tpx_toyota<-data.frame(YJ7203.close, YJ998405.close) > plot(df.tpx_toyota) #株価分布図
今度はそれぞれのリターンを計算する。
> YJ7203_returns<-diff(log(YJ7203.close)) > YJ7203_returns<-YJ7203_returns[-1,] > head(YJ7203_returns) YJ7203.Adjusted 2007-01-05 -0.023765972 2007-01-09 -0.003804697 2007-01-10 -0.023137279 2007-01-11 -0.003908800 2007-01-12 0.020672571 2007-01-15 0.015228721 > YJ998405_returns<-diff(log(YJ998405.close)) > YJ998405_returns<-YJ998405_returns[-1,] > head(YJ998405_returns) YJ998405.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
lm関数を使い、線形回帰を行う。
これは「formula=YJ998405_returns ~ YJ7203_returns」としているので、「YJ998405_returns=a*YJ7203_returns+b」に相当する線形回帰に相当する。
> reg<-lm(YJ998405_returns ~ YJ7203_returns) > summary(reg) Call: lm(formula = YJ998405_returns ~ YJ7203_returns) Residuals: Min 1Q Median 3Q Max -0.049853 -0.004120 0.000351 0.004637 0.040947 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -2.994e-05 1.717e-04 -0.174 0.862 YJ7203_returns 6.455e-01 8.615e-03 74.923 <2e-16 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 0.00807 on 2208 degrees of freedom Multiple R-squared: 0.7177, Adjusted R-squared: 0.7176 F-statistic: 5613 on 1 and 2208 DF, p-value: < 2.2e-16 > b<-reg$coefficients[1] > a<-reg$coefficients[2]
グラフを描く。
> par(mfrow=c(2,2)) > plot(reg$residuals, main="Residuals", xlab="Days", ylab="Residuals") > hist(reg$residuals, breaks=100, main="Distribution of residuals", xlab="Residuals") > qqnorm(reg$residuals) > qqline(reg$residuals) > acf(reg$residuals, main="ACF")
これは残差を異なる4つの側面から見たもの。
ACFのグラフを見ると自己相関が無い。
次に、TOPIXのリターンと、TOYOTAのリターンを1日後ろにずらしたデータを得る。
データをずらすには、lag関数を使用する。
> df_topix_toyota_returns.xts.lag<-lag(df_topix_toyota_returns.xts, k=1) > head(df_topix_toyota_returns.xts) YJ998405.Close YJ7203.Adjusted 2007-01-05 -0.014000252 -0.023765972 2007-01-09 0.009972020 -0.003804697 2007-01-10 -0.017358980 -0.023137279 2007-01-11 -0.003783456 -0.003908800 2007-01-12 0.017086044 0.020672571 2007-01-15 0.011392958 0.015228721 > head(df_topix_toyota_returns.xts.lag) YJ998405.Close YJ7203.Adjusted 2007-01-05 NA NA 2007-01-09 -0.014000252 -0.023765972 2007-01-10 0.009972020 -0.003804697 2007-01-11 -0.017358980 -0.023137279 2007-01-12 -0.003783456 -0.003908800 2007-01-15 0.017086044 0.020672571
これを元データとマージする。
> df_topix_toyota_returns.xts.merge<-merge(df_topix_toyota_returns.xts, lag(df_topix_toyota_returns.xts)) > head(df_topix_toyota_returns.xts.merge) YJ998405.Close YJ7203.Adjusted YJ998405.Close.1 YJ7203.Adjusted.1 2007-01-05 -0.014000252 -0.023765972 NA NA 2007-01-09 0.009972020 -0.003804697 -0.014000252 -0.023765972 2007-01-10 -0.017358980 -0.023137279 0.009972020 -0.003804697 2007-01-11 -0.003783456 -0.003908800 -0.017358980 -0.023137279 2007-01-12 0.017086044 0.020672571 -0.003783456 -0.003908800 2007-01-15 0.011392958 0.015228721 0.017086044 0.020672571
さて、このようにして作成したデータを使用して、TOPIXとトヨタ自動車のリターンの相関を見てみる。
まずは、ラグがないデータでプロットする。
> plot(as.numeric(df_topix_toyota_returns.xts.merge[,1]),as.numeric(df_topix_toyota_returns.xts.merge[,2]), xlab="TOPIX lag=0", ylab="TOYOTA lag=0")
TOPIXの方をラグ1として、トヨタ自動車のリターンとの相関を見てみる。
> plot(as.numeric(df_topix_toyota_returns.xts.merge[,3]),as.numeric(df_topix_toyota_returns.xts.merge[,2]), xlab="TOPIX lag=1", ylab="TOYOTA lag=0")
相関性は無い。
線形回帰で調べてみる。
> reg1<-lm(as.numeric(df_topix_toyota_returns.xts.merge[,3])~as.numeric(df_topix_toyota_returns.xts.merge[,2])) > summary(reg1) Call: lm(formula = as.numeric(df_topix_toyota_returns.xts.merge[, 3]) ~ as.numeric(df_topix_toyota_returns.xts.merge[, 2])) Residuals: Min 1Q Median 3Q Max -0.099708 -0.007694 0.000533 0.008340 0.128574 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -8.747e-05 3.230e-04 -0.271 0.787 as.numeric(df_topix_toyota_returns.xts.merge[, 2]) -8.413e-03 1.621e-02 -0.519 0.604 Residual standard error: 0.01518 on 2207 degrees of freedom (1 observation deleted due to missingness) Multiple R-squared: 0.0001221, Adjusted R-squared: -0.000331 F-statistic: 0.2694 on 1 and 2207 DF, p-value: 0.6038
「Adjusted R-squared: -0.000331」であることから、決定係数が小さいことがわかる。つまり、線形回帰は当てはまらない。
なお、ラグがない場合はこちら。
> reg2<-lm(as.numeric(df_topix_toyota_returns.xts.merge[,1])~as.numeric(df_topix_toyota_returns.xts.merge[,2])) > summary(reg2) Call: lm(formula = as.numeric(df_topix_toyota_returns.xts.merge[, 1]) ~ as.numeric(df_topix_toyota_returns.xts.merge[, 2])) Residuals: Min 1Q Median 3Q Max -0.049853 -0.004120 0.000351 0.004637 0.040947 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -2.994e-05 1.717e-04 -0.174 0.862 as.numeric(df_topix_toyota_returns.xts.merge[, 2]) 6.455e-01 8.615e-03 74.923 <2e-16 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 0.00807 on 2208 degrees of freedom Multiple R-squared: 0.7177, Adjusted R-squared: 0.7176 F-statistic: 5613 on 1 and 2208 DF, p-value: < 2.2e-16
「Adjusted R-squared: 0.7176 」であるため線形回帰があてはまるだろうと分かる。