株も歩けば犬に当たる

ブラックSlerで働くSEが株やPythonや思ったことについて書いています。

機械学習で株価は予測できるのか!?

目次

流行ってるなぁ、機械学習で株価予測

みんな予測し過ぎじゃないですか?笑

おかげで参考文献には困りませんでしたよ!

qiita.com

masamunet.com

ちょっと前までこういう↑記事を見ると、「へぇすごい、ホンマにすごいなぁ」と指を加えて羨むしかなかったんですけど...

最近は、「何!?予測!?できるんか!?っしゃ、たしかめるかぁ!」

くらいの勢いでできるので、成長を感じます。笑


上の記事たちではあたかも正答率100%を誇るスーパーシステムが出来上がったような雰囲気を出していますが、残念というか安心してくださいというかそんなわけはありません。

どちらも決定木というアルゴリズムで予測しているので、そもそもそこまで精度が上がるわけないと私は考えています。(理由は後述)

ということで今回は出来上がったシステムの内容、精度、検証含めた記事を書きます。(ちなみにただ今検証中...記事の終盤にかかる頃には検証が終わって欲しいことを祈りつつ書き書き...)

〜更新【最新版】〜

機械学習での株価予測についての記事をまとめました【おすすめ記事】

doz13189.hatenablog.com



予測の精度は53%でした

ということでした。

また後で詳しくっ☆

どんな予測の仕方?

決定木で株価を予測する大まかな流れは、

  1. 教師データで学習させる(過去の株価データ)
  2. 未知データ(過去データ以降の株価データ)をあげて、予測結果を見る

これだけです。


さっきから予測、予測と繰り返していますが、やっていることは予測というより、分類と言ったほうが正確です。

機械学習の決定木は分類手法です。

決定木の分類をイメージで説明すると...

f:id:doz13189:20161130185741p:plain

こーんな感じで株価は無数に転がっています。

一つ一つが各銘柄の株価です。

これを。

f:id:doz13189:20161130185823p:plain

バスッと線を引いて、右と左に分類します。

これが決定木の分類イメージです。


決定木の難しいのは、何を判断材料とするかです。

例えば、RSIを判断材料とした場合だと...

RSIだと70以上は反落の可能性が高かったり、逆に30以下だと反発の可能性が高かったりと逆張りでよく使われる指標で有名なのでとりあえずチョイスしました。

f:id:doz13189:20161130192441p:plain

こんな感じのRSIでソートした株価の集団があるとします。(乱数でふってるので値は適当です)

この株価たちが次の日上昇したか、下落したかを見てみましょう。

f:id:doz13189:20161130193658p:plain

こうなったとします。赤が上昇、青が下落。

これらを教師データとして決定木に学習させます。

データを渡すときは、次の日上昇したかどうかと、RSIをセットで渡します。

すると、機械はデータを見ながらこんなことを考えるでしょう。

「おぉ、上昇する株価と下落する株価は傾向がありそうだなぁ、そういえばRSIが低いと上昇して、高いと下落して...ふむふむ。」

「どうやらRSI50付近にバスっと線を引いて、分類したらうまくいきそうだな。」

うまく学習してくれたみたいですね。

ここから未知データをあげます。

先ほど学習したことを未知データに活かすのです!

例えば、RSI80の株価データを上げたとすると、機械は「下落!」と答えるはずです。

RSI30の株価データを上げたとすると、機械は「上昇!」と答えるはずです。

こーんな感じで株価を分類し、予測していきます。

ちなみに今回判断基準として使ったのはインデックスリターンです。

インデックスリターンを使って、株価たちをバスっと上昇する株と下落する株に分類しています。

参考にした記事と同じものを使用しているので、もし興味があればそちらもお読みになってください!

決定木の弱点

すべてのものを完璧に分類できる手法なんて世界にはまだ存在していません。

すべての手法は何らかの弱点があり、同じくして決定木にも弱点があります。

決定木の弱点は...


女性に弱いところです。



んなわけ。



弱点は分類の精度です。

弱点とも言いがたいのですが、決定木はそこまで高い精度を誇る分類手法ではないです。

もちろん、分類する対象にもよりますが、うまく分類できないこともままあります。

一般的な分析精度だけ見れば、SVMなど決定木より優れたものはたくさんあります。

