機械学習で何ができるの?深層学習(ディープラーニング)だと何が違うの? というのは他の方に任せるとして、やっぱり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
また、データ欠損もそこそこあります。
動作環境の構築
今回必要なのはPython
、TensorFlow
、Pandas
とnumpy
位です。pip
で大体インストール可能ですが、めんどくさければGoogle Cloud Platform
のDatalab
を使えばプリインストールされている環境が利用できます。
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)
終値の差分を求める
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'])
プロットして確認してみます。
これを26期間にスライス、1期間毎にストライドさせています。
RNN (LSTM)で学習
LSTMの実装はこれほぼそのままで、入力の部分だけshapeを今回のデータに合わせました。するとこんな感じにBi-Directionalなモデルが出来上がります。
Bi-Directionalにすると過去から未来への時系列と未来から過去への時系列を追って学習してくれるのですが、これが今回のデータに合っているかどうかは再考が必要です。
設定はこんな感じ。
learning_rate = 0.0001
training_iters = 500000
batch_size = 128
ちなみにトレーニングデータの多い方のクラス割合は0.502118
なので、これを超えないとランダムに選択するより精度悪いじゃん!ってなります。
では学習の結果は・・・
0.528883
う〜ん・・・2%ちょっとランダムよりマシですね。
試しにステップ数を上げてぶん回してもほとんど変わりませんでした。
追記
スライスする期間を104に上げ、ステップ数を80万位にしてみました。
8コア(CPU only)で15時間ほど。
次回以降
CNNを使ったり、別の通貨ペアでも試してみようかなと思います。
追記 →やってみました。
TensorFlow (ディープラーニング)で為替(FX)の予測をしてみる CNN編
DISCLAIMER
この記事は個人的な趣味による実験です。真似して損害を被っても当方は責任を負いません。。というか絶対損しますw