監督&強化學習模型在金融市場的應用
機器之心專欄
作者:Cerulean
本文介紹了多個監督學習和強化學習模型在金融市場的應用,作者主要描述了多個論文的核心思想與實現,並且全面概括了其在Github 上維護的項目。
項目地址:https://github.com/Ceruleanacg/Personae
目前,在本項目中:
實現了 4 個強化學習模型。
實現了 3 個監督學習模型。
實現了 1 個簡單的交易所,提供基本的買入、持有、賣出操作(賣空仍在開發中),標的物可以是股票組合或者期貨合約組合。
對於監督學習模型的數據集:
我們採用 2008 年 1 月 1 日到 2018 年 1 月 1 日這個區間內,
招商銀行(600036)
交通銀行(601328)
中信銀行(601998)
工商銀行(601389)
這四隻銀行股在第 T 天的,
開盤價(Open)
收盤價(Close)
最高價(High)
最低價(Low)
交易量(Volume)
作為輸入數據,第 T+1 天的收盤價(Close)作為輸出數據,進行訓練,其中,這個區間前 70% 的數據作為訓練數據,後 30% 作為測試數據,目前沒有設置驗證集數據。
下圖是目前的實驗結果,就目前的實驗結果來看,監督學習的表現要好於強化學習。
圖例 :藍色的折線是測試數據集,其他顏色的折線是三種不同的監督學習模型在測試集上的預測。
接下來,我們將會依次對這 3 個監督學習模型與 4 個強化學習模型做一個簡短的介紹。
1. Naive-LSTM (LSTM)
該模型是基於 LSTM 和 Dense(全連接)的基本模型,輸入是序列長度為 5,即第 T 到第 T+4 天的 OCHLV 數據,輸出是一個實數,代表了第 T+5 的預測收盤價格。
arXiv:1506.02078: Visualizing and Understanding Recurrent Network
模型計算圖:
以下是構建模型的核心代碼:
可以看出,第一行代碼調用了項目中封裝的用於構建 LSTM 層的 API,第二行代碼用於計算該層輸出和狀態序列,第四行和第五行構造了一個全連接層並計算最終的輸出。
2. TreNet (HNN)
IJCAI 2017. Hybrid Neural Networks for Learning the Trend in Time Series
上述引用的論文提出了一種混合神經網路的結構,同時用 RNN 與 CNN 提取序列特徵,然後將輸出拼接作為全連接層的輸入,最後輸出最終的預測結果。
模型計算圖:
以下是構建模型的核心代碼:
可以看出,第一到第三行構造了 LSTM 層並計算結果,第四到第五行用項目封裝的構造 CNN 的 API 構造了 CNN 層並計算了結果。最後拼接了 RNN 和 CNN 的結果,作為全連接層的輸入,然後得到最終的計算結果。
3. DA-RNN (DualAttnRNN)
arXiv:1704.02971: A Dual-Stage Attention-Based Recurrent Neural Network for Time Series Prediction
上述引用的論文提出了一種基於注意力機制(Attention Based Model)的與 Seq-to-Seq 模型的網路結構,其創新點在於該模型連續兩次使用注意力機制,在對原始序列使用注意力機制求權重後再次使用注意力機制對編碼後的序列求權重,然後經解碼與全連接層後輸出結果。
模型計算圖:
以下是構建模型的核心代碼:
可以看出,分別對應於四個變數命名空間,具有 2 組 4 個編解碼層,在每一個編解碼層都運用了一次注意力機制,求出當前序列的權重,然後與序列相乘後進行下一步的編解碼工作,這是一種 Seq-to-Seq 的機制,更廣泛地用於自然語言處理。最終解碼的輸出結果作為全連接層的輸入,然後計算最終的結果。
以上是關於項目中監督學習模型的簡短介紹,其中,所有模型的具體實現可以在項目鏈接中看到。
接下來是關於 3 個強化學習模型的介紹,但是在介紹強化學習模型前,我們首先對強化學習的數據和環境一個簡短的概述。
Financial Market
這個文件實現了三個核心類,分別是:
Market
Trader
Position
他們分別代表了市場、交易員、持倉信息,最終 Market 類作為 Agent(強化學習模型)的 Environment(環境),接受 Agent 的 Action(動作),同時給出 Next State(下一狀態)和 Reward(獎勵),並進行迭代。
對於強化學習使用的數據,
我們使用這四隻銀行股在第 T 天的,
開盤價(Open)
收盤價(Close)
最高價(High)
最低價(Low)
交易量(Volume)
和交易員在第 T 天的,
現金(Cash)
持倉價值(Holding Value)
各持倉量(Holding Amount)
作為 State(狀態),使用交易指令,
買入(Buy)
賣出(Sell)
持有(Hold)
作為 Agent(智能體)的 Action(動作),其中,Reward Func(獎勵函數)有 2 個版本,的計算代碼如下:
def_update_reward(self, action_code, action_status, position):
ifaction_code == ActionCode.Buy:
ifaction_status == ActionStatus.Success:
ifposition.pro_value > position.cur_value:
self.reward +=70
else:
self.reward -=50
else:
self.reward -=100
elifaction_code == ActionCode.Sell:
ifaction_statu @staticmethod
def_calculate_reward_v1(action_code, action_status, position):
ifaction_status == ActionStatus.Failed:
reward =-100
else:
ifposition.pro_value >= position.cur_value:
ifaction_code == ActionCode.Hold:
reward =50
else:
reward =100
else:
reward = -50
returnreward
@staticmethod
def_calculate_reward_v2(_, action_status, position):
ifaction_status == ActionStatus.Success:
reward = position.pro_value - position.cur_value
else:
reward =-200
returnreward
s == ActionStatus.Success:
ifposition.pro_value > position.cur_value:
self.reward -=70
else:
self.reward +=50
else:
self.reward -=100
else:
ifaction_status == ActionStatus.Success:
ifposition.pro_value > position.cur_value:
self.reward +=70
else:
self.reward -=50
else:
self.reward -=100
接下來是關於實驗結果與強化學習模型的介紹:
圖例 - 橫坐標是時間,縱坐標是利潤,其中藍色折線是基準線,其他顏色的折線是強化學習模型表現
可以看出,除了 Policy Gradient 可以跑贏基準收益外,其他強化學習模型的收益甚至不如基準,這裡非常值得討論,目前筆者也在嘗試從參數、輸入特徵、輸出特徵、獎勵函數等多個角度考慮解決該問題。
接下來是關於強化學習模型的介紹:
1. Policy Gradient
NIPS. Vol. 99. 1999: Policy gradient methods for reinforcement learning with function approximation
模型計算圖:
Basic Policy Gradient 的思想很樸素,重複及可能多的採樣,對於一次採樣的所有動作中,根據獎勵函數值的正負決定梯度下降的方向,從而提高或者降低這些動作出現的概率。
以下是構建模型的核心代碼:
本實現簡單地採用兩次全連接後輸出 Softmax 後各個動作的概率,最後期望最小化採樣動作的概率與真實概率乘以獎勵函數的值的交叉熵。
2. Double DQN
arXiv:1509.06461: Deep Reinforcement Learning with Double Q-learning
模型計算圖:
Double-DQN 採用評估網路與目標網路相互制約,期望避免傳統 DQN 中容易出現的過度估計問題。首先使用評估網路預測下一個狀態的狀態-動作函數值,然後選取取得最大值的動作,計做 a_,接著用目標網路預測下一狀態與採用 a_ 的狀態值計算標籤,然後期望最小化標籤與評估網路對當前狀態的狀態-動作函數和當前動作的 Q 的均方差。
以下是構建模型的核心代碼:
Double-DQN 的實現代碼中,注釋已經非常詳盡,在這裡就不再過多贅述。
3. Deep Deterministic Policy Gradient (DDPG)
arXiv:1509.02971: Continuous control with deep reinforcement learning
模型計算圖:
DDPG 用於連續動作空間,在本問題中,對於四隻股票的買賣持有的動作被映射到區間 [0, 11],其中,DDPG 使用 Actor-Critic Model,引入評估 Actor,目標 Actor 模型與評估 Critic,目標 Critic 模型兩組四個網路,其中 Actor 模型用於預測動作,Critic 模型用於評估當前狀態與動作的分數(狀態-動作值函數),該方法期望最小化:評估 Critic 與評估 Actor 對當前狀態-動作函數值與目標 Critic 和目標 Actor 對下一狀態-動作函數值的均方差(如演算法圖所示),依次迭代改進目標 Critic 和目標 Actor。
以下是構建模型的核心代碼:
def_init_nn(self):
# Initialize predict actor and critic.
self.a_predict = self.__build_actor_nn(self.s,"predict/actor", trainable=True)
self.q_predict = self.__build_critic(self.s, self.a_predict,"predict/critic", trainable=True)
# Initialize target actor and critic.
self.a_next = self.__build_actor_nn(self.s_next,"target/actor", trainable=False)
self.q_next = self.__build_critic(self.s_next, self.a_next,"target/critic", trainable=False)
# Save scopes
self.scopes = ["predict/actor","target/actor","predict/critic","target/critic"]
def_init_op(self):
# Get actor and critic parameters.
params = [tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope)forscopeinself.scopes]
zipped_a_params, zipped_c_params = zip(params[], params[1]), zip(params[2], params[3])
# Initialize update actor and critic op.
self.update_a = [tf.assign(t_a, (1- self.tau) * t_a + self.tau * p_a)forp_a, t_ainzipped_a_params]
self.update_c = [tf.assign(t_c, (1- self.tau) * t_c + self.tau * p_c)forp_c, t_cinzipped_c_params]
# Initialize actor loss and train op.
self.a_loss = -tf.reduce_mean(self.q_predict)
self.a_train_op = tf.train.RMSPropOptimizer(self.learning_rate).minimize(self.a_loss, var_list=params[])
# Initialize critic loss and train op.
self.q_target = self.r + self.gamma * self.q_next
self.c_loss = tf.losses.mean_squared_error(self.q_target, self.q_predict)
self.c_train_op = tf.train.RMSPropOptimizer(self.learning_rate *2).minimize(self.c_loss, var_list=params[2])
# Initialize variables.
self.session.run(tf.global_variables_initializer())
代碼首先初始化兩組四個網路,分別是評估 Actor、目標 Actor,評估 Critic,目標 Critic,然後根據 DDPG 的演算法最小化評估 Critic 與評估 Actor 對當前狀態-動作函數值與目標 Critic 和目標 Actor 對下一狀態-動作函數值的均方差,依次迭代更新 Actor 與 Critic 直至收斂。
4. Dueling-DQN
arXiv:1511.06581: Dueling Network Architectures for Deep Reinforcement Learning
模型計算圖:
演算法:
相對於 DQN 直接輸出狀態-動作函數值,Dueling-DQN 的狀態-動作函數值由上式決定,從網路結構上可以看出,在輸出狀態-動作函數值前,Dueling-DQN 的結構拆分了原 DQN 網路結構的最後一層,這樣的思想很像 Actor-Critic 模型中的 Baseline,因為並不是每個狀態都是十分重要的,有些時候對於這些狀態,採取那個動作都不會有很大的影響。
以下是構建模型的核心代碼:
即最終對於某個狀態-動作函數值而言,Advantage 的在不同動作維度上的值一定意義上描述了這個動作對於這個狀態的重要性,最後加上 Q 值,避免了過度估計。
以上是最近關於強化學習和監督學習在金融市場中的一些應用和相關論文方法的實現。
目前仍有以下問題亟待探討與解決:
強化學習模型獎勵函數的設計
強化學習中基於值迭代的演算法難以收斂
監督學習的特徵維度如何擴展
同時,項目中可能有 Bug,歡迎各種 Issue 提出以及歡迎貢獻各種代碼 : )
本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。
------------------------------------------------


※入門 | 通過 Q-learning 深入理解強化學習
※在Keras上實現GAN:構建消除圖片模糊的應用
TAG:機器之心 |