post Image
TensorFlow (ディープラーニング)で為替(FX)の予測をしてみる

機械学習で何ができるの?深層学習(ディープラーニング)だと何が違うの? というのは他の方に任せるとして、やっぱりMNIST以外のデータで色々試してみたいですよね。
というわけで為替(FX)の予測でもやってみます

関連シリーズ
– 第1回 TensorFlow (ディープラーニング)で為替(FX)の予測をしてみる
第2回 ディープじゃない機械学習で為替(FX)の予測をしてみる
第3回 TensorFlow (ディープラーニング)で為替(FX)の予測をしてみる CNN編

他の方の研究、記事など

調べてみると色んな方がやっています。この辺とか、Qiitaだと以下が有名なようです。

学習に用いるデータを大きく分けると以下で、特徴量ラベルはそれぞれ組み合わせが入れ替わるのもあります。

特徴量 ラベル
過去の値動き(終値) 次の終値
テクニカルインジケータ 取引有無

今回は以下の論文を参考に、過去の値動きの変動量を学習させてみます。
終値の変動値を特徴量として、次に上がるか or 下がるかを予測する2クラス問題です。
Artificial neural networks approach to the forecast of stock market price movements
(精度が平均8割もあるけど…ホントかなぁ)

ヒストリカルデータの取得

フリーでデータをダウンロードできるところはたくさんありますが、細かい時間単位(5分足とか1分足)になると数が限られます。有名どころだと

この辺りでしょうか。ただ注意しなければならないのは、どこでダウンロードしても同じデータであるとは限らない点です。

な… 何を言っているのか わからねーと思うが、俺も何をされたのかわからなかった……… 恐ろしいものの片鱗を 味わったぜ………

つまり大人の事情でちょっと値が違うんですけど、それは今回無視しますw
また、データ欠損もそこそこあります。

動作環境の構築

今回必要なのはPythonTensorFlowPandasnumpy位です。pipで大体インストール可能ですが、めんどくさければGoogle Cloud PlatformDatalabを使えばプリインストールされている環境が利用できます。
Cloud Datalab
Compute Engine上で動いているので、ちょっと重めの計算したいなぁという時はCPU数を32に増やしたり、ただデータを眺めるだけの時はリソースを制限したりと、柔軟に調整できます。

またDataflowにもTensorFlowは入っているので、学習の時だけクラウドで実行することもできます。
詳しいやり方は以下の記事を参照してください。
http://qiita.com/hayatoy/items/2eb2bc9223dd6f5c91e0

トレーニングデータの作成

ヒストリカルデータからトレーニング用にデータを作成します。
今回はEUR/USDの2011年から2015年までの1時間足を使います。

Pandas Dataframeに読み込む

データの提供先によってフォーマットは異なりますが、Open, High, Low, Close, Volumeと日付データが揃っているのが一般的です。
今回は以下のようにCSVから読み込みをしています。

dateparse = lambda x: pd.datetime.strptime(x, '%d.%m.%Y %H:%M:%S.000')
df = pd.read_csv(filename, index_col = 0, parse_dates=True, date_parser=dateparse)

試しにdf.tail()してみるとこんな感じ

High Close Volume Open Low
Gmt time
2015-12-31 17:00:00 1.08673 1.08655 6267.45 1.08582 1.08530
2015-12-31 18:00:00 1.08803 1.08693 5447.33 1.08654 1.08611
2015-12-31 19:00:00 1.08743 1.08574 2827.16 1.08693 1.08567
2015-12-31 20:00:00 1.08768 1.08660 5481.39 1.08577 1.08572
2015-12-31 21:00:00 1.08692 1.08564 2532.77 1.08660 1.08529

終値をプロットしてみる

df['Close'].plot(figsize=(10,5), linewidth=0.5)

Close Price
この区間の長期レンジは下降(ドル高ユーロ安)ですね。

終値の差分を求める

Pandasを使うと簡単です。

# 一つ前の終値と現在の終値の差分
df['Close_Diff'] = df['Close'] - df['Close'].shift(1)

正規化する

分散はどうするの?とか色々ツッコミはあるかと思いますが、学習させる上ではどれが正解とも言い難いのでとりあえず最大最小値の差を1.0に合わせるだけにします。
(今気がついたけど中央値を平均にしちゃうと差分の意味が変わっちゃうな…まぁいいか)

df = pd.DataFrame((df['Close_Diff']-df['Close_Diff'].mean()) / (df['Close_Diff'].max() - df['Close_Diff'].min()), columns=['Close_Diff'])

プロットして確認してみます。

close_diff.png

これを26期間にスライス、1期間毎にストライドさせています。

RNN (LSTM)で学習

LSTMの実装はこれほぼそのままで、入力の部分だけshapeを今回のデータに合わせました。するとこんな感じにBi-Directionalなモデルが出来上がります。
rnn.png
Bi-Directionalにすると過去から未来への時系列と未来から過去への時系列を追って学習してくれるのですが、これが今回のデータに合っているかどうかは再考が必要です。

設定はこんな感じ。

learning_rate = 0.0001
training_iters = 500000
batch_size = 128

ちなみにトレーニングデータの多い方のクラス割合は0.502118なので、これを超えないとランダムに選択するより精度悪いじゃん!ってなります。
では学習の結果は・・・

0.528883

う〜ん・・・2%ちょっとランダムよりマシですね。
試しにステップ数を上げてぶん回してもほとんど変わりませんでした。
追記
スライスする期間を104に上げ、ステップ数を80万位にしてみました。
8コア(CPU only)で15時間ほど。

35.187.203.56-6006-(iPad).png
…oh… オーバーフィッティングしちゃった。

次回以降

CNNを使ったり、別の通貨ペアでも試してみようかなと思います。

追記 →やってみました。
TensorFlow (ディープラーニング)で為替(FX)の予測をしてみる CNN編

DISCLAIMER
この記事は個人的な趣味による実験です。真似して損害を被っても当方は責任を負いません。。というか絶対損しますw


『 機械学習 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。