相関 〜 続編

トヨタ自動車のデータを取得。

> 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 」であるため線形回帰があてはまるだろうと分かる。