ニートの言葉

元ニートがやってみたこと・その過程で学んだこと・考えたこと・技術メモあたりを主に書いています。情報革命が起きた後に訪れるであろう「一億総ニート時代」の生き方を考え中です。

【プログラミング不要】ディープラーニング(h2o.ai)で株価予測をやってみた

2017/07/20 追記

本記事の内容に関してTwitter・メールで問い合わせをいただきますが、全員に対して返信を差し上げることが出来ないため、VALU保有者優先で相談を受けます。

valu.is


対象読者

  • 自前のデータでディープラーニングを体験したい人
  • tensorflowなどのチュートリアルまでやったが、その次の道が見えない人
  • 株価の予測に興味がある人

はじめに

こんにちは。あんどう(@t_andou)です。

最近、人工知能の技術の一種「ディープラーニング」に注目しています

ディープラーニングとは、簡単に言うと「これまでは人間が教えていた『特徴』を機械が勝手に見つけてくれる」ものらしいです。

最初は画像処理系のプログラムで遊んでみました。

ディープラーニングという言葉はよく耳にするようになってきましたが、何ができるかわからなかったので、まずは体験するためにまずはディープラーニングを使った画像関係のプログラムで遊んでみました。

その時の記事はこちら

画像系のプログラムは結果がわかりやすく、ディープラーニングの体験としてはとても楽しめました。

しかし、公開されているソースコードを動かして、そこに画像を投げ込んで結果を待つだけでは、「ディープラーニングをやってみた」と胸を張って言えません。

一通りの流れを自分でやってみたい

そこで、今回はデータの調達から学習の実行まで、ある程度全ての過程を自分自身でやりたいと思います。

題材についてですが、大量のデータが必要なこと・結果が明確にわかることを考えると、広くデータが公開されている株が向いてそうです。

と言うことで、今回は株価の予測をやってみました

ざっくりとした作業の流れ

かなりざっくりとした作業の流れは次の通り。

  1. データの選択・取得・整形
  2. ツールの準備
  3. 学習実行→結果

この記事の流れ

この記事は下記の目次のような流れになっています。ちょっと長いですが、できる限り細かく記載していますので、ディープラーニングを体験してみたい方はぜひ読んでみてください。

実施する上での問題点

さて、ディープラーニングを使って株価の予測をやってみようと考えたのですが色々な問題点がありました。

1.ディープラーニングをよく把握できていない

根本的な問題ですね。まだまだ勉強中で、概要を知ってるレベルです。

2.プログラミングが難しい

tensorflowなどのライブラリは手書きの数字の認識(MNIST)のサンプルを動かすまでは簡単です。

ですが、いざ自前のデータを解析しようとすると壁があるように感じます。

3.ハイパーパラメータの設定方法がわからない

この記事の方法を最後まで進めて貰えばわかると思いますが、ノード数・隠れ層の数・活性化関数・損失関数の選び方・L1・L2の値・ドロップアウト率などなど…とんでもない量のハイパーパラメータ(=設定する項目)があります

この辺りの調整にはコツがあるという話を聞いたことがありますが、よくわかりません。

4.どんなデータを準備すればいいのかが謎

そもそもデータマイニングをしたことがないので、目的に対してどんなデータを揃えるべきなのか見当もつかない。目的の設定に関しても同様。

解決案

1.ディープラーニングをよく把握できていない

ディープラーニングの概念については、勉強を継続中です。

まずは概要を知るためにこの本が役立ちました。

人工知能の歴史を説明した後でディープラーニングの概要・第1次・第2次人工知能ブームとの違いなどを説明されています。

人工知能って何?ディープラーニングって何?という時にはオススメです。

人工知能は人間を超えるか ディープラーニングの先にあるもの (角川EPUB選書)

人工知能は人間を超えるか ディープラーニングの先にあるもの (角川EPUB選書)

 

次に、この順で教科書を購入しました。

まずは機械学習といえばこれ と言われているパターン認識と機械学習(PRML)

パターン認識と機械学習 上

