強化学習の論文読み"Cryptocurrency Portfolio Management with Deep Reinforcement Learning"

論文読み回用の資料として論文の紹介資料をまとめます。

読む論文はこちらになります。
Cryptocurrency Portfolio Management with Deep Reinforcement Learning
https://arxiv.org/pdf/1612.01277.pdf

この論文の読みどころは以下の３つになります。
・仮想通貨のポートフォリオ最適化を強化学習で実験
・バックテストで爆益
・強化学習への定式化方法が参考になる

# section2: ポートフォリオ最適化の定式化
前提として、トレードする上で注文は即約定し、自身が市場に与える影響はないと仮定します。

$m$を仮想通貨の銘柄数、$n$を時系列の分割数($t=1,2,...,n$)とします。
$m$種類の仮想通貨の価格を時系列に並べた行列データ$G$を$G_{ij}=$通貨$i$の時刻$j$の価格として定義します。時刻$j$の$m$個の価格を取り出したベクトルを$v_j$とします。

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211078/544d184a-b2c9-2440-4d07-07b35340a687.png)



論文では$x_{1,\*}$でベース通貨を設定します。例えばBTCをベース通貨として$x_{1,\*}=1$とします。わかりやすく言うと、1BTCはいつになっても1BTCのままということです。2行目がXRPだとして、$x_{2,1}=0.0001$, $x_{2,n}=0.0002$であればXRPは時刻1からnでBTC換算で0.0001から0.0002に価値が上昇したということを表します。
株のアルゴリズムトレードで利用するときは1行目を日本円として、それ以降を株価にすればそのまま適用できます。

時刻$t$から$t+1$への変化率を$v_{t+1}$から$v_t$を要素ごとに割り算して$y_t$とします。

![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211078/75d6961c-cb93-d92b-41e3-f1d1185f1d64.png)

$y_t$は単位時間あたりに何パーセントに変化したかを表しています。時刻$t$のポートフォリオ$w_t$は$0\leq w_{t,i}\leq 1$, $\sum{w_{t,i}}=1$を満たすベクトルで、時刻$t$で作成したポートフォリオの時刻$t+1$での資産価値の変化率$r_t$を以下の式で計算できます。

![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211078/684acde0-4976-e6ef-1be0-ffc89d5e5e0b.png)

例を示しておくと、時刻1でBTCに40%,XRPに60%のポートフォリオを組んだとして、$w_{1,1}=0.4$, $w_{1,2}=0.6$となり、時刻$n$までホールドしたとすると、$y_{t, 1}=1$(BTCは変化しないので1のまま), $y_{t,2}=2$(XRPは0.0001から0.0002に価値が2倍に変化した)で、
$r_n=w_{1,1}\times y_{n,1}+w_{1,2}\times y_{n,2}=1.2$
となる、資産価値は1から1.2に20%の利益を得たことになります。

時刻$1$から時刻$n$までのトータルでの資産変化を以下の式で表せます。論文では手数料を考慮した式になっていますが、本記事ではわかりやすいように手数料を無視した式を書いておきます。

$\alpha_n=\prod_{t} r_t=\prod_t w_ty_t$

これは複利計算になっています。ポートフォリオ最適化の問題として考えると$a_n$を最大化する$w_t, \forall t $を計算することになります。論文では$y_t$は定数扱いですが、ここを確率変数にするとリスクやロバスト性を問題設定に加えられるので応用しやすいです。

# section3: データ処理

ポートフォリオを計算するための特徴量は$window$時間遡った$m\times window$行列で以下の赤で囲った部分になります。論文では$m=12, window=50$としています。(論文では$window$という変数名ではなく$w$としていますが、ポートフォリオベクトルと紛らわしいのでこの記事では別の名前にしておきます)

![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211078/8d0e8234-cfce-89a5-9952-1022b3e23edb.png)


#### normalization
上記の特徴量を以下のように正規化して使います。

![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211078/d63fd951-b4b8-61e9-01a9-1ebb2c6a7921.png)

#### 強化学習の流れ
強化学習は状態の観測、行動の選択、報酬の獲得、次の状態の観測、・・・と続きます。今回でいうと、
- 状態の観測は特徴量$X_t$
- 行動の選択はポートフォリオベクトル$w_t$の計算
- 報酬の獲得は得られる利益$R_t$

を設定することになります。

# section4: 強化学習（deterministic policy gradient）の議論

報酬$R$は$\prod_t w_ty_t$に対数をとって

$R = \sum_{t=1}^{n+1}\log{w_t \cdot y_t}$

とします。強化学習は報酬の総和が最大になるように学習が進み、自然な式で総和という部分を表現できています。しかもこれで複利計算を和の形で表現できているのもうまい定式化です。さらに言うと、ポートフォリオベクトル$w_t$はニューラルネットワークの出力層の活性化関数をsoftmaxにすることで得られるため非常にシンプルな実装になります。

# section5: 強化学習の学習で用いるニューラルネットワーク
ニューラルネットワークの初期値やハイパーパラメータが書かれていますが、この記事では省略します。

# section6: ニューラルネットワークの構造
以下のような畳み込み層と全結合層を間に挟みます。
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211078/f40fbb6b-efaf-4298-8302-ef2964b74830.png)

# section7: バックテスト
読んでないけど、バックテストの結果らしきものをはっておく。
![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211078/5ea1e31f-ee37-8e12-57aa-9d2c29c6ead6.png)
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211078/a266cb5a-4fd8-055e-ee0b-e45cc6879643.png)