CNTKの強化学習でFXトレードする(2日目)
今日はFX用の強化学習のモデルを作成しようと思います。
まずは通貨ですがドル円で1分足を使うようにします。観測値としては時系列の足データを利用する方法もありますが、ここはまずは複数の時間軸の移動平均を利用することにします。GPUパワーはあまりないので、生データよりも少し傾向があるデータを使うことで早く学習してくれることを期待しています。
報酬はもちろん獲得したpipsになりますが、売り買いを指示する際にはリスクが発生しますので、そのコストをマイナスの報酬にします。具体的には、pipsについてはトレードを開始した際の価格±5pipsで固定します。これが達成できた時点で報酬を与えます。勝った場合は+1.2、負けた場合は-0.8です。これは売り買いをした際に-0.2の報酬にしているためで合計1.0になるようにしました。
まとめると、以下のような感じです。
・FXの状態は複数の移動平均値を利用
・報酬は損益のpipsをベースに売買時のリスクも考慮する
プログラムは以下のような感じです。部分的なコードで意味不明化かもしれませんが、単純なコードなのはわかってもらえると思います。
while local_step < len(data): reward = 0 if action == 1: reward = -0.2 shortAction.append(data[local_step][5+2]) if action == 2: reward = -0.2 longAction.append(data[local_step][5+2]) pip = 0.05 for lAction in longAction: if lAction - pip > data[local_step][5]: reward = reward -0.8 longAction.remove(lAction) elif lAction + pip < data[local_step][5+1]: reward = reward +1.2 longAction.remove(lAction) ...
これで動かすことができるのですが、このプログラムが本当にうまく学習するかわからないので、規則性のあるデータでまずは試してみたいと思います。
ということでSIN関数を利用して学習させます。
このデータをベースに実際に実行してみます。結果はこんな感じです。sum_rewardsがプラスであれば利益が出ています。うまく学習していますね。
episode: 1 local_step: 1000 global_step: 1000 sum_rewards: -119.00000000000122 sum_count: 653 epsilon: 0.901 episode: 2 local_step: 1000 global_step: 2000 sum_rewards: -113.00000000000101 sum_count: 573 epsilon: 0.802 episode: 3 local_step: 1000 global_step: 3000 sum_rewards: -87.60000000000079 sum_count: 486 epsilon: 0.703 episode: 4 local_step: 1000 global_step: 4000 sum_rewards: -72.4000000000005 sum_count: 424 epsilon: 0.604 episode: 5 local_step: 1000 global_step: 5000 sum_rewards: -55.00000000000028 sum_count: 337 epsilon: 0.505 episode: 6 local_step: 1000 global_step: 6000 sum_rewards: -74.40000000000043 sum_count: 344 epsilon: 0.406 episode: 7 local_step: 1000 global_step: 7000 sum_rewards: -33.79999999999992 sum_count: 209 epsilon: 0.30700000000000005 episode: 8 local_step: 1000 global_step: 8000 sum_rewards: -25.999999999999925 sum_count: 170 epsilon: 0.20799999999999996 episode: 9 local_step: 1000 global_step: 9000 sum_rewards: -16.39999999999998 sum_count: 116 epsilon: 0.10899999999999997 episode: 10 local_step: 1000 global_step: 10000 sum_rewards: -5.600000000000003 sum_count: 50 epsilon: 0.01 episode: 11 local_step: 1000 global_step: 11000 sum_rewards: -11.599999999999984 sum_count: 68 epsilon: 0.01 episode: 12 local_step: 1000 global_step: 12000 sum_rewards: 4.3999999999999995 sum_count: 32 epsilon: 0.01 episode: 13 local_step: 1000 global_step: 13000 sum_rewards: 11.2 sum_count: 20 epsilon: 0.01
これでプログラムとしては学習できるものになっていることが確認できました。
次回、FXの過去データで試してみます。