機械学習
DeepLearning
FX
GoogleCloudPlatform
TensorFlow

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

More than 1 year has passed since last update.

機械学習で何ができるの?深層学習(ディープラーニング)だと何が違うの? というのは他の方に任せるとして、やっぱり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