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

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

22879 次点击
所在节点    程序员
160 条回复
jousca
2020-03-28 11:07:51 +08:00
其实第一张抄底图,在第一个下跌坑底抄了之后,拉起来一定要卖掉抄底的金额,留本金。继续等下个坑。大部分散户忘记这个操作。所以最后被套死。

这个操作掌握好,每次抄完就卖,反复做低成本。直到出现真正坑底(这过程按年计算),最后是不会亏钱的。
fs418082760
2020-03-28 11:16:14 +08:00
看了标题感觉像是白日做梦,当股市里的所有人都用这个系统以后,系统会出错吗?
rockyou12
2020-03-28 11:22:39 +08:00
基本面基本没法数值化,所以这些炼金方法肯定还不如让猴子来买股票。但 ai 做形态识别来选股可能还蛮靠谱的,至少能卖给股民不是
heart4lor
2020-03-28 11:29:42 +08:00
纯靠一个曲线做预测效果应该和猜的差不多,五五开,如果能结合 nlp 分析一些市场情绪也许会有不错的效果
ytmsdy
2020-03-28 11:30:10 +08:00
一顿操作猛如虎,仔细看看二百五。
txydhr
2020-03-28 11:30:23 +08:00
@jousca 这种策略就是专门找出跌太多的股票,还是要以基本面的估值作为支持。一般这种策略大部分股票大部分时间都是小赚,然后某只股票或者某个时间点会一下亏很多。
warriortemple
2020-03-28 11:32:38 +08:00
最近也在学习,很有启发性
delectate
2020-03-28 11:33:45 +08:00
作为职业交易员,说真的,很喜欢这种自我沉醉的小韭菜。用各种迷信方法给自己催眠,简直是,越多越好哟~
cabing
2020-03-28 11:34:47 +08:00
厉害。

如果这个真的靠谱,所有学 ai 的都发财了:)
kooze
2020-03-28 11:36:47 +08:00
深度学习彩票来的是不是会更快?
Kamen27
2020-03-28 11:37:23 +08:00
做资金策略预测啊,顺便搞个爬虫扒新闻,然后只做一个股票,监控主力资金,爬利好或者利空消息,感觉还是有机会的。
imzhazha
2020-03-28 11:38:15 +08:00
@fs418082760 #22 所有人用同一个策略,这个策略就会失效,然后钱会被不用这个策略的人赚走。
ybw
2020-03-28 11:41:09 +08:00
楼主是典型的手里握着锤子,看什么都是钉子。
miyazaki
2020-03-28 11:41:57 +08:00
哈哈哈,恭喜你迈出了第一步,根据詹姆斯西蒙斯的经验来讲按照一定的数学模型炒股是可行的,但他还说了另外一句话“一个好木匠并不是因为他有一个好的凿子”。
我也想说一句这个 baostock 对数据的影响很大,如果没有真正的数据的话,可能你迈错了步子,嘿嘿。
GreyYang
2020-03-28 11:43:50 +08:00
假设有一个必胜策略, 那这个策略最终会将蔓延到整个市场, 当整个市场都使用这种策略时, 它就会失效. 所以, 没有必胜策略.

曾几何时,我也做过一个一键自动化亏钱系统 :)
locoz
2020-03-28 11:49:20 +08:00
@Kamen27 #31 还真有人这么做了,北京沃民🤣
GrayXu
2020-03-28 12:00:08 +08:00
想法太美好了,实际资本市场有太多其他因素,博弈等
barrelsoil
2020-03-28 12:00:57 +08:00
我是随机游走理论 + 预期理论追随者。。。
barrelsoil
2020-03-28 12:01:43 +08:00
@GreyYang 自动化亏钱系统,哈哈哈哈,笑死
astu
2020-03-28 12:08:58 +08:00
@GreyYang 有没有想过,一键亏钱系统,能改动一下,反向操作。你多我空 你空我多

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

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

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

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

© 2021 V2EX