パターン認識と機械学習 上

  • 作者: C.M.ビショップ,元田浩,栗田多喜夫,樋口知之,松本裕治,村田昇
  • 出版社/メーカー: 丸善出版
  • 発売日: 2012/04/05
  • メディア: 単行本(ソフトカバー)
  • 購入: 6人 クリック: 33回
  • この商品を含むブログ (18件) を見る
 

初心者の僕には値段もレベルも高過ぎました…下巻もありますが、これが読めるようになるまでは買いません。

次にこれ

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

 

知人の「読みやすかったよ!」という意見に騙されてKindle版を購入しました。
Chapter1のはじめには読みやすいです。Chapter2から数式が大量に出てきます。挫折しました。(そしてKindle版はすごく読みづらい)

その次がこれ

深層学習 Deep Learning (監修:人工知能学会)

深層学習 Deep Learning (監修:人工知能学会)

  • 作者: 麻生英樹,安田宗樹,前田新一,岡野原大輔,岡谷貴之,久保陽太郎,ボレガラダヌシカ,人工知能学会,神嶌敏弘
  • 出版社/メーカー: 近代科学社
  • 発売日: 2015/11/05
  • メディア: 単行本
  • この商品を含むブログ (1件) を見る
 

別の知人が「上の水色の本よりこちらの方が読みやすかった」と仰っていたのでKindle版を購入。
一緒に購入した別のかたも「この本すごく読みやすいですね!」と仰ってましたが、僕にとっては難しくて自分の頭の悪さに絶望しつつ挫折しました。(Kindle版はすごく読みづらい)

そして最終的に落ち着いたのが次の本

ITエンジニアのための機械学習理論入門

ITエンジニアのための機械学習理論入門

 

福岡で機械学習の勉強会の講師をやられていた人がおすすめされていたので購入。
この本にも数式は出てくるものの数学の部分は「数学徒の小部屋」というコラム(?)に分かれているので、まずはいろんな種類のアルゴリズムの概要を把握するのに向いています。

残念な点を挙げるとすれば、この本は「機械学習の本」であり、「ディープラーニングの本」ではないことでしょうか。(それは最初の黄色本も同じですが)
ですが、ディープラーニングの概要は最初に挙げた本で学べますので、その次に下から順に見ていくと良いのかなぁと思います。

こんな感じで書籍を購入しつつ勉強していたのですが、一人では学習の効率も悪く・モチベーションが保てないので、福岡で勉強会を主催し始めました。

機械学習勉強会@福岡 - connpass

2.プログラミングが難しい

今回はh2o.aiというツールを使うことで解決しました。

正確には「解決」というより、逃げ道を確保した感じですね。現状はFFNN*1のみなので、時系列を考慮したニューラルネットワークのRNNなどを使いたい場合はtensorflowの学習が現時点では無難だとは思います。

ですが、今回は一通り経験してみることが目的ですので、H2Oを使います。

3.ハイパーパラメータの設定方法がわからない

色々試しつつやってみていますが、まだわかっていません。まずは各パラメータが何を意味するのかを勉強しています。

先ほど紹介した本(ITエンジニアのための機械学習理論入門)の著者の方のツイートなどは参考になります。

4.どんなデータを準備すればいいのかが謎

ここに関してもまだ解決策は見つかっていません。地道に頑張っています。一緒に頑張ってくれる仲間・もしくは師匠がいましたらぜひお声をかけてください。

やってみた その1

さて、それではここから実際にやってみた流れを書いていきます。

まずは日経平均のデータだけでやってみました。

データの準備

1.データのダウンロード

データが無いと何も始まりませんので、データを準備します。

今回はこちらのURLから日経平均のデータをダウンロードしました。
株価データ倉庫の無料データダウンロードページ

2.データ整形の考え方

上でダウンロードしたCSVファイルを見ていただければわかると思いますが、各行には「日付、始値、高値、安値、終値、出来高、調整後終値」が入ってます。

しかし、ディープラーニングでデータを入れる際にはそれぞれの行が独立したデータ扱いをされます。(⬅︎ここの考えは間違ってるかもしれません。)

