バナナでもわかる話

開設当初は計量経済学・統計学が専門の大学院生でした。今はデータを扱うお仕事をしています。統計学・経済学・投資理論・マーケティング等々に関する勉強・解説ブログ。ときどき趣味も。極力数式は使わずイメージで説明出来るよう心掛けていますが、時々暴走します。

見せかけの回帰

株価予測を行う上で、

見せかけの回帰

という現象があるので紹介しておきます。



ソフトバンクの株価を線形回帰で予測してみる


ソフトバンクのt期目の株価をy_tと置きます。回帰分析を勉強したことのある人ならばこんなことを考えるかもしれません。


ソフトバンクの株価を説明できるような変数 x_tを見つけてきて、
それを使って回帰分析して、次期の株価を x_tを使って予測してやればよいじゃないか。


と思うわけです。

そこで、なんと私、そんな予測に使える x_tを見つけてきたんです。



次の分析を見てください。

まずいつものようにquantmodパッケージを使って実際のソフトバンクの株価の列を取ってきました。

library(quantmod)
getSymbols("9984",src="yahooj",from = "2004-01-01")
data=as.data.frame(YJ9984)
adj_stock_price=data[,6]
y=as.vector(adj_stock_price)


そして、私が取ってきた変数 x_tを使って回帰分析をしてみます。

summary(lm(y~x))

f:id:bananarian:20180905135922p:plain

調整済み決定係数0.772,二つの変数は両方有意でした。


なんだ、これで予測すれば良いじゃないかと思うわけです。


ネタバラシ

ところで、この x_tは一体どうやって見つけたものかというと


実は株価と全く関係のない乱数です。

正確に言うと、株価の平均、2014年1月1日の株価を初期値においた2種類のランダムウォークです。


作り方はこんな感じです。

#hensu1を作る
int=adj_stock_price[1]
random_walk=c(int)
for(i in 1:(length(adj_stock_price)-1)){
	walk=random_walk[i]+rnorm(1)
	random_walk=c(random_walk,walk)
}

#hensu2を作る
int2=mean(adj_stock_price)
random_walk2=c(int2)
for(i in 1:(length(adj_stock_price)-1)){
	walk=random_walk2[i]+rnorm(1,mean(adj_stock_price),1)
	random_walk2=c(random_walk2,walk)
}

hensu1=random_walk
hensu2=random_walk2
x=rbind(hensu1,hensu2)
x=as.matrix(t(x))

ちなみに、プロットしてやるとこんな感じです。

まず、ソフトバンクの株価
f:id:bananarian:20180904192627p:plain

次に一個目の変数
f:id:bananarian:20180905142555p:plain

二個目の変数
f:id:bananarian:20180905142611p:plain




見せかけの回帰

株価の列が全く関係ない乱数の列によって回帰できてしまうという現象を見せかけの回帰と呼びます。
この現象、いくら説明力が高いからと言って、明らかに信用できませんよね。この回帰を回避するためには次のような操作をしてやります。

 y,xの1階差分をとって、その差分系列で回帰分析をしてやります。Rのコードは次の通りです。

adj_y=diff(y)
adj_x1=diff(hensu1)
adj_x2=diff(hensu2)
adj_x=rbind(adj_x1,adj_x2)
adj_x=as.matrix(t(adj_x))
summary(lm(adj_y~adj_x))

回帰の結果
f:id:bananarian:20180905141831p:plain

結果を見るとわかりますが、決定係数が著しく小さい値を取り、変数も有意ではなくなりました。


まとめ

・株価予測を行う際に何らかの説明変数を使う場合には注意が必要

・階差を取って回帰分析を行ってやることで、見せかけの回帰を見抜くことが出来る