WEB屋の自分が機械学習株価予想プログラムを開発した結果

2020/02/01 追記
[コード付き]誰も知らない関連銘柄を、機械学習を使って素早く見つける
こちらに最新の結果を載せました!


気づいたんですけど、私みたいな貧乏人はショッピングモールでおしゃれなゴミをせっせと買い漁るんですが、お金持ちの人って株を買うらしいんですよね。
考えてみれば貧乏人が欲しがるものって、百均のちょっとしたものから家や車やバイクやゲーム機など、買ったらお金が減るものばかりなんです。
それに比べて、お金持ちが買うものって、株や投資用の土地や、リスクこそあるものの貧乏人が欲しがらないわりに買ったらお金が増える可能性のあるものばかりなんですよねー。
これは悔しい!休日になるたびにせっせとショッピングモールにお金を運んでゴミを買い漁ってる自分を見てお金持ちはきっと笑っているに違いない!いやお金持ちには自分のような人間は視界にすら入らないのか、これはさっそく株を買わないと!と思って調べてみたんですが、正直よくわからなかったので、もうこうなったらコンピューターにまかせてしまおう!と思ったのがきっかけです。どうせコンピューター無かったら死ぬんだし。

まずは株について調べてみた。

株について、全くといっていいほど無知だったので、このへんの本を参考にしてみました。

わかったことを、すごくざっくりというと、

  • みんな株は儲かると思っているから買うということ
  • 一般的に株で儲けるには大きく分けて二つの方法があるということ
    • ひとつは株の配当で儲ける
    • もうひとつは株の売買をして利鞘で儲ける

個人的には絵や写真がたくさんある解説本は、バカに向けてわかりやすく解説しようとしてて結果的に表面的なことだけ伝えてる感じがしてすごくいいんですが、さっそくこれらの本を参考にして20万円ほど市場に突っ込んでわかったことがあります。
それは、だいたいの株の本とかサイトでは、何の疑いもなく「株の売買をして利鞘で儲ける」方法を勧めているけど、これは「株の売買でしかお金を稼げない人たち」のやり方であるということでした。だいたい普通は収入の口が別にあって、その余剰を株券に変えたいわけだから、ギャンブルでお金を稼いでいる人の言うことなんて聞いたらダメって昔おばあちゃんに教えてもらったんです。
あと、テクニカル分析っていうすごい頭の良さそうな方法があるんですが、どれもやってることが占いと変わらなくて楽しかったです。
移動平均がどうとか、ボリンジャーバンドやゴールデンクロスにどうなったら売りのサインとか、パラメーターを変えたらどうとでもなる線をいい大人が参考にお金のやり取りをする様は最高に面白いです。中にはなんたら斎があみだした雲がどうとか本気であって、その面白さの衝撃に目を疑いました。何の数字と何の数字をかけて2で割ったり9日ずらしたりしたらできるグラフに色を塗ったら雲ができてふしぎ!とか。わざわざ雲を出すために唐突に2や9の数字が出てくるところとかが本当に頭が悪そうで、私そういうの好きです。
なるほど、20万円も出せばそういう楽しみ方があるのか、というのがわかったところで、そろそろ付き合いきれんなと思ったので、配当金が儲かりそうな株を買うことにしようと思います。

どれを買ったらいいかわからん問題

企業情報を調べて、高配当な株を分析することをファンダメンタル分析(Wikipedia)と言うらしいですが、まずはこれをコンピューターにまかせられないかと考えたのがそもそもの開発のきっかけでした。言葉の中に「ダメ」って入っているのが、自分のようなダメ人間にはとても親しみがもてました。
分析に必要な数値はいろいろあるんですが、証券会社の用意している画面では、たくさんある銘柄からいちいち選んで表示して比べるのもひと苦労です。
1社ごとの数値そのものもいろんな要素の絡み合いを見る必要があって、さらにそれを数社にまたがって比較するとなると、これはもうコンピューターに任せる以外の発想は出てこないですね。
結果から言うと、最終的に出来上がったのは「株の売買をして利鞘で儲ける」ほうのシステムなんですけど、とにかく始まりは「株の配当で儲ける」ための仕組みを作ろうとしたのがきっかけでした。

言語はPythonで

なぜRubyやR言語やGoではなくPythonにしたかというと、ちょうどAWSを触り始めていて、lambdaとかでPythonを触りたかったため。結果的にはこれが大当たりでした。理由は後述。
Pythonの技術書は山ほど買ったのですが、なにはともあれ一冊だけ紹介するとするならやはりこれ。

