: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: 參考資料

源碼

Github 源碼地址: https://github.com/wangshub/RL-Stock

相關文章