つまり、前日との関連性を示すデータを持っていません。そこで、新規に前日との比較をする列を追加します。*2

ちなみに、前日だけでなく過去1週間分、2週間分と追加した方が精度が上がるかもしれませんが、手間がかかるので今回は前日との比較のみにしました。

3.データ整形の具体的な方法

追加する列には前日との比較のために下記の式を追加します。
=IF(E3<E2,"high",if(E3>E2,"low","same"))

どういう式かというと

  • 翌日が上がる場合はhighを
  • 翌日が下がる場合はlowを
  • 変化が無い場合はsameを

こんな感じですね。(今回は「ツールの使い方を把握しつつ、ディープラーニングを一通りやってみること」が目的ですので、株取引に使えるかどうかは重視しません。)

4.整形されたデータ

最終的に出来上がったCSVとしてはこんな感じです。*3

これでデータの準備ができましたので、このCSVファイルを使ってディープラーニングをやっていきましょう。

実践

さて、ここからは実際にツールを使っていきます。

1.H2Oのインストール

ダウンロード・インストール方法はこちらのURLをご覧ください。

H2Oを使った未来予測 その準備と具体的使い方について | clew

2.先ほど作成したcsvファイルをh2oと同じフォルダに追加

同じフォルダに追加する必要はありませんが、後々見つけやすいように同じフォルダに設置します。

3.H2Oの起動

公式にはこのように起動するためのコマンドが書かれています。

cd ~/Downloads
unzip h2o-3.8.0.2.zip
cd h2o-3.8.0.2
java -jar h2o.jar

このコマンドの意味がわかる人はこれで起動しましょう。

もし、意味がわからない場合は、先ほどのフォルダからh2o.jarをダブルクリックして起動します。

4.H2Oの画面を開く

http://localhost:54321 にアクセスして、このような画面が表示されれば起動成功です。

3.csvファイルをインポート

起動時に流れが記載されていますので、ここからはそれに沿って実行します。ここは基本的にボタンを押すだけです。

  1. まずは上の画面でimportFilesを選択
  2. 先ほど配置したCSVファイルを選択し
  3. Importボタンを押します

すると、これらのファイルをパース(ファイルの中身を解析しやすいデータ形式に変換すること)するというボタンがありますので、押します。

ここまででデータのインポートが完了しました。

4.ファイルを分割

インポートしたデータを学習用のデータとテスト用のデータに分けます。

なぜ分けるのかというと、ディープラーニングでは過学習*4に陥ることがよくあるそうですので、その状態になっていないかを判断するために、学習用・テスト用の二種類を用意する必要があります。

4-1 : splitボタンを押して

4-2:Createを押す

4-3 : 分割されました。

学習にはframe_0.75を使います。

5.学習モデルの準備

先ほどのframe_0.75をクリックすると下記の画面になります。ここからがディープラーニングです。

Build Modelを選択します。

 

学習するアルゴリズムの選択肢が出てきますので、Deep Learningを選択します。

・traning_frame(=学習データ)にframe_0.750を
・validation_frame(=テストデータ)にframe_0.250を
・responce_column(=予想したい列)にHighLowを

6.ハイパーパラメータの設定

今回は下記のように設定しました。ここの設定方法で結果が変わってきますので、少しずつ調整するというかなり泥臭い作業になります。

  • 活性化関数 : RectifierWithDropout
  • 隠れ層 : 50,25
  • epoch(=学習回数?) : 1000
  • input_dropout_raito : 0.1
  • l1 : 0.001
  • l2 : 0.001

結果

上が学習データにおける結果・下がテストデータにおける結果

全てHighと予測されました

正解率は

  • 学習用データで約52%
  • テスト用データで約50%

となりました。

三択の中で一番数が多かったものを答えたようですね

データの問題なのか、パラメータの問題なのかはわかりませんが、求めている結果とは程遠いです。予測としては大失敗だったものの、ツールの使い方は何となくわかりました。

やってみた その2

Qiitaに似た記事がありましたので参考にしてみた

