クラウドとディープラーニングと価格予測の話

AlpacaJapanさん主催のMarketTech Meetup #02でLTをさせていただいたので、その時の内容をここにもまとめておきます。

スライドはこちらです。

www.slideshare.net

ディープラーニングで価格予測モデルを作る

「ディープラーニングで金融商品の価格予測モデルを作る」という場合に、

  • いろいろなアーキテクチャ、ハイパーパラメータ、データで学習したい
  • いろいろな学習済みモデル、データ、ハイパーパラメータでバックテストをしたい
  • 複数のモデルを組み合わせて一つのモデルを作る、すなわちアンサンブルをしたい

といったことがしたくなります。

しかし、当たり前ながらディープラーニングの学習にはには時間がかかります。 アーキテクチャ5種類、ハイパーパラメータ5種類、データ5種類だけでも、組み合わせによって125通りのモデルができます。 それぞれに1時間かかっていたら5日間かかります。

バックテストにおいても、組み合わせが増えるとバカにならない時間がかかります。

クラウドを使っていいい感じにディープラーニングしよう!というのが、今回のトピックです。

クラウドでディープラーニングをすると

クラウドの特徴として「独立した処理については、一つずつ動かしても、一気に動かしても、かかるコストは同じ」ということがあげられます。 この特徴は、今考えている問題と非常に相性がいいです。

さきほどの例、つまり1時間かかる処理が125個ある例、では、5日間ではなく、1時間ですべての処理が終わらせることができます。

また、「様々な種類のマシンを利用できる」というのもクラウドの大きな利点です。GPUが載っているのも多数あります。

また、今回のような処理は、ユーザーを待たせているわけではないため「すぐに結果が必要」でないこともあります。

そのため、「需要の低い時間に安い価格でインスタンスを借りて計算する」ということも可能になります。AWSでいうスポットインスタンス、GCPでいうプリエンプティブインスタンスです。このおかげで思ったよりコストがかさまなかったりします。

ちなみに自分たちはAWSのスポットインスタンスを用いることで、p2.xlargeというインスタンスを70%オフくらいで使うことができています。

考えなくてはいけないこと

もちろんいいことだけではなく、考えなくてはならないこともあります。

まず1つ目が「処理実行の管理をしないといけない」ということです。いくつかのインスタンスを立ち上げ、いい感じに分散させて処理を実行する必要があります。また、スポットインスタンスを用いる場合には考えることが増えます。ローカルで実験するのに比べると、とても手間がかかります。

そして2つ目が「実行結果が分散されてしまう」ということです。それぞれの処理の結果は複数のインスタンスに散らばっている状態になるので、それをどうにかして一箇所に集めることが必要になります。やはりローカルで実験するよりは手間がかかります。

その上で、実際どうやっているか

上にあげたようなことを考え「実際にこんな感じでクラウドで価格予測モデルを作っているよ」という話をします。

実際どうやっているか①

まず、学習のためのDockerコンテナを作成します。 実行コマンドのコマンドライン引数によって、アーキテクチャ、データ、ハイパーパラメータを指定できるようにします。

また、学習が終わったら、生成されたモデルをS3などのクラウドストレージに、パラメータなどをデータベースに保存するようにしています。こうしていろいろなマシンで実行された学習の結果が一箇所に集まるようにします。

余談ですが、Nvidia Dockerを用いることでDockerでもGPUを活用できます。

実際どうやっているか②

そしてあとは学習の実行ですが、自分たちはAWS Batchというサービスを用いています。 このサービスは、ジョブのキューを用意してくれます。ジョブというのは、Dockerイメージと実行コマンドの組み合わせです。

自分たちがキューにジョブを追加すると、AWS Batchがうまいことインスタンスを立ち上げ、そのジョブを実行してくれるというわけです。 スポットインスタンスも簡単に利用できるようになっています。

実際どうやっているか③

バックテストも学習と同様です。 Dockeイメージを用意し、コマンドライン引数によってテストしたいモデルや使いたいデータなどを指定するようにします。 そして、実行が終了した際に結果をクラウドストレージやデータベースに保存するようにしています。 また、AWS Batchを用いているのも同様です。

実際どうやっているか④

AWSのコンソールやCLIのみでこれらの操作すべてをやるのは厳しく、また機能的にも足りないところが出てくるので、機能を拡張し、そしてGUIも用意しています。

具体的には、

  • 学習ジョブ・バックテストジョブの追加
  • 実行中ジョブのログの表示
  • 学習済みモデルの詳細を表示
  • 実行済みバックテストの詳細を表示

といった機能をもたせています。

これのおかげで、スマホからでも学習・バックテストを回したり、それらの結果を確認できたりもします。

おわりに

クラウドを使うとディープラーニングが快適にできます。そして、クラウドプロバイダはディープラーニングに役立つサービスをたくさん提供しているので利用すべきです。

おまけ

本当に相場を学習して勝てているのかの見定めは難しいです。「4回の大きい価格変動を当てる」モデルは16個に一個くらいはできてしまいます。

また、探索空間が膨大に増えますが、複数モデルのアンサンブルもしています。