# 📈 如何用深度强化学习自动炒股
## 💡 初衷
最近一段时间,受到新冠疫情的影响,股市接连下跌,作为一棵小白菜兼小韭菜,竟然产生了抄底的大胆想法,拿出仅存的一点私房钱梭哈了一把。
第二天,暴跌,俺加仓
第三天,又跌,俺加仓
第三天,又跌,俺又加仓...
<img src="img/2020-03-27-10-45-59.png" alt="drawing" width="50%"/>
一番错误操作后,结果惨不忍睹,第一次买股票就被股市一段暴打,受到了媳妇无情的嘲讽。痛定思痛,俺决定换一个思路:**如何用深度强化学习来自动模拟炒股?** 实验验证一下能否获得收益。
## 📖 监督学习与强化学习的区别
监督学习(如 LSTM)可以根据各种历史数据来预测未来的股票的价格,判断股票是涨还是跌,帮助人做决策。
<img src="img/2020-03-25-18-55-13.png" alt="drawing" width="50%"/>
而强化学习是机器学习的另一个分支,在决策的时候采取合适的行动 (Action) 使最后的奖励最大化。与监督学习预测未来的数值不同,强化学习根据输入的状态(如当日开盘价、收盘价等),输出系列动作(例如:买进、持有、卖出),使得最后的收益最大化,实现自动交易。
<img src="img/2020-03-25-18-19-03.png" alt="drawing" width="50%"/>
## 🤖 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
奖励函数的设计,对强化学习的目标至关重要。在股票交易的环境下,最应该关心的就是当前的盈利情况,故用当前的利润作为奖励函数。即`当前本金 + 股票价值 - 初始本金 = 利润`。
```python
# profits
reward = self.net_worth - INITIAL_ACCOUNT_BALANCE
reward = 1 if reward > 0 else reward = -100
```
为了使网络更快学习到盈利的策略,当利润为负值时,给予网络一个较大的惩罚 (`-100`)。
### 策略梯度
因为动作输出的数值是连续,因此使用基于策略梯度的优化算法,其中比较知名的是 [PPO 算法](https://arxiv.org/abs/1707.06347),OpenAI 和许多文献已把 PPO 作为强化学习研究中首选的算法。PPO 优化算法 Python 实现参考 [stable-baselines](https://stable-baselines.readthedocs.io/en/master/modules/ppo2.html)。
## 🕵️♀️ 模拟实验
### 环境安装
```sh
# 虚拟环境
virtualenv -p python3.6 venv
source ./venv/bin/activate
# 安装库依赖
pip install -r requirements.txt
```
### 股票数据获取
股票证券数据集来自于 [baostock](http://baostock.com/baostock/index.php/%E9%A6%96%E9%A1%B5),一个免费、开源的证券数据平台,提供 Python API。
```bash
>> pip install baostock -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn
```
数据获取代码参考 [get_stock_data.py](https://github.com/wangshub/RL-Stock/blob/master/get_data.py)
```python
>> 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`
<img src="img/sh.600036.png" alt="drawing" width="70%"/>
**多只股票**
选取 `1002` 只股票,进行训练,共计
- 盈利: `44.5%`
- 不亏不赚: `46.5%`
- 亏损:`9.0%`
<img src="img/pie.png" alt="drawing" width="50%"/>
<img src="img/hist.png" alt="drawing" width="50%"/>
## 👻 最后
- 股票 Gym 环境主要参考 [Stock-Trading-Environment](https://github.com/notadamking/Stock-Trading-Environment),对观测状态、奖励函数和训练集做了修改。
- 俺完全是股票没入门的新手,难免存在错误,欢迎指正!
- 数据和方法皆来源于网络,无法保证有效性,**Just For Fun**!
## 📚 参考资料
- 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"](http://stanford.edu/class/msande448/2019/Final_reports/gr2.pdf)
- 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](https://towardsdatascience.com/creating-a-custom-openai-gym-environment-for-stock-trading-be532be3910e)
- [notadamking/Stock-Trading-Environment](https://github.com/notadamking/Stock-Trading-Environment)
- [Welcome to Stable Baselines docs! - RL Baselines Made Easy](https://stable-baselines.readthedocs.io/en/master)
没有合适的资源?快使用搜索试试~ 我知道了~
RL-Stock:用如何用深度强化学习自动炒股
共23个文件
png:12个
py:4个
ttc:1个
5星 · 超过95%的资源 需积分: 42 32 下载量 124 浏览量
2021-03-14
08:09:56
上传
评论 6
收藏 4.14MB ZIP 举报
温馨提示
:chart_increasing:如何用深度强化学习自动炒股 :light_bulb:初衷 最近发生的事故,受到新冠疫情的影响,股市接连下降,作为一棵小白菜兼小韭菜,竟然产生了抄底的大胆想法,拿出仅存的一点私房钱梭哈了一把。 第二天,暴跌,俺加仓 第三天,又跌,俺加仓 第三天,又跌,俺又加仓... 一番错误操作后,结果严重不堪重负,第一次买股票就被股市一段暴打,受到了媳妇无情的嘲讽。痛定思痛,俺决定换一个思路:如何用深度强化学习来自动模拟炒股?实验验证一下能否获得收益。 :open_book:监督学习与强化学习的区别 监督学习(如LSTM)可以根据各种历史数据来预测未来的股票的价格,判断股票是涨还是跌,帮助人做决策。 而强化学习是机器学习的另一个分支,在决策的时候采取适当的行动(Action)使最后的奖励最大化。与监督学习预测未来的数值不同,强化学习根据输入的状态(如当日开盘价,收盘价等),输出系列动作(例如:买进,持有,卖出),从而最后的收益最大化,实现自
资源推荐
资源详情
资源评论
收起资源包目录
RL-Stock-master.zip (23个子文件)
RL-Stock-master
.gitignore 2KB
README.md 7KB
vis.ipynb 36KB
rlenv
StockTradingEnv0.py 5KB
__init__.py 0B
LICENSE 1KB
font
wqy-microhei.ttc 4.94MB
simhei.ttf 21KB
main.py 2KB
img
2020-03-27-10-45-59.png 95KB
2020-03-28-10-34-20.png 115KB
2020-03-27-10-22-58.png 106KB
2020-03-25-17-05-58.png 133KB
sh.600036.png 32KB
pie.png 14KB
2020-03-25-18-19-03.png 132KB
2020-03-25-18-58-52.png 1.12MB
hist.png 6KB
2020-03-25-18-55-13.png 59KB
2020-03-25-19-38-49.png 102KB
2020-03-28-10-34-46.png 10KB
requirements.txt 841B
get_stock_data.py 2KB
共 23 条
- 1
资源评论
- zjpgm2021-08-15用户下载后在一定时间内未进行评价,系统默认好评。
王奥雷
- 粉丝: 653
- 资源: 4711
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于C语言的GEMM矩阵乘法优化设计源码学习与应用
- 基于Java的电影票出售系统设计源码
- 基于Python和Web技术栈的公文传输系统设计源码
- 基于Kolmogorov-Arnold网络(KAN)的激光选区熔化(LPBF)孔隙缺陷声学监测算法设计与实现源码
- 基于C/C/Python的多功能.hcxtools:.cab转.hc22000格式转换工具源码
- 源代码-仿Google网站AJAX拖曳实例ASP保存数据.zip
- 基于Java语言,支持Python和HTML的Flask框架设计源码
- 源代码-仿360搜索首页源码 v1.0.zip
- 基于HTML、JavaScript、CSS、Java的xiangmu项目初始化设计源码
- 源代码-仿114la天气爬虫ASP源码 v2.0.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功