弱点として把握しておかなければならないのは、うまく分類できない可能性があるということです。

f:id:doz13189:20161130192925p:plain

例えば、このパターンはうまく分類できていません。

こんなバラバラデータに線を引いたところでですね。

実際にRSIを判断基準にしても、きっとこうなります。

RSI30以下で絞っても、ダマしが多くて、うまく分類はできないと思います。


また、これも気をつけないといけません。

f:id:doz13189:20161130185823p:plain

境界線付近のデータです。

決定木は分類なので、YES or NOにわけなければいけません。

「わからない!」っていう答え方はなし、なんですね。

境界線付近は曖昧だけど、分類しないといけないからしてやった系データが集まってるんですね。

こういうデータも含まれているので、上昇する株側に分類されたからと言って、すべてのデータに対して、「これ明日上がるで〜ドヤァ。」なんてことはできないんですね。

今回は、株価というただでさえ分類が難しいものを対象にしているので、気をつけなければいけません。


でもさっきから、気をつけろ、気をつけろって言ったって、いったいどう気をつければいいんだい!?

私なりの弱点の気をつけ方

今から説明することはマサムネットさんの記事を参考にしながら、自分なりに工夫し、分類の弱点を補いました。

株価は基本的には分類しにくいものですが、中には比較的分類しやすいものもあります。

例えば、25日移動平均線、60日移動平均線、100日移動平均線が上で待ち構えている株価があるとします。

明らかに一度、そこで上昇がストップしますよね?

他にも下落トレンドが始まり、しばらく続きそうなタイミングなどなど。

こんな風に比較的予測しやすいもののみに絞って、分類の結果を見ます。

f:id:doz13189:20161130185823p:plain

この図で言うと、境界線付近の結果は全く見ないということです。

機械が自信を持って、「この銘柄は明日上昇する」と言える結果のみを受け取ります。

具体的に言うと、教師データは様々なパターンで渡します。

過去20日の株価データで学習にしたモデル、過去60日で学習したモデルなどなど。

過去20日から200日、それぞれで学習したモデルを作り、モデルごとに株価を予測させます。

そこで正答率の良かったモデルのみを選んで、そのモデルで未知データを読み込み、予測します。

この正答率の良かったモデル、というのが味噌で、こうすることで境界線付近の曖昧なデータたちは省くことができます。

これがひとつ目。


ふたつ目は民主主義制をとっているところです。

システムに民主主義!?ナンセンスだ!っと思われる人もいるかもしれませんが...

先ほど正答率の良かったモデル、つまりエリートモデルで未知データを読み込み、予測させることを説明しました。

じゃあ、そのエリートモデルは完璧なのか?と聞かれるとそうではありません。

たまたま精度が高かったという偶然の可能性も十分にあります。

なので、精度の良かった複数のエリートモデルを選び、その複数のエリートモデルたちでひとつの銘柄を予測させ、多数決をとります。

  1. 過去20日を参考にしたエリートモデル UP
  2. 過去40日を参考にしたエリートモデル DOWN
  3. 過去60日を参考にしたエリートモデル UP
  4. 過去100日を参考にしたエリートモデル UP

この場合は明日の株価は上昇ということになります。

極めて民主主義的に決めているのです。

まとめると、エリート選抜かつ民主主義制なシステムと言えるでしょう。

まるで日銀政策決定会合のような感じですね笑

あとで話すと言った予測結果

11月22日までの過去株価データで23日の株価を予測しました。


対象銘柄

