共和分と総最小二乗法(TLS) 〜 主成分分析(PCA)の利用
「COINTEGRATION AND TOTAL-LEAST-SQUARES REGRESSION」を読んでのメモ*1。
まずはこの5点。
1.ある1つの株価データを使って、別の株価データの動きを計算する
2.線形回帰「株価A〜株価B」を計算し、式「株価A = intercept + beta * 株価B」におけるbetaとinterceptを計算する
3.スプレッド「S = 株価A - (intercept + beta * 株価B)」を計算する。
4.ADF検定を行い、スプレッドSが定常的か否かを判定する。
5.スプレッドSが定常的ならば、2つの株価は共和分の関係にある。
なお、共和分の定義については、ここのブログから引用すると下記。
定義6.2(共和分) xtとytを単位根(I(1))過程とする。axt+bytが定常(I(0))過程となるようなaとbが存在するとき、xtとytとの間には共和分(cointegration)の関係がある、もしくはxtとytは共和分している(cointegrated)といわれる。より一般的には、ytをI(1)とする。a′ytがI(0)過程となるようなaが存在するとき、ytには共和分の関係がある、もしくはytは共和分しているといわれる。また、このとき、(a,b)′やaは共和分ベクトル(cointegrating vector)と呼ばれる。
さて、Rで線形回帰を行ってスプレッドSを求めるにはlm関数を使用する。
lm(株価A〜株価B)
もしも、interceptを0にしたい場合は次のようにする。
lm(株価A〜株価B+0)
しかし、lm関数はOLS(最小二乗法)に基づいた計算を行っているため、問題が生じる。
簡潔に述べると、「株価Aと株価Bの従属関係を入れ替えた場合、株価を入れ替えた後に計算したβは、株価を入れ替える前のβの逆数になっているようにしたいが、OLSだとそうはならない」。
これを解決するには、OLSではなく、TLS(総最小二乗法)を使用すれば良い。
しかし、RでTLSを計算するにはどのようにすればよいのだろうか。lm関数ではTLSを使えない。
解決方法は、PCA(主成分分析)を使用することである。
これを実際に確認して見る。
使用するデータは、「TOPIXと個別銘柄の価格」で使用したUFJの株価とTOPIXの株価で行う。
> head(returns) YJ8306.Adjusted YJ998405.Close 2013-01-07 -0.016667052 -0.008420174 2013-01-08 -0.029852963 -0.010473928 2013-01-09 0.015037877 0.008189979 2013-01-10 0.010604553 0.011277954 2013-01-11 0.010493276 0.010818415 2013-01-15 0.008316056 0.008343955
> r1<-princomp(~returns[,1]+returns[,2]) > beta1<-r1$loadings[1,1]/r1$loadings[2,1] > r1 Call: princomp(formula = ~returns[, 1] + returns[, 2]) Standard deviations: Comp.1 Comp.2 0.025507386 0.006616398 2 variables and 244 observations. > beta1 [1] 1.526714
> r2<-princomp(~returns[,2]+returns[,1]) > beta2<-r2$loadings[1,1]/r2$loadings[2,1] > r2 Call: princomp(formula = ~returns[, 2] + returns[, 1]) Standard deviations: Comp.1 Comp.2 0.025507386 0.006616398 2 variables and 244 observations. > beta2 [1] 0.6550015
2つの株価を交換した場合に、βが逆数の関係になっているかを確認。
> beta1 [1] 1.526714 > 1/beta2 [1] 1.526714
なお、PCAについて学習したい場合は「A tutorial on Principal Components Analysis」を参照。
*1:元PDFのリンクが切れていたので、そこから派生したこのサイトを読むしかなく、このサイトも消える可能性があるのでメモしとかないと。