オライリーの入門書。Python触るの全く初めての私も、これで入門してすぐに機械学習で株価予測とかできるんだからすごい。技術書さえ買えば金はうなるほど入ってくるのに、なぜ世の中の人は技術書を買わないのか毎回不思議。
他にもいろいろ買ったけど、いちいちアフィリ貼るのも面倒なのでスクショだけ貼っておきます。しかしながら上記の入門書さえ買えば全て事足りることは確か。
%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-09-2-06-25
あとこのスクショには出てないけど、同じオライリー本でIPythonデーターサイエンスクックブックってのも買ったけど、これも稼働率高めで役に立つ。
言語の選定をPythonにしてよかったと思うことの最たるは、なんといってもJupyter notebookという開発環境の存在が大きいことでした。jupyter notebookこそ大正義。
通な人は「jupyter notebookならPythonに限らなくてもカーネルを変えればR言語とかもいけるやん」と思うかもしれませんが、まあそこらへんは話が長くなるので割愛。
とにかく、jupyter notebookという、「今どき風なくっそ便利になった対話型インタープリター」で開発できるということは、トライ&エラーを繰り返しながらテストと開発を同時に行えるので全ての人にオススメしたい。アフリカに井戸を掘るプロジェクトがあっても参加しないけど、アフリカにJupyter notebookを伝えにいくなら同行したい。

いちばん苦労したのがPythonの環境構築

私のMacはけっこう古い時期からそのまま使っているので、どのくらいまあまあ古いかというと「macportでパッケージを管理していたくらいの古さ」なのです。PythonとかももともとMacに構築されていた上にmacportやらhomebrewやらでよくわからないことになっていて、とにかくまともに動くようになるまでが一番時間がかかりました。当時こんなことをつぶやいています。


うまくいった結果だけを書くと、

  1. とにかくhomebrewでpyenvをインストール。何においてもpyenv。pyenvと百回唱えながらインストールすべし。
  2. pyenv上からanaconda3をインストール。誰に何を言われようともanaconda3。親の悪口を言われても。特にpython2がいいとか絶対耳を貸さない。

近道はないかとか、他の方法はないかとか、探すだけ時間の無駄。なぜならその無駄を全部味わったから。これ以外の道を進むと苦しむことになる、覚えておこう!

データー集めは紳士的に

さて、Pythonの環境構築が済めば、これもう作業のほとんどが完了したといっても過言ではないのですが、実際にはあとデーター集めと機械学習の開発が残っています。
今さら私がいうことでもないのですが、データー集めは紳士になってやりましょう。
株価のデーターをどっかから集めないといけないわけですが、Yahooファイナンスは自動スクレイピングを禁止しています。やるなら手動でするか、有料会員になってデーターのダウンロードサービスをうけるしかないですね。間違ってもAWSでEC2インスタンスを10台くらい立てて取得して再起動を繰り返しながらIPアドレスを変えて一斉にスクレイピングとか行わないように
というわけで、データーの出所は各自用意するしかないわけですが、仮に許可された自動スクレイピングをかけるにしても1秒待ってクロールするなど、スクレイピング紳士たるもの常に相手への心配りをもって臨みたいところですナ。

いよいよ機械学習開始

さて、データーも揃ったことだし、さっそく株価を予想したいと思います。
参考にしたのはこちら。
機械学習で未来を予測する – scikit-learn の決定木で未来の株価を予測 – Qiita
「python 株価 機械学習」という何のひねりもないキーワードでGoogle検索したら上の方に出てきますので、これを読んでる人からすると今さら私が紹介しても既知の情報すぎると思いますが、実際に予想を立てるロジックを作るのに非常に参考になりました。
このロジックをものすごく簡単に言うと、「株価が上昇していれば次の日も上昇するだろう」「サインカーブを描いているならそれに沿うだろう」というような、人間がローソクチャートを見れば一目瞭然なことを、機械が予想できるようにするために学習させるということですね。人間だと1銘柄1銘柄目視しないといけないことを、コンピューターに大量に自動でやらせるといったことが可能になります。
ですので、すごく高度な予測を立てているわけではないです。その逆で、簡単な予測を大量にたてることに特化しています。

ロジックの簡単な説明

すごく乱暴なくらいに簡単にしてますが、どういう予測をしているのかいちおう説明しておきます。
図にするとこうです。
s1

