在被股市一顿暴打后,研究了下如何用深度强化学习自动炒股 ~

2020-03-28 10:40:02 +08:00
 easternslope

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

💡 初衷

最近一段时间,受到新冠疫情的影响,股市接连下跌,作为一棵小白菜兼小韭菜,竟然产生了抄底的大胆想法,拿出仅存的一点私房钱梭哈了一把。

第二天,暴跌,俺加仓

第三天,又跌,俺加仓

第三天,又跌,俺又加仓...

一番错误操作后,结果惨不忍睹,第一次买股票就被股市一段暴打,受到了媳妇无情的嘲讽。痛定思痛,俺决定换一个思路:如何用深度强化学习来自动模拟炒股? 实验验证一下能否获得收益。

📖 监督学习与强化学习的区别

监督学习(如 LSTM )可以根据各种历史数据来预测未来的股票的价格,判断股票是涨还是跌,帮助人做决策。

而强化学习是机器学习的另一个分支,在决策的时候采取合适的行动 (Action) 使最后的奖励最大化。与监督学习预测未来的数值不同,强化学习根据输入的状态(如当日开盘价、收盘价等),输出系列动作(例如:买进、持有、卖出),使得最后的收益最大化,实现自动交易。

🤖 OpenAI Gym 股票交易环境

观测 Observation

策略网络观测的就是一只股票的各项参数,比如开盘价、收盘价、成交数量等。部分数值会是一个很大的数值,比如成交金额或者成交量,有可能百万、千万乃至更大,为了训练时网络收敛,观测的状态数据输入时,必须要进行归一化,变换到 [-1, 1] 的区间内。

动作 Action

假设交易共有买入卖出保持 3 种操作,定义动作(action)为长度为 2 的数组

  • action[0] 为操作类型;
  • action[1] 表示买入或卖出百分比;

注意,当动作类型 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%

👻 最后

  • 股票 Gym 环境主要参考 Stock-Trading-Environment,对观测状态、奖励函数和训练集做了修改。
  • 俺完全是股票没入门的新手,难免存在错误,欢迎指正!
  • 数据和方法皆来源于网络,无法保证有效性,Just For Fun

📚 参考资料

项目地址

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

24863 次点击
所在节点    程序员
160 条回复
cue
2020-03-29 08:59:59 +08:00
说明楼主手里的钱还没亏完…………
pggcharles
2020-03-29 09:47:47 +08:00
我觉得像楼主一样的人肯定大有人在,只是是赚了钱还是亏了就不好说了
crella
2020-03-29 10:14:17 +08:00
不是说股市预测是数学深渊吗?

楼主搞这个之前,见到深海了没?(狗头
xcold
2020-03-29 10:21:53 +08:00
自从学会了理财,让原本并不富裕的家庭,雪上加霜~
memorybox
2020-03-29 10:34:44 +08:00
哈,同道中人啊;

虽然我一点也不相信将来 AI 投资会比长期拿者低估指数得到更高的收益;

但是我们喜欢玩啊,Maybe 找到一个短期有效的策略呢;

不过小赌怡情,不要下大注;

楼主的思路非常 Nice,这个乐观好玩的投资心态值得赞一个;

最后自推我自己开发的一个非常简陋、没有任何高科技含量的开源策略,这个策略目前正在经受市场上的狂风大浪,但还能稳稳的行船,欢迎大家来关注:

https://github.com/brain-zhang/xianglong
bruce2000
2020-03-29 11:41:46 +08:00
正准备玩一下这个,看看
meetcx
2020-03-29 14:29:57 +08:00
分析数据是有用的,但是前提是”真实且有效的数据”。
你分析的随机变量全是”公开和无效的“所有股民都知道的信息。你发的那张参数表真的看笑了。
甚至如果一个市场不公平,交易涉及了”内幕交易“你用什么办法预测都是徒劳。

我的公司股票上市了,每股真实价值只值 1 美元。但是发行价为每股 5 美元,一群想暴富憨 P 股民争相买入又不能卖出(即使考虑卖出)把我公司股价涨涨跌跌的一路哄抬到每股 100 美元,此时我身家已经翻了 100 倍,我该怎么做呢?现在立马走不合时宜,有非法集资的嫌疑,是犯法的,要坐牢。安全的做法把护照办好,把这个只有我知道的破烂公司维持一段时间,维持到股价相对平稳,然后剩下的就是缓慢抛售股票换成美元,以免震荡市场,直到公司宣布破产。

此时我在马尔代夫享受阳光,沙滩,美女。
此时一个被套牢的斑秃程序员还在为我公司股价破产而黯然忧伤,觉得自己是不是哪里技术不过关,我下次要努力了。

我笑笑,不说话。
分析这些数据不如问一个你买入股票所在公司一个内部员工对公司的看法。
qwertqwert12345
2020-03-29 15:29:51 +08:00
我猜你们这群评论的人 99%既没详细看楼主的帖子,也没看楼主的代码

首先回复深度学习 orLSTM 等几个名词的时候就已经是弟弟了,因为楼主用的是传统 RL

其次说楼主代码有问题的人,显然也没看过楼主的代码

楼主的代码核心就是一句话调库,这显然只是一个练手的调包小项目,楼主的主要贡献是数据输入处理和结果展示

把这个游戏项目映射到实际情况去发挥想象的人,也是弟弟,因为别人根本没想用到实际情况里,只是个自娱自乐的项目

因此我之前评价这个项目是:楼主的结果可视化做的还行
qing4587
2020-03-29 18:21:20 +08:00
你可以去外汇市场赚钱的,真的
外汇市场很多自动交易软件,你会编程,把你的想法实现下很容易
shiguiyou
2020-03-29 19:27:20 +08:00
根据我三四个月的炒股经验,这个标题一看就...股市没那么简单,太年轻
cjh1095358798
2020-03-29 23:39:08 +08:00
本来想说 too naive,很傻很天真的,看代码写出来了,精神可嘉。只是千万别出去宣传害人,最好你自己也不要用。先多看几本经典的书籍把,比如聪明的投资者,投资中最重要的事。看一看投资大佬们,是怎么看待市场的。
ericgui
2020-03-30 06:32:58 +08:00
自动炒股就是自动亏钱
Desiree
2020-03-30 09:09:00 +08:00
只要不是在 A 股,你的算法或多或少都能起到作用
Banxiaozhuan
2020-03-30 11:01:23 +08:00
之前读研究生的老师是研究这个的。 但是我没发现他很有钱。。。。。。
虽然我觉得有些意思, 但是玩玩还可以。
0x11901
2020-03-30 11:02:16 +08:00
……根据 2013 年诺贝尔经济学奖得主尤金·法玛的“有效市场假说”,你这个东西其实并没有任何*用……
shiguiyou
2020-03-30 11:31:16 +08:00
这是在预测人心(性)嘛?
zichen
2020-03-30 11:52:08 +08:00
1,想在股市赚钱,只要有小学生的数学基础就够了,股神这句话说的没错。
2,炒股更多的是人性,而不是技术层面的。
3,好行业,好公司,好价格
4,涨的时候拿的住,跌的时候跑的快
玩了几年美股,暂时就这些经验吧。4w 多的本,目前 11w 。
jon
2020-03-30 13:45:17 +08:00
支持楼主,比那些装逼的强多了
tzigone
2020-03-30 13:53:07 +08:00
济安线
lyh404
2020-03-30 14:14:48 +08:00
我有一整套数据、模型、策略,从信号处理、形态识别、机器学习到深度学习各种模型,然而并没有什么卵用。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/657014

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX