机器之心报道

项目作者:wangshub 机器之心编辑部

2020 年的股票市场常人难以预测,那么人工智能可以做到吗?

受新冠疫情和油价下跌的影响,近期的全球股市就像过山车一样刺激。

是时候抄底了?强化学习炒股,走向人生巅峰(或倾家荡产)

3 月上旬,美国道琼斯指数出现了下跌熔断。伯克希尔哈撒韦 CEO 巴菲特的言论让世人惊恐。

「如果你坚持足够长的时间,你将在市场中目睹所有可能的情况,」3 月 8 日,沃伦·巴菲特在接受采访时说道。「但这可能是我 89 年人生以来第一次经历这样的事。但如果一个市场是即时运行的,它就会对新闻产生很大反应。」

在当时,巴菲特认为市场还没有出现 2008 年或是 1987 年那样的恐慌,但今年的三月对于所有投资者来说注定是一段前所未有的经历——很快,美股又经历了多次下跌熔断。

前所未有的情况或许也意味着绝无仅有的机会,对于想要致富的我们来说,大胆抄底成为了一种选择。

是时候抄底了?强化学习炒股,走向人生巅峰(或倾家荡产)

但剧情发展到这里一般是这样:一番错误操作后,结果惨不忍睹,第一次买股票就被股市一段暴打。

痛定思痛,我们应该换一个思路:既然都是机器学习开发者,为什么不用深度强化学习来自动模拟炒股?实验验证一下能否获得收益。

已有人对此进行了尝试。该项目的作者是一名来自哈尔滨工业大学的在读博士,同时也是一家创业公司的合伙人。

是时候抄底了?强化学习炒股,走向人生巅峰(或倾家荡产)

作者之前还做过很多有趣的项目,比如「微信跳一跳 Python 辅助」,以及 Python 抖音机器人,用它在抖音上找到漂亮的小姐姐(就真的还挺实用的)。

作者主页:https://github.com/wangshub

效果展示

以 1990 年年初到去年 11 月底的股票数据作为训练集,去年 12 月股票数据作为测试集。作者先用单只股票试验了一下,初始本金为 10000 元人民币(股票代码 sh.600036,招商银行),进行了为期 20 天的模拟操作,经历了一番起伏,最终盈利 400 元。

是时候抄底了?强化学习炒股,走向人生巅峰(或倾家荡产)

在进行单只股票试验之后,作者选取 1002 只股票进行训练,结果显示盈利率为 44.5%,不亏不赚率为 46.5%,亏损率为 9.0%。仅从盈亏率来看,效果还是不错的。

是时候抄底了?强化学习炒股,走向人生巅峰(或倾家荡产)

是时候抄底了?强化学习炒股,走向人生巅峰(或倾家荡产)

当然,作者也说了,「数据和方法皆来源于网络,无法保证有效性」,只能说是辅助决策的方法吧,Just For Fun,如果产生了什么后果,还是得自己默默承受……机器之心友情提示,股市有风险,投资需谨慎。盲目乱投资,亲人两行泪。

项目实测

所以说如何使用深度强化学习自动炒股呢?首先我们将本项目克隆到本地,并安装相关依赖环境:

    !git clone https://github.com/wangshub/RL-Stock  
    import os  
    os.chdir('RL-Stock')  
    !pip install -r requirements.txt

