深層強化学習（R2D2）を用いたシステムトレーディング

# はじめに

　近年、人工知能ブームにより、人工知能を使ったトレーディング手法が盛んである。そこで、今回は深層強化学習を用いたシステムトレーディングを実施した。
　まず、基本的な深層強化学習を用いたトレーディングモデルである。agentの行動として、 BUY、HOLD、SELLの三つの内一つを選択する。環境の戻り値として、状態（今現在保有しているポジションの価格、市場価格、手持ちのキャッシュ）、報酬（手持ちのキャッシュの変化値（含む益も含む））、終了（取引の終了か否か）、情報（ターミナルにディスプレイする情報）を返す。

![rl_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/7a66bcdc-d514-1e07-adc4-c81b8d80bcd9.png)


## 使用データについて

トレンド傾向の掴みやすさから、yahoo financeからGSPCの日足を使用した。

訓練データの期間：2015/1/1 - 2017/6/30
テストデータの期間：2017/7/1 - 2021/1/1

以下ソースコード

https://github.com/sugiyama404/ReinfoceLearningForTrading/blob/main/get_csv.ipynb

# R2D2[^1]

R2D2はApe-X[^2]の後継であり、Ape-Xから以下の機能を引き継いでいる。

・Double Q-learning(Double DQN)[^3]
・優先度付き経験再生(Priority Experience Reply DQN)(Importance Samplingを含む)[^4]
・Dueling Network(Dueling Network DQN)[^5]
・並列分散処理(GORILA)[^6]
・Multi-Step learning

R2D2では以上に加え以下の機能を追加した。

・LSTMを用いたBurn In
・リスケーリング

## モデル

今回は、時系列データが軌跡であることから、CNN-LSTMモデル[^7]とDueling Network[^5]を参考に以下のモデルを考案した。Adamのepsilon=0.001が重要であり、勾配爆発を防いでくれる。

![r2d2_model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/2ed58701-c354-bee0-4c89-daf396df219c.png)

```python
conv_filter = 12
units = 16
look_back = 10
opt = Adam(learning_rate=0.0001, epsilon=0.001)

model = Sequential()
model.add(Conv1D(filters=conv_filter, kernel_size=1, padding="same", activation="tanh",batch_input_shape=(1, look_back, 3)))
model.add(MaxPool1D(pool_size=1, padding='same'))
model.add(Activation("relu"))
model.add(LSTM(units, stateful=True, name="lstm"))
model.add(Dense(4, kernel_initializer='random_uniform'))
model.add(Lambda(lambda a: K.expand_dims(a[:, 0], -1) + a[:, 1:] - 0.0*K.mean(a[:, 1:], keepdims=True),output_shape=(3,)))
model.compile(loss = "mean_absolute_error", optimizer=opt)
model.summary()
self.model = model
```

## DRQN[^8]

DRQN(Deep Recurrent Q-Learning)とは、DQNのネットワークにRNN,LSTMなどのリカレントニューラルネットワークに変更を行なったもの。これにより、時系列を考慮した学習ができるようになった。

https://github.com/sugiyama404/ReinfoceLearningForTrading/blob/main/DRQN/drqn_test.ipynb

### ステートレスLSTMとステートフルLSTM

ステートレスLSTMとステートフルLSTMの違いは、train,predictを行なった際に、内部状態がリセットされるのか、次に引き継げるのかの違いである。

ステートレスLSTM

https://github.com/sugiyama404/ReinfoceLearningForTrading/blob/main/DRQN-Sequential/drqn-sequential_test.ipynb

また、実際に行動した、価値関数Qを上書き、再度行動する際、価値関数Qが大きい行動を選択するという構造上、全ての軌跡を学習に用いることで、勾配爆発を誘発しやすい。

ステートフルLSTM(Burn In)

https://github.com/sugiyama404/ReinfoceLearningForTrading/blob/main/DRQN-BurnIn/drqn-burnin_test.ipynb

Tensorflow2.0系では、train,predictを行なった際に、内部状態が変化する。

### Burn In

前述の通り、train,predictを行なった際に、内部状態が変化することや、ネットワークが更新された後、更新される前のネットワークの初期状態を設定すると学習が安定化しないという問題が起こった。

その問題の解決策として、Burn Inが挙げられる。
Burn Inとは、学習時に
①前のネットワークの初期状態を現在のネットワークに設定
②現在のネットワークでpredictを行うが、出力は無視する(Burn In)
③学習
の工程を踏まえる事で、学習を安定化させた。

### リスケーリング

```math
h(x) = sign(x)(\sqrt{|x|+1}-1)+\epsilon x \\

\begin{align}
\hat{y_t} &= h\left(\sum_{k=0}^{n-1} \gamma ^kr_{t+k} + \gamma ^n h^{-1}\left(Q(s_{t+n},a^*; \overline{\theta})\right)\right)
\end{align} \\
a^* = argmax_a Q(s_{t+n},a;\theta)
```

リスケーリングとは、DQN等では、[-1,0,1]で報酬をクリッピングを行なっていたが、報酬の値の影響を加味するため、リスケーリングを行い学習をした。

今回は、最大値が入金金額の影響を受けることから、正規化した後、リスケーリングを行なった。また、報酬の不安定性から、学習時とpriorited experience replay時にリスケーリングを行なった。

# 売買ルール

1.空売りは認めない
2.ポジションを持っている場合、追加注文を出せない。
3.最後のステップでポジションを全て売却する。
4.ポジションは全買い、全売り
5.所持金は1000000ドル

# 実装と結果

ソースコードはこちら

https://github.com/sugiyama404/ReinfoceLearningForTrading/blob/main/R2D2/R2D2_test.ipynb

![Unknown-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/3ec7d2c6-40f6-4e8a-383e-42ea952f0ba6.png)

![Unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731268/49627f11-392b-51a1-dab9-7128076eae28.png)



ソースコードはこちら

https://github.com/sugiyama404/ReinfoceLearningForTrading/blob/main/make_data_analysys.ipynb


[^1]: Steven Kapturowski, Georg Ostrovski, John Quan, Re ́mi Munos,and Will Dabney. RECURRENT EXPERIENCE REPLAY IN DISTRIBUTED REINFORCEMENT LEARNING. In International Conference on Learning Representations, 2019.

[^2]: Dan Horgan, John Quan, David Budden, Gabriel Barth-Maron, Matteo Hessel, Hado van Hasselt, and David Silver. DISTRIBUTED PRIORITIZED EXPERIENCE REPLAY. In International Conference on Learning Representations, 2018. 

[^3]: Hado van Hasselt, Arthur Guez, and David Silver. Deep reinforcement learning with double Q- learning. In Advances in Neural Information Processing Systems, 2016. 

[^4]: Tom Schaul, John Quan, Ioannis Antonoglou, and David Silver. Prioritized experience replay. In International Conference on Learning Representations, 2016. 

[^5]: Ziyu Wang, Tom Schaul, Matteo Hessel, Hado van Hasselt, Marc Lanctot, and Nando de Freitas. Dueling network architectures for deep reinforcement learning. In International Conference on Machine Learning, 2016. 

[^6]: Arun. Nair, et al. Massively parallel methods for deep reinforcement learning. In International Conference on Machine Learning, 2015

[^7]: W. Lu,J. Li,Y. Li, A. Sun, and J. Wang. A CNN-LSTM-Based Model to Forecast Stock Prices. Hindawi Complexity, Volume 2020,p.10

[^8]: Matthew Hausknecht and Peter Stone. Deep Recurrent Q-Learning for Partially Observable MDPs. CoRR, abs/1507.06527, 1(11), 2017.