s2

s3

s4
先にも書きましたように、人間がチャートを見れば一目瞭然なことを、わざわざ機械学習でやって大量にさばくことを目的としています。
ポイントは今日買えて今日売れる条件のもとで予測をたてやすかった順に教えてくれるようになるところにあります。

システムトレードって奴には手を出さないようにってばあちゃんが……

違うよ。全然違うよ。

開発の勘所

昔は好奇心から自分でも人工知能の開発とかやっていましたが、今は優れたライブラリがあるので基本的にはそれを使います。開発で行うのは、ライブラリに渡すパラメーターを整理するだけです。なので機械学習部分の開発は、ほとんどデータ操作になります。
機械学習部分よりも気をつけることは、プログラムは大量のデーターから決して未来を知り得ないようにすることです。どういうことかというと、大事なのはシミュレーションで、そのシミュレーション部分では過去のデーターを使って予測が正しかったかを検証していくので、ここであらかじめ知ってる未来の情報にアクセスできてしまうバグを絶対に混入させないこと、です。そのためにはテストファーストがとても大事なのですが、前述したようにJupyter notebookだととても柔軟に開発しながらテストできるしテストしながら開発できるので、この段階からシミュレーション機能を意識して開発を進めていくと、あとあとがすごい捗ります。機械学習そのものよりも、その脇を固めるデータの扱いや整理方法なんかに勘所が集中してあるってことですね。

で、どうなったか

「チャートを見る限り、誰がどうみても今日値上がりする銘柄」を検索して、毎朝Slackに通知してくれるシステムを作りました。
抽出条件は、「本日何円から何円までで買える銘柄」で指定できます。値上がりするのはわかってるけど高すぎて買えない貧乏人使用。
もちろん、先日の出来高を参考に、一定数売れた株から絞るようにしています。価値は上がったけど誰も買ってくれない株券つかまされるなんてゴメンですもんね。

「おめでとう!お前の持ってる株券は1億円の価値があるよ!誰も買わないけど!」

100万円ほどの資金を使って、それらを毎日買って売ってを繰り返した結果、シミュレーションでは30日でこのくらい。
何度やっても一月10%を超えて、成績が良すぎて逆に胡散臭い。※

※2016/11/11追記
ここ言葉の正確性を少し欠いていました。
正確には取引の日数を30日分シミュレートしているので、期間としては1ヶ月を少し超えますよね。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-09-3-28-33
実際にはどうなの?かというと、実は種銭がなくて株が買えません。値上がりしそうな株価を毎朝知ることができるのに、お金がないばかりに指をくわえてみているしかないデストピア。みんな貧乏が悪いんや。
というわけで、種銭が貯まるまでぼちぼち開発を続けながら様子を見たいと思います。興味ありそうな人が多いならいずれ情報公開も多めにしていくつもり。ほかのロジックもいろいろ興味ありますので、どんな予想を立てられるか考えていくのも面白いですよね。
今困っているのは、AWSの無料枠でスクリプトをぶん回しているものだから、処理が遅いことです。高速化やマルチプロセスやマルチスレッドはいろいろ試してみたけど、根本からサーバーを強化しないとこれ以上はなかなか難しい感じ。
処理が遅いことの一番の弊害は、なんといっても大量に処理をぶん回すシミュレーションの段階で時間がかかりすぎるので、実際の処理よりも機械学習の精度をすこし落とさないといけないということです。精度の低いシミュレーションでテストして、実際には精度の高い処理が行えるならいいじゃんと思うかもしれませんが、実際にはそうはうまくいかないのが機械学習の面白いところでもあります。
機械学習には、未学習と過学習のジレンマというものがあって、学習させなさすぎても精度は良くならないし、学習させすぎてもかえって精度が落ちるので、実際の運用と全く同じ条件でシミュレートしないことには、学習の最適化を証明できないのです。もちろん、ロジック上は運用段階でも過学習を避けている処理を入れているのでソースコードに自信はあるのですが、最適にテストできてないソースコードは害悪でしかないので、このへんが開発者の資本力とサーバースペックがものをいう世界なのかなと思います。そして自分はそれが低い。いずれにしても今後が楽しみな分野なので、私の方でも積極的に情報を公開していきたいと思います。

2017/01/25追記

ご指摘いただきましたので貼り忘れを追記しておきます。

「WEB屋の自分が機械学習株価予想プログラムを開発した結果」への1件のフィードバック

コメントは停止中です。