项目作者使用证券宝来获取股票证券交易数据。证券宝是一个免费、开源的证券数据平台,里面包含大量准确、完整的证券历史行情数据、上市公司财务数据,用户可通过通过 python API 获取其数据信息。安装方式如下:

    !pip install baostock -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn (http://pypi.tuna.tsinghua.edu.cn/)

之后使用作者提供的数据获取代码来获取股票数据:

    !python get_stock_data.py

由于数据集相对较大,涵盖了过去将近 30 年的股票证券交易数据,所以这一过程相对比较耗时。

最后,运行项目中的 main.py 即可对该股票交易环境进行训练或测试。测试效果如下:

是时候抄底了?强化学习炒股,走向人生巅峰(或倾家荡产)

以下为本项目核心代码:

    import pandas as pd  
    from stable_baselines.common.policies import MlpPolicy  
    from stable_baselines.common.vec_env import DummyVecEnv  
    from stable_baselines import PPO2  
    from rlenv.StockTradingEnv0 import StockTradingEnv  

    def stock_trade(stock_file):  
        day_profits = []  
        df = pd.read_csv(stock_file)  
        df = df.sort_values('date')  

        # The algorithms require a vectorized environment to run  
        env = DummyVecEnv([lambda: StockTradingEnv(df)])  

        model = PPO2(MlpPolicy, env, verbose=0, tensorboard_log='./log')  
        model.learn(total_timesteps=int(1e4))  

        df_test = pd.read_csv(stock_file.replace('train', 'test'))  

        env = DummyVecEnv([lambda: StockTradingEnv(df_test)])  
        obs = env.reset()  
        for i in range(len(df_test) - 1):  
            action, _states = model.predict(obs)  
            obs, rewards, done, info = env.step(action)  
            profit = env.render()  
            day_profits.append(profit)  
            if done:  
                break  
        return day_profits

从以上代码可以看到,作者首先使用 pandas 读取股票证券交易数据,之后将其输入 RL 环境中。这里使用的股票交易的 Gym 环境参考了 Stock-Trading-Environment 这一开源实现,我们仅需将获取到的数据输入该环境中,即能得到可直接用于 RL 进行训练的标准 Gym 环境 API。

项目使用的 RL 策略调用了 stable-baselines 中的 PPO 实现。stable-baselines 使用 TensorFlow 作为后端,提供了一系列优质的 RL 算法实现。使用时仅需将 RL 环境传入其中,再调用 model.learn() 即可开始对 agent 进行训练。无论是科研还是工程用途都不失为一个不错的选择。

stable-baselines 官方主页:

https://stable-baselines.readthedocs.io/en/master/index.html

PPO 简介

PPO 算法的全称是 Proximal Policy Optimization (近端策略优化),是 OpenAI 在 2017 年发布的一种强化学习算法。该算法的实现和调参十分简单,在强化学习中的表现优于当时所有顶尖算法的水平,因此被 OpenAI 作为强化学习研究中的首选算法。

PPO 是策略梯度的一种改进算法,可以让我们在复杂和具有挑战性的环境中训练 AI 策略。策略梯度算法对步长十分敏感,但是又难以选择合适的步长,在训练过程中新旧策略的的变化差异如果过大则不利于学习。

PPO 提出了新的目标函数,可以在多个训练步骤中实现小批量的更新,解决了策略梯度算法中步长难以确定的问题。其实 TRPO 也是为了解决这个问题,但是相比之下,PPO 算法更容易求解。

PPO 的目标函数如下:

是时候抄底了?强化学习炒股,走向人生巅峰(或倾家荡产)

是时候抄底了?强化学习炒股,走向人生巅峰(或倾家荡产)

PPO 算法在强化学习中有着广泛的应用,如 OpenAI 的 Dota2 智能体、腾讯王者荣耀智能体绝悟等都使用了这项技术。

可以看到,本项目并不涉及很深奥的数学知识,使用的训练环境与 RL 算法也均为其他开源实现,核心代码不超过 10 行,却有着不错的效果。在工程实现上,有的时候一个好的创意或许要比复杂的代码实现重要。

本 文为机器之心报道, **转载请联系本公众号获得授权 。**

✄------------------------------------------------ 加入机器之心(全职记者 / 实习生): hr@jiqizhixin.com 投稿或寻求报道:content @jiqizhixin.com 广告 & 商务合作: bd@jiqizhixin.com

来源链接:mp.weixin.qq.com