8000 GitHub - leileiwan/RL-Stock: 📈 如何用深度强化学习自动炒股
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

📈 如何用深度强化学习自动炒股

License

Notifications You must be signed in to change notification settings

leileiwan/RL-Stock

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

📈 如何用深度强化学习自动炒股

💡 åˆè¡·

最近一段时间,å—到新冠疫情的影å“,股市接连下跌,作为一棵å°ç™½èœå…¼å°éŸ­èœï¼Œç«Ÿç„¶äº§ç”Ÿäº†æŠ„åº•çš„å¤§èƒ†æƒ³æ³•ï¼Œæ‹¿å‡ºä»…å­˜çš„ä¸€ç‚¹ç§æˆ¿é’±æ¢­å“ˆäº†ä¸€æŠŠã€‚

第二天,暴跌,俺加仓

第三天,åˆè·Œï¼Œä¿ºåР仓

第三天,åˆè·Œï¼Œä¿ºåˆåР仓...

drawing

一番错误æ“作åŽï¼Œç»“果惨ä¸å¿ç¹ï¼Œç¬¬ä¸€æ¬¡ä¹°è‚¡ç¥¨å°±è¢«è‚¡å¸‚一段暴打,å—到了媳妇无情的嘲讽。痛定æ€ç—›ï¼Œä¿ºå†³å®šæ¢ä¸€ä¸ªæ€è·¯ï¼šå¦‚何用深度强化学习æ¥è‡ªåŠ¨æ¨¡æ‹Ÿç‚’è‚¡ï¼Ÿ 实验验è¯ä¸€ä¸‹èƒ½å¦èŽ·å¾—æ”¶ç›Šã€‚

📖 监ç£å­¦ä¹ ä¸Žå¼ºåŒ–学习的区别

监ç£å­¦ä¹ ï¼ˆå¦‚ LSTM)å¯ä»¥æ ¹æ®å„ç§åކ岿•°æ®æ¥é¢„测未æ¥çš„股票的价格,判断股票是涨还是跌,帮助人åšå†³ç­–。

drawing

而强化学习是机器学习的å¦ä¸€ä¸ªåˆ†æ”¯ï¼Œåœ¨å†³ç­–的时候采å–åˆé€‚的行动 (Action) 使最åŽçš„奖励最大化。与监ç£å­¦ä¹ é¢„测未æ¥çš„æ•°å€¼ä¸åŒï¼Œå¼ºåŒ–学习根æ®è¾“入的状æ€ï¼ˆå¦‚å½“æ—¥å¼€ç›˜ä»·ã€æ”¶ç›˜ä»·ç­‰ï¼‰ï¼Œè¾“å‡ºç³»åˆ—åŠ¨ä½œï¼ˆä¾‹å¦‚ï¼šä¹°è¿›ã€æŒæœ‰ã€å–出),使得最åŽçš„æ”¶ç›Šæœ€å¤§åŒ–,实现自动交易。

drawing

🤖 OpenAI Gym 股票交易环境

观测 Observation

策略网络观测的就是一åªè‚¡ç¥¨çš„å„项傿•°ï¼Œæ¯”å¦‚å¼€ç›˜ä»·ã€æ”¶ç›˜ä»·ã€æˆäº¤æ•°é‡ç­‰ã€‚部分数值会是一个很大的数值,比如æˆäº¤é‡‘颿ˆ–者æˆäº¤é‡ï¼Œæœ‰å¯èƒ½ç™¾ä¸‡ã€åƒä¸‡ä¹ƒè‡³æ›´å¤§ï¼Œä¸ºäº†è®­ç»ƒæ—¶ç½‘ç»œæ”¶æ•›ï¼Œè§‚æµ‹çš„çŠ¶æ€æ•°æ®è¾“入时,必须è¦è¿›è¡Œå½’ä¸€åŒ–ï¼Œå˜æ¢åˆ° [-1, 1] 的区间内。

傿•°åç§° 傿•°æè¿° 说明
date 交易所行情日期 æ ¼å¼ï¼šYYYY-MM-DD
code è¯åˆ¸ä»£ç  æ ¼å¼ï¼šsh.600000。sh:上海,sz:深圳
open 今开盘价格 ç²¾åº¦ï¼šå°æ•°ç‚¹åŽ4ä½ï¼›å•ä½ï¼šäººæ°‘å¸å…ƒ
high 最高价 ç²¾åº¦ï¼šå°æ•°ç‚¹åŽ4ä½ï¼›å•ä½ï¼šäººæ°‘å¸å…ƒ
low 最低价 ç²¾åº¦ï¼šå°æ•°ç‚¹åŽ4ä½ï¼›å•ä½ï¼šäººæ°‘å¸å…ƒ
close 今收盘价 ç²¾åº¦ï¼šå°æ•°ç‚¹åŽ4ä½ï¼›å•ä½ï¼šäººæ°‘å¸å…ƒ
preclose 昨日收盘价 ç²¾åº¦ï¼šå°æ 8000 •°ç‚¹åŽ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

drawing

多åªè‚¡ç¥¨

é€‰å– 1002 åªè‚¡ç¥¨ï¼Œè¿›è¡Œè®­ç»ƒï¼Œå…±è®¡

  • 盈利: 44.5%
  • ä¸äºä¸èµšï¼š 46.5%
  • äºæŸï¼š9.0%

drawing

drawing

👻 最åŽ

  • 股票 Gym 环境主è¦å‚考 Stock-Trading-Environment,对观测状æ€ã€å¥–励函数和训练集åšäº†ä¿®æ”¹ã€‚
  • 俺完全是股票没入门的新手,难å…存在错误,欢迎指正ï¼
  • æ•°æ®å’Œæ–¹æ³•çš†æ¥æºäºŽç½‘络,无法ä¿è¯æœ‰æ•ˆæ€§ï¼ŒJust For Funï¼

📚 å‚考资料

About

📈 如何用深度强化学习自动炒股

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Jupyter Notebook 78.7%
  • Python 21.3%
0