この記事を見ると、
日経平均のデータだけでなくいろんな国の指標を入れたら上手くいった(かも)
という感じでしたので、真似してみます。

データの準備

株価データ倉庫の無料データダウンロードページ

今回もこちらからデータをダウンロードします。
ダウンロードしたのは「日経平均、香港、Dow、FTSE 100」の四つ 

発生した問題と解決策

一番大きな問題として、日本と海外では市場が開いている日が違うという問題がありました。(国ごとの祝日の関係)

今回は土日も関係なく日付一覧を用意して、vlookup関数を使い揃えることで解決しました。(時差を考慮すると全部の国で同じ日付で比較していいのかという疑問は残っています。)

また、マクロを使い事前に前日との比較をする列を各シートに追加しました。(タイトルにプログラミング不要と書いてますが、マクロは使っちゃいました…(๑´ڡ`๑)テヘペロ )

出来上がったデータ

完成したデータはこんな感じです。

kabu.csv - Google ドライブ

やってみた

ツールの使い方は前半で詳しく述べていますので、結果だけ書きます。 

結果

上が学習用データ・下がテスト用データの結果

海外の指標を追加したことで、日本では取引が無い日(#N/A:空の行)が出来ました。

そこを無視して、HighとLowの部分の正解率を見ると

学習用データの正解率
  • 上がると予想した時:76.6%
  • 下がると予想した時:63.5%
テスト用データの正解率
  • 上がると予想した時:77%
  • 下がると予想した時:55%

正解した数から計算すると
テスト用データでも約67%くらいの正解率
となりました。

前半の正解率が50%くらいだったことを考慮すると上がったと言えそうです。

感想

データの準備からそれらしい結果を得るまで、一通りやってみることができました。

データを放り込むだけで予測してくれるなんてすごいです。

ディープラーニングについて

これから1〜2年、ディープラーニングの言葉が広まると共に
「ディープラーニングは大量のデータを入れるだけで勝手に学習してくれるからすごい楽に問題解決!」
「こんなデータ(=ぼんやりしてる)を集めてディープラーニングを使えばできるよ!」
と世の中のビジネスマンは言うと思います。

でも…データの準備とパラメータの調整がちょー大変!

「世の中の期待感と現実とのギャップが半端ない」というのがディープラーニングに対しての率直な感想です。(有用な技術であることには間違いないですが)

ディープラーニングの性能について

今回はディープラーニングを使いましたが、同じデータで別のアルゴリズムを使った場合の精度がわからないので比較をすることが出来ません。

ですので「やっぱりディープラーニングすごいよね!」とは言えません。

株の予測の場合はこのアルゴリズムが向いてる というものもあるかもしれませんね。

株取引に使えるか?

今のままでは株取引には使えません

なぜかというと…

・前日の終値で購入できるとは限らないので、前日と当日の終値の比較は意味が無い*5

・上がる・下がるの予想だけでは使えない。手数料を考慮した上での損得を予想すれば少しはマシになるかもしれません。

他にも色々と問題点はありますが、今の状態では厳しいです。

今後について

今回はデータの入手しやすさから日経平均だけの予測をやりました。

今のままでは使えないと書きましたが、ディープラーニングを使えそうですので、これから実用に向けてデータ集めを始めます。

最終的には自動で取引をさせたいですが、その前に予測だけを表示する「株価予報」みたいなサイトを作りたいですね。

引き続き発信していきますので、読者登録twitterのフォローなどなどよろしくお願いします。

 

追記

FXでもやってみました 

blog.takuya-andou.com

 

*1:時系列を考慮していないニューラルネットワーク

*2:本来であれば時系列を扱えるRNNを使うべきですが、今回使うH2OがFFNNしか対応していないようなので、このような対応にしました。 

*3:H1が空なのは翌日のデータがまだ無いからです。一行まるっと削除しても良いかもしれません。

*4:「学習用のデータにだけ対応して新規のデータには対応できない」という状態

*5:前日の終値を下回った場合に買って(または上回った場合に売って)、当日の終わりに売れ(買い戻せ)ばいいので使えないことはないかもしれませんが