雑記帳

日常を綴っていきます

ディープラーニングを用いた仮想通貨価格の予測

みなさんこんばんは。

さて、本題に入りますが、昨今の仮想通貨市場は非常にアツいものがありますね。今年に入って、様々な仮想通貨の価値が暴騰してウハウハな人もいるかと思われます。このような状況下にあるため、当然投資家の数も鰻登りなわけでして......その投資家の中には、「全て自動で取引をさせたい」と考えているものぐさな投資家もいるのではないでしょうか。結論から言いますと、そういった人たちは恐らく機械学習を用いて価格変動の予測といった大仰な事はしていません。何故なら、仮想通貨の価格変動はランダムウォークであり、機械学習を用いても価格変動を予測することはかなり難しいからです。本当に価格変動の予測から一攫千金を狙いたいのであればこのような記事の情報など鵜呑みにせず、研究に励んでいただきたいです。

それなのに今回、どうして私がこのような事をやるに至ったかといいますと、単純に機械学習でどの程度価格変動を予測することが出来るかという技術的な面に興味があったからです。決して「なにもしなくてもお金がほしい」なんて野心を抱いていたわけではありません。

それでは、今回は私が組んだ予測プログラムの簡単な解説をしていきたいと思います。

 

なお、本記事の情報を元に取引を行い、いかなる損害を被ったとしても筆者は一切責任を負いません。

アルゴリズムについて

 今回は予測にRNNの一種であるLSTM(Long-Short Term Memory)を用いました。LSTMの詳しい理論に関しては、私よりも頭のいい方ががわかりやすい記事を書いてくださっているので割愛します。

qiita.com

モデル構成としては以下のような感じになります。特に工夫している点はありません。

f:id:shikugawa:20171207101609p:plain

ハイパーパラメータの調整に関しては今回はベイズ最適化を使用しています。ハイパーパラメータの最適化に関してはグリッドサーチやベイズ最適化がよく知られているものかと思われますが(私はこの二つしか知りません)、グリッドサーチは候補として挙げられるパラメーターで総当り的に計算していく為に、あまりにも学習に時間がかかってしまいます。ベイズ最適化は特に、「形がわからない関数」の最適解を求める手法の一つなのですが、機械学習においては候補として挙げられるパラメーターの中から、大域的最適解となりうるパラメーターを獲得関数を用いて検出し、モデルのハイパーパラメータに適用するといった計算時間が短縮できる手法になります。詳しい理論については難しくてわかりません。私は数学が苦手なので、数学に自信がある方は色々調べて私に噛み砕いて解説して頂けるとありがたいです。

今回はLSTMを用いた実装しかしていないのですが、Convolution1Dを用いたCNNによる時系列データの予測法とかQRNNという最新のRNNを用いた手法等も存在しているみたいなのでいつか試してみたいです。今はkerasがあるのでこういうのの実装も楽です。

データの加工

当初はデータはCryptowatch APIを用いて収集していたのですが、短期スパンのデータを収集するに当たってはAPI側の制限に引っかかってしまうためにやめました。

Public Market REST API - Cryptowatch

代わりにこちらを用いました。

Bitcoin Historical Data | Kaggle

これめちゃくちゃすごいです。なんと三年前からのCoincheckのBTC/JPYの一分足時系列データです。私の友人が見つけてきてくれたのですが最初見た時ひっくり返りました。

しかし、このデータセットではあまりにもカラムの要素数が少ないです。今回私は取引時間帯と幾つかのテクニカル指標を追加しました。

取引時間帯

為替においては一般に取引が盛んな時間帯、盛んでない時間帯というものがあります。これは仮想通貨においても例外ではないでしょう。そこで、カラムに定義されているタイムスタンプから時間を算出してhourカラムとして定義しました。

テクニカル指標

テクニカル指標とは、為替において過去のデータから算出された様々な指標のことであり、テクニカル分析に使われます。為替に明るくない人でも移動平均線とか名前だけは聞いたことがあるのではないでしょうか。

今回実装したのはボリンジャーバンド一目均衡表(の中で使われる転換線)です。

ボリンジャーバンドとは?

 (過去25日分の移動平均) + n * (過去25日分の標準偏差) で表されます。nには任意の整数が入るのですが、一般にはn=1, 2が使われます。このボリンジャーバンドを突っ切っていると買われすぎ、売られすぎといった指標を判断することが出来ます。これ自体はpandasのrolling関数で楽に実装出来るのでオススメです。

一目均衡表とは?

非常に広く使われているテクニカル指標の一つであり, 基準線, 転換線, 先行スパン, 遅行スパンで構成されます。比較的長いスパンでの取引に適しているらしいです。今回は基準線しか実装していないのですしていないのですが, 後に全部実装していきたいと思います。はい。

結果

正解率は大体68%です。ダメですね。これを実運用したら間違いなく損しますので当ブログで紹介したコードを用いて取引したい人は自己責任でお願いします。破産しても知りません。

イキリグラフ

f:id:shikugawa:20171209000412p:plain

学習効率最悪です。ディープラーニングやめたい。

計算グラフ

f:id:shikugawa:20171209000448p:plain

その他グラフ

f:id:shikugawa:20171209000613p:plain

ソースコード

ブログ記事用