如何用深度強化學習模擬炒股
:bulb: 初衷
最近一段時間,受到新冠疫情的影響,股市接連下跌,作爲一棵小白菜兼小韭菜,竟然產生了抄底的大膽想法,拿出僅存的一點私房錢梭哈了一把。
第二天,暴跌,俺加倉
第三天,又跌,俺加倉
第三天,又跌,俺又加倉...
一番錯誤操作後,結果慘不忍睹,第一次買股票就被股市一段暴打,受到了媳婦無情的嘲諷。痛定思痛,俺決定換一個思路: 如何用深度強化學習來自動模擬炒股? 實驗驗證一下能否獲得收益。
:book: 監督學習與強化學習的區別
監督學習(如 LSTM)可以根據各種歷史數據來預測未來的股票的價格,判斷股票是漲還是跌,幫助人做決策。
而強化學習是機器學習的另一個分支,在決策的時候採取合適的行動 (Action) 使最後的獎勵最大化。與監督學習預測未來的數值不同,強化學習根據輸入的狀態(如當日開盤價、收盤價等),輸出系列動作(例如:買進、持有、賣出),使得最後的收益最大化,實現自動交易。
OpenAI Gym 股票交易環境
觀測 Observation
策略網絡觀測的就是一隻股票的各項參數,比如開盤價、收盤價、成交數量等。部分數值會是一個很大的數值,比如成交金額或者成交量,有可能百萬、千萬乃至更大,爲了訓練時網絡收斂,觀測的狀態數據輸入時,必須要進行歸一化,變換到 [-1, 1]
的區間內。
參數名稱 | 參數描述 | 說明 |
---|---|---|
date | 交易所行情日期 | 格式:YYYY-MM-DD |
code | 證券代碼 | 格式:sh.600000。sh:上海,sz:深圳 |
open | 今開盤價格 | 精度:小數點後4位;單位:人民幣元 |
high | 最高價 | 精度:小數點後4位;單位:人民幣元 |
low | 最低價 | 精度:小數點後4位;單位:人民幣元 |
close | 今收盤價 | 精度:小數點後4位;單位:人民幣元 |
preclose | 昨日收盤價 | 精度:小數點後4位;單位:人民幣元 |
volume | 成交數量 | 單位:股 |
amount | 成交金額 | 精度:小數點後4位;單位:人民幣元 |
adjustflag | 復權狀態 | 不復權、前復權、後復權 |
turn | 換手率 | 精度:小數點後6位;單位:% |
tradestatus | 交易狀態 | 1:正常交易 0:停牌 |
pctChg | 漲跌幅(百分比) | 精度:小數點後6位 |
peTTM | 滾動市盈率 | 精度:小數點後6位 |
psTTM | 滾動市銷率 | 精度:小數點後6位 |
pcfNcfTTM | 滾動市現率 | 精度:小數點後6位 |
pbMRQ | 市淨率 | 精度:小數點後6位 |
動作 Action
假設交易共有 買入 、 賣出 和 保持 3 種操作,定義動作( action
)爲長度爲 2 的數組
action[0] action[1]
動作類型 action[0] |
說明 |
---|---|
1 | 買入 action[1] |
2 | 賣出 action[1] |
3 | 保持 |
注意,當動作類型 action[0] = 3
時,表示不買也不拋售股票,此時 action[1]
的值無實際意義,網絡在訓練過程中,Agent 會慢慢學習到這一信息。
獎勵 Reward
獎勵函數的設計,對強化學習的目標至關重要。在股票交易的環境下,最應該關心的就是當前的盈利情況,故用當前的利潤作爲獎勵函數。即 當前本金 + 股票價值 - 初始本金 = 利潤
。
# profits reward = self.net_worth - INITIAL_ACCOUNT_BALANCE reward = 1 if reward > 0 else reward = -100
爲了使網絡更快學習到盈利的策略,當利潤爲負值時,給予網絡一個較大的懲罰 ( -100
)。
策略梯度
因爲動作輸出的數值是連續,因此使用基於策略梯度的優化算法,其中比較知名的是 PPO 算法 ,OpenAI 和許多文獻已把 PPO 作爲強化學習研究中首選的算法。PPO 優化算法 Python 實現參考 stable-baselines 。
️♀️ 模擬實驗
環境安裝
# 虛擬環境 virtualenv -p python3.6 venv source ./venv/bin/activate # 安裝庫依賴 pip install -r requirements.txt
股票數據獲取
股票證券數據集來自於 baostock ,一個免費、開源的證券數據平臺,提供 Python API。
>> pip install baostock -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn
數據獲取代碼參考 get_stock_data.py
>> python get_stock_data.py
將過去 20 多年的股票數據劃分爲訓練集,和末尾 1 個月數據作爲測試集,來驗證強化學習策略的有效性。劃分如下
1990-01-01 ~ 2019-11-29 |
2019-12-01 ~ 2019-12-31 |
---|---|
訓練集 | 測試集 |
驗證結果
單隻股票
- 初始本金
10000
- 股票代碼:
sh.600036
(招商銀行) - 訓練集:
stockdata/train/sh.600036.招商銀行.csv
- 測試集:
stockdata/test/sh.600036.招商銀行.csv
- 模擬操作
20
天,最終盈利約400
多隻股票
選取 1002
只股票,進行訓練,共計
44.5% 46.5% 9.0%
:ghost: 最後
- 股票 Gym 環境主要參考 Stock-Trading-Environment ,對觀測狀態、獎勵函數和訓練集做了修改。
- 俺完全是股票沒入門的新手,難免存在錯誤,歡迎指正!
- 數據和方法皆來源於網絡,無法保證有效性。
- Just For Fun !
:books: 參考資料
- Y. Deng, F. Bao, Y. Kong, Z. Ren and Q. Dai, "Deep Direct Reinforcement Learning for Financial Signal Representation and Trading," in IEEE Transactions on Neural Networks and Learning Systems, vol. 28, no. 3, pp. 653-664, March 2017.
- Yuqin Dai, Chris Wang, Iris Wang, Yilun Xu, "Reinforcement Learning for FX trading"
- Chien Yi Huang. Financial trading as a game: A deep reinforcement learning approach. arXiv preprint arXiv:1807.02787, 2018.
- Create custom gym environments from scratch — A stock market example
- notadamking/Stock-Trading-Environment
- Welcome to Stable Baselines docs! - RL Baselines Made Easy
源碼
Github 源碼地址: https://github.com/wangshub/RL-Stock