8306, 8411, 8591, 7012, 8058, 7201, 8604, 6301, 6501, 7267, 4528, 4755, 9437, 8750, 6502, 7011, 4043, 4503, 5411, 7751, 2685, 6752, 4689, 7261, 6770, 8801, 8031, 8802, 5401, 3092, 9501, 7013, 1605, 7897, 6503, 3402, 8113, 6702, 6326, 8001, 8304, 1928, 2503, 9531, 8308, 7752, 1801, 2579, 8601, 7272, 4005, 5938, 8830, 1925, 3064, 5802, 4041, 8795, 4188, 5020, 6857, 8725, 4346, 4912, 5233, 8729, 8267, 4911, 6619, 4183, 8053, 7731, 6952, 6361, 6479, 7202, 9202, 8358, 5406, 3099, 9962, 3407, 9502, 4506, 8697, 8630, 3659, 3778, 1812, 4042, 1802, 8002, 2802, 3401, 6644, 3405, 6305, 5201, 1963, 9101, 6724, 2871, 7167, 7182, 1803, 3086, 6701, 4185, 9062, 4536, 4508, 6178, 2371, 3103, 6432, 6471, 5105, 9507, 6481, 6460, 8354, 9104, 2212, 5714, 6448, 5801, 7211, 9508, 9697, 5334, 8303, 6506, 1808, 8331, 5706, 8252, 8015, 6302, 6756, 9513, 3668, 2282, 6268, 8586, 5110, 4217, 8570, 3116, 5711, 9064, 5333, 4088, 9008, 8233, 6473, 6976, 5803, 5486, 4202, 3289, 1332, 5101, 6472, 8515, 9005, 7186, 6841, 9404, 6113, 2580, 7205, 4204, 3626, 6366, 7282, 8334, 9024, 9006, 7912, 5214, 3632, 9506, 4208, 7240, 2002, 2264, 2181, 8473, 8848, 4845, 4902, 5012, 7606, 6740, 7003, 6504, 3861, 6995, 7550, 2193, 9831, 6103, 4182, 6755, 5707, 7732, 9107, 2811, 6141, 3193, 1893, 4321, 7911, 4151, 6383, 4613, 4974, 4568, 3436, 9532, 8410, 8086, 8369, 9045, 5713, 9041, 9201, 9503, 8572, 8355


予測はこんな形で出力されます。

code predict real
8306 Down Down
8411 - Down
8591 Up Up
8058 Down Up

predict = 機械が出した予測です。
real = 23日に実際に上昇したかどうかです。realってもう少し関数名考えろよってあとから見てちょっと思います。
リアルって聞くと出川の顔がチラチラ脳裏を横切ったりしますが、そもそも関数名をつけるセンスのなさには定評があるので勘弁してください。

「-」この小さいマイナスになっているところは、エリートモデルたちの意見が同数で決めきれなかった場合です。

このUpとUp、あるいはDownとDownが一致すれば予測が当たったということになります。

これらをすべて集計した結果、正答率は53.99%でした。

しかし、50%を超えたのはここだけ...

22日、21日、17日と検証を重ねていくと、47.86%、44.9%、49.75%と50を割ってしまう結果に...

今のところ、検証は4日間だけしか行っていません。(マシンパワーが足りまてん)

予測結果がブレることは当たり前なので、もっと検証を重ねて分散、平均などをだしていきたいのはやまやまなんですが...

なんせ一つの検証に結構時間がかかるので、スパコン欲しいです。

もし、平均50%を割ることになれば、この機械に従順に従い売買を重ねると順調に損していくことになります。

じゃあ、これは失敗なのか?機械との付き合い方を考える

私はそうは思っていません。

もし、仮にこの機械の平均正答率が50%だとしましょう。

結果の出力はかなりの銘柄数出してくれるので、人間がその出力された銘柄に絞って実際に売買する銘柄を選ぶとします。

そうすれば、自動的に正答率50%は確保されることになります。


人間は良くも悪くもパフォーマンスの分散は大きいです。

調子のいい日、悪い日があります。

そんな調子の悪い日でも50%が確保されることになります。


これは機械と力を合わせて、銘柄を選択しよう、ということです。

機械はまだまだ頼りきれるほどの信頼性はありません。

とくに今回は...(50%きっちゃってそうですしね)

だから協力するのです。


将棋で一番強いのは、機械でも人間でもありません。

人間と機械が一緒に戦うフリースタイルです。


機械の考え方、人間の考え方、両方取り込むということで相乗効果を生むと私は考えます。

といいつつも今後工夫する点

今回はリターンインデックスのみで判断しました。


シンプルすぎて、そこまで正答率も上がらなかったのだと思います。

他にもいろいろと指標はあるので、追加することで精度が上がるかトライアンドエラーをしていきます。

〜更新1〜

ちゃんと検証をしてみました。

doz13189.hatenablog.com

〜更新2〜

っぽいのができた

doz13189.hatenablog.com

〜更新3〜

株価予測のサービスをリリースしました。

doz13189.hatenablog.com

〜更新4〜

機械学習での株価予測についての記事をまとめました【おすすめ記事】

doz13189.hatenablog.com