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

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

24825 次点击
所在节点    程序员
160 条回复
ddzzhen
2020-03-28 15:04:19 +08:00
学的很直白,学习一下
starrycat
2020-03-28 15:08:29 +08:00
深度抄底(doge
QandA
2020-03-28 15:09:42 +08:00
如果参考股市中的技术流,在炒币或者美股去分析可能会好一些,A 股限制太多而且属于政策市
liuxyon
2020-03-28 15:12:01 +08:00
关键这次是股票历史上第一次
gimp
2020-03-28 15:12:35 +08:00
那个... 把 15 年的数据喂给模型算一下收益率,看看止跌效果怎么样。
www5070504
2020-03-28 15:35:29 +08:00
听说用股市数据训练出来的深度学习做出的决策和股市情况正好相反 亏到关机
mazyi
2020-03-28 15:42:46 +08:00
炒股是博弈,然后才是决策。
danmary61
2020-03-28 15:43:16 +08:00
我的天,这是想做第一茬"智能"韭菜啊,如何主动精准碰瓷镰刀?不管哪个国家的股市,多准备几条裤子。
这不是冷嘲热讽,技术不是用在这里的,或者想在这个领域使用技术之前,请了解一下世界的基本运转方式,入门就够了,不用多深入。
xcstream
2020-03-28 15:44:52 +08:00
可能猴子抛香蕉皮更靠谱些
Wassermelone
2020-03-28 15:54:08 +08:00
确实有用电脑做高频交易套利的 但是都是团队在做的。。。
起码应该是 金融民工+互联网民工+数学民工


对于多数人
买股票前 问问你自己
了不了解这个企业 你对此企业的长远看法?
了不了解企业所在行业 你对此行业的长远看法?
此行业的市盈率和企业的一段时间的市盈率 价格被市场高估还是低估了?
然后看一下企业财报 或者是去问问企业员工近期情况


什么?你要炒短
当我没说
CuVee
2020-03-28 15:56:33 +08:00
你这就是在扯淡,还 AI 炒股。

股市这东西,各种数据分析基本都是辅助而已

有一定作用,但是真没什么金融知识,纯看别人给的数据分析

稳稳的破产



真正炒股的人从不研究什么各种数据指标,就看个单 K 线图的,通过 K 线图也不是做什么数据分析,而是“简单一眼”的,看一看这只股票最近的趋势,考虑是否 用金融经济知识 深入研究下 这个公司
admirez
2020-03-28 15:58:37 +08:00
你看研报都比这破 AI 靠谱
shm7
2020-03-28 16:03:05 +08:00
所以讲只能被当工具使。因为只有工具的心。
MaxSoloware
2020-03-28 16:10:26 +08:00
怎么这么多人喷?楼主不是说了 Just for fun ,锻炼一下自己的编程技能不是很好吗?不管有没有成功都有学到东西(再说了可以先看预测正确率再考虑是否要买入)。

再说一个其他的,之前看了一本介绍人工智能的书,已经有华尔街的投行开始使用这种技术了。
foil2
2020-03-28 16:16:32 +08:00
强化学习 RL 应用场景在于训练和应用的环境不变,保证马尔可夫性。你在训练集学得的策略放在现实中就不能用了吧,现实中的炒股环境都是动态的,跟你训练所使用的环境根本不是一回事啊。

所以(^^)娱乐而已。
revalue
2020-03-28 16:25:37 +08:00
桥水基金量化交易了解一下,你这个“资讯获取”的专业水平太差,不适合炒股
susecjh
2020-03-28 16:31:39 +08:00
A 股毫无规律,能让你赔到怀疑人生
235777178
2020-03-28 16:40:26 +08:00
github 上有一个量化交易的。

其实,主要还是看宏观,能不能判断好走势。量化或者深度学习都只是帮你的工具。
hjw45611
2020-03-28 16:43:10 +08:00
代码只是根据以往的规律和现有的变量来得到结果,但真正股市是人与人斗
kvenux
2020-03-28 16:46:52 +08:00
强化 mdp 的基本假设是,agent 的动作要跟环境交互来影响环境的下一个状态。状态转移函数是跟 action 无关的函数(其实就是时间序列)。简单来说,明天某个股的开高低收和你今天的操作半毛钱关系没有,所以你用强化解这个 mdp 是没有意义的。
什么时候强化能解这个问题?当 agent 是个大机构,几万手下单能影响股价的那种,才真正能通过交互学这个 mdp 。同事问题也很多:
1. 强化需要 millions of interactions,总不能在实盘里训练个几十年?开发模拟器?模拟器都有了还训练强化干啥
2. 炒股实质是个超大规模的博弈问题,这个市场里的个体要采取的操作太难预测了,这种 non-stationary 不是现有人类知识储备能解决的

也许持仓百分比可以计入状态?也许控制仓位算一个合理的应用

另外,动作空间是啥,multi-discrete?还是离散和连续的混合空间?实现起来不容易啊
谨慎怀疑 lz 代码有 bug

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

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

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

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

© 2021 V2EX