初衷项目地址:
https://github.com/wangshub/RL-Stock
最近一段时间,受到新冠疫情的影响,股市接连下跌,作为一棵小白菜兼小韭菜,竟然产生了抄底的大胆想法,拿出仅存的一点私房钱梭哈了一把。
第二天,暴跌,俺加仓
第三天,又跌,俺加仓
第三天,又跌,俺又加仓...
一番错误操作后,结果惨不忍睹,第一次买股票就被股市一段暴打,受到了媳妇无情的嘲讽。痛定思痛,俺决定换一个思路:如何用深度强化学习来自动模拟炒股? 实验验证一下能否获得收益。
监督学习与强化学习的区别监督学习(如 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 个月数据作为测试集,来验证强化学习策略的有效性。划分如下
验证结果
单只股票
初始本金 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!
books 参考资料
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)
隔行如隔山,创业者说。所以,才有创业前的深思熟屡,才有各种事前准备。同样是创业,如果你把投资看成一项事业的话,在用资金购买股票之前,却有八九成的人连股票的交易过程是什么都未曾来得及了解,懵懂之中就杀了进来。
而真正在投资之前,搞过一年以上的模拟操作的投资者,少之又少。而在模拟之后,投入个三千两千积累操作经验的实战训练者,更是寥寥无几。
一提模拟,就有人嗤之以鼻。这年头,连爱情都成了快餐,成功都成了方面面,谁还有那心思,那精力,哪有耐心去搞什么傻乎乎的模拟盘。这是一般投资者的思路。
而另外一种投资者,每当出现一种新鲜事物,比如权证,比如ETF,他们总是不忙着去介入,而是严肃地在论坛上进行一个时期的模拟,在取得了交易经验之后才进入投资。前者则在实战中亏损累累碰了一鼻子灰,而后者往往拿着前者的经验杀进去功成名就。
没有人看见成功者背后的汗水和付出,我们看到的往往是成功者怀里的鲜花、财富和美女。我们不断渴望自己就是一粒幸运的春天的种子,浅浅地撒在土壤里,立即迎来和风细雨,在阳光雨露的沐浴下,一夜之间成长为参天大树。
可惜的是,穷人的梦想最容易破灭,种子只有几粒,撒播的又浅,一阵意想不到的风刮过来,一只流浪的饥饿的老鼠,就很容易把你财富的种子给挖了去。
在大自然,有一个神奇的“竹子生长理论”。当毛竹还在笋期的时候,遇到雨就生长,但是等到长成竹时,就三五年不长了。
三五年之后,竹子会突然发力,以惊人的速度生长,在夜深人静时人会听到竹子拔节的声音,其成长速度是每天两英尺。
竹子之所以三五年不长,是因为它那几年间,它的根部在地下发疯似的疯长,它的根系最长可以铺几里,在方圆几平方公里的土地上,竹子可以轻而易举地获取自己需要的营养和雨水。
无论是在山上还是其他地方,我们很少看到竹子有枯死的。其实,我们每个人在投资,在创业的时候,都一一根竹子,我们需要自己心平气和,需要自己来努力扩展自己的“根系”,来等待突然发力的那一天。
而在投资市场,先认真地模拟,再认真地用少量钱来实战,就是珍惜你的钱,就是在拓展你的“根”。
不管是新的投资者,还是老投资者遇到了市场中的新的交易品种,或者是你已经在亏损里挣扎不出来了,那不妨去停止“生长”,先去叩富简投平台做做模拟,有了经验,有了信心,有了丰富而发达的“根部”之后,再去发力,成功或许伸手可得。