機器之心報道

項目作者: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