ストックドッグ

KatoTakahiro。金融系の会社で働くSEが株やPython、その他諸々について書いています。サービスも運営してます→http://fmbrain.work

君、過学習してるね...

目次

前回までのあらすじ

doz13189.hatenablog.com

決定木を使って、明日上がる株価と下がる株価の分類を試みました。

その時、作ったシステムで株価の予測をしたら一回目が53%で、ええやん!ってなったのですが、2回目、3回目と検証を続けると48%、49%と50%を下回る結果に...

っとここまでが前回のあらすじ。

その後、ちゃんと検証をやろうってなったのが今回です。

なんかおかしくない?

検証結果を見て思ったんです。

ちなみにこれが検証結果です。

モデル 正答率
20日モデル 50.69%
40日モデル 49.98%
60日モデル 49.13%
80日モデル 50.26%
100日モデル 50.32%
120日モデル 48.13%
140日モデル 46.76%
160日モデル 52.20%
180日モデル 49.23%

過去何日間を学習させたかによってモデルを分けて、予測をさしています。

例えば、20日モデルは過去20日を学習して、次の日の株価を予測しています。

これで100日分検証を行い、出た正答率の平均値を正答率として出しています。


モデルが出す予測は、上昇だったら1、下落だったら0なんです。

つまり、基本的に適当にやっても50%は当たるはずなんですね。


この正答率を見たらピンっときますね。

「君、適当にやってるな?」

このモデル何も学習できずに適当に上昇!下落!と叫んでいるだけなのではないだろうか。

いや、適当ではない!

バックテストでは結果が出るんです。

正答率70%、80%とポンポンいい数値が出るんです!


これってもしかして。

もしかして。

君、過学習してるね...

決定木のいいところはホワイトボックスです。

中身でどういった処理をしているのか、人間に理解できる形で可視化できるのでやってみました。

f:id:doz13189:20161207215442p:plain

うん、過学習してるね!

木が深すぎて、一体何を学習しているのか!?

この木は、前回の私の記事、あるいは前回の記事に貼ってあるURL先の記事を読めば、どれだけ過学習して頭が固くなっているのか解ると思います。

過学習の見極め方

私は単純にバックテストとフォワードテストの結果に差があり過ぎたら、過学習を疑います。

過学習すると未知データに対して、全く対応ができなくなるので、おのずとフォワードテストでの結果がでなくなるんですね。


今回のようにバックテストでは良い結果がでているのに、フォワードテストではからっきし、というのはまさに過学習を疑うべきシグナルです。

もちろん、ただ単純に説明変数がよくなくてダメモデルを作っていることもありますが。

過学習を解消すれば精度が上がったのか

過学習をしない程度の深さや葉の数を調整して、再検証を行ってみました。

しかし、結果は同じくランダムチックな正答率ばかり。

説明変数がよくない。

これが私が出した結論です。

そもそもインデックスリターンを使って、株価の値動きを予測しようという試み自体が間違っていたのではないだろうか。

もう少し決定木を使って頑張ってみますよ!

続く...