2008/06/07

ランダムフォレスト(Random Forest)法を用いて株価予測を行ってみた。-03


photo by Desktopography

第三回。それでは今回行った手法について概要を説明していきます。

概要

まず株価についてのデータが欲しかったので、pythonで株価をネット上からダウンロードして結合するスクリプトを作成。そしてその時系列データを元に前日のデルタ、ヒゲの長さ、出来高などの実測値、Moving Average,MACD,RSI,Bolinger Band,RW%R...などのテクニカル指標を合わせて70個ほど算出し、CSVデータとして保存します。



CSVデータをOpenOffice.orgで開いた状態。


そのデータセットを元にR上で学習させます。予測させる数値は『翌日の終値-翌日の始値』とします。一応Rのソースを下に載せておきます。


> library("randomForest") #RFパッケージの読み込み
randomForest 4.5-25
Type rfNews() to see new features/changes/bug fixes.
> d <- read.csv("dataset/2502_R.csv", header=T) #CSVデータの読み込み
> dim(d) #次元の確認
[1] 1794 83
> d.learn <- d[1:1500,] #データを学習用と
> d.test <- d[1501:1794,] #テスト用に分割する
> d.rf <- randomForest(Result~., data=d.learn, ntree=300) #RFで学習させる。
> d.pred <- predict(d.rf, newdata=d.learn) #予測。試しに学習用のデータを入力してみる
> cor(d.pred, d.learn$Result) #相関係数を測定
[1] 0.9693442 #正しく分類が行われていることが分かる
> d.pred <- predict(d.rf, newdata=d.test) #テスト用のデータを用いて予測
> cor(d.pred, d.test$Result)
[1] 0.0266478 #ほぼ無相関の値を示す

結果


どうやらきちんと学習が行われているようなのに、未来のデータに対して予測を行わせるとほとんど無相関、つまりランダムの数値を返してしまうようです。この後も目的変数を『5日後の終値-翌日の終値』としたり、さまざまな銘柄に対して学習と予測を行ってみましたが、良くても相関係数が.2くらいで、実際に使えそうなデータはありませんでした。これは「過去の時系列データを元にして株価がどれくらい動くか予測することはかなり困難である」ことを表しています。

ウィーク型の効率的市場仮説によれば、時系列データを元に予測を行うことは不可能であると言っているわけですし*1、このような結果が出たのはある意味当然かもしれません。
でも結局『なんだかんだやっても予測はできない』で終わらせるのは正直微妙なので、ちょっとあるデータを加工して再び解析を行ってみたら、今度はけっこうおもしろい結果が出るようになりました。でももうこれ以上書いてしまうと長くなってくるので、続きは次回。


解析しているUbuntu(8.04 Hardy Haron)のスクリーンショット。使いやすくて綺麗。

*1 ただ本当にそうかと言われれば正直微妙なところです。株価は人間の心理によって動くわけですから、当然非合理的な動きをする部分もあると思います(たとえそれがマクロ的には消えてしまうにしても)。

2 件のコメント:

kohei さんのコメント...

なんだかユーザーインターフェースをできるだけMac OS
に近づけようとしたようなスクリーンショットですな。

いいんだよ?Mac OS Xに変えても。いいんだよ?

rezoo さんのコメント...

どうやらNautilusっていう、Mac OS XにあたるFinderの外観が最初はWindows風だったらしいんだけど、途中からOSX風に変更されたらしいっす。

OSXかぁ…欲しいんだけど、20万くらい余裕が出たら買うことにするよ(笑