在深度學習的世界中,無論您的模型多麼先進,沒有充分對業務充分理解和乾淨的數據都不會走得太遠。這個事實在金融領域尤其如此,在我們的數據集中,只存在股票的開盤價,最高價,最低價,調整後的收盤價和交易量的5個變量。
在第一幅圖中,不難發現這些原始數據值不足以訓練機器學習模型。高度相關的變量乍看起來似乎很有希望,但是相關係數極高的缺點是實際上沒有那麼多的信息。數據集基本上有五個數字,它們對模型說的完全相同,這使得模型很難理解允許機器學習交易者獲利的市場波動的複雜性。
數據的相關性顯示在下面的分散矩陣內,其中對角線是變量分布的估計值。
技術分析:這是一個數學工具箱,用來將嘈雜的原始金融數據轉換成可理解、清晰的信號,量化資產的動量、波動性、交易量和其他一般趨勢。幸運的是,TA是一個很棒的python庫,擁有所有這些指標,並允許對數據進行簡單的實驗。我們花費了大量時間來查找指標的不同組合,並對數據集進行自己的更改,以確保我們擁有最佳的數據集。我們可以看到將相對強度指標(RSI)(其唯一輸入為收盤價)相對於下面的原始收盤價得出了顯著結果。
但是,在數學金融領域,一個重大謬論是存在一些功能的完美組合,這些功能可以為您「預測」市場。與數據科學和機器學習中的許多方法一樣,這個工具實際上只在數據轉換階段提供幫助。這一事實在許多項目中得到了體現,因為最終您只需要相信您目前擁有的組合已經足夠好,可以讓模型學習。因此,我們確定了兩個動量指標,即經典相對強度和另一個被有趣地命名為awesome指標,以及兩個趨勢指標,移動平均收斂散度和Aroon指標。
動量指標很有用,因為它們試圖量化股票在先前價格的背景下的走勢。這可能對代理人有所幫助,因為它可以嘗試了解動量增加通常是股價可能上漲的好兆頭,並且可以自信地持有股票直到動量開始減少。另一方面,趨勢指標通常形成動量指標的超集,因為趨勢跟蹤通常涉及動量和移動平均值的計算。通常,我們嘗試獲取動量生成的不容易量化的值,並將其轉換為百分比,其中正數和負數表示各自的趨勢。這種設置將進一步幫助代理了解股票走勢的能力,並希望了解趨勢和動量都開始上升時獲利的可能性很高。
一個關鍵的發現是在我們的數據上應用了信號處理濾波器,該濾波器在固定數量的點之間插入多項式以顯著平滑數據。這是很重要的,因為我們使用的技術分析功能在本質上仍具有相當高的噪聲和連續性,因此更平滑的數據將使模型具有更清晰的信息並在環境中做出更好的決策。下圖通過顯著消除了許多容易造成模型混亂的隨機運動,證明了濾波器對開盤價的巨大平滑作用。
在特徵被挑選出來之後,還有一個預處理的關鍵操作,即對我們的數據進行標準化。儘管很容易忽略,但是忘記進行標準化會嚴重影響模型性能。更有趣的是,由於財務數字是無界的,因此沒有直接的方法來選擇如何規範化我們的數據,這與像素值介於0到255之間的圖像不同。例如,簡單的滾動窗口z得分計算可以很好地解決此問題。很好,因為z分數會將我們的所有數據轉換為大約-3到3的合理範圍。
確定輸入後,我們就進入了超參數調整和模型優化的階段。在大多數深度學習應用程式中,模型具有多個可調超參數,即我們可以指定訓練時使用的模型的變量。這些參數的變化可以說是對模型性能的最重要的結果,因為模型訓練中的關鍵時刻受這些值控制。
我們能夠了解近端策略優化(PPO)框架背後的機制,以幫助實驗,調整和改進現有模型的超參數。在此過程中,我們能夠深入了解某些超參數與代理獲得的獎勵之間的關係。這使我們能夠真正了解代理是否真正在學習。通過我們的探索,我們能夠發現我們的模型從股票交易中學到的一些有趣的見解。
為了測試不同的超參數值與模型性能之間的關係,我們決定採用科學的方法。這種方法涉及我們一次只更改一個超參數來測試代理的性能。通過確保所有其他超參數保持恆定,我們能夠找出最有效地允許我們的代理學習的每個超參數的範圍。我們還通過使用種子控制了每個試驗中訓練的數據的隨機性。這樣可以確保模型性能的任何變化都可以歸因於指定的參數,而不是其他無關的變量。
默認參數值:
『n_steps』: 1024,
『gamma』: 0.9391973108460121,
『learning_rate』: 0.0001,
『noptepochs』: 5,
『lam』: 0.8789545362092943
N_steps:此超參數告訴我們每個環境在更新模型之前要運行的步驟數。這從根本上決定了單一學習經歷對政策更新的影響程度。如果n_steps較低,則意味著該策略將不斷變化,並適應可能由隨機機會造成的經驗。因此,當模型的n_steps低時,每種學習經歷可能會對策略更改產生更大的影響。但是,與此有關的一個問題是,它可能導致相對不穩定的策略,該策略可能永遠不會收斂到最佳狀態。因此,通過調整超參數找到合適的平衡可以幫助獲得更好的代理交易性能。
Gamma:接下來,我們繼續修改伽瑪值。這是折扣因子,基本上意味著它會削弱下一個獎勵在政策上的權重。通過對此進行調整,我們可以優化新政策與舊政策之間的差異。這使我們的代理可以朝著其最大目標邁出較小的步伐,而不會受到最新經驗的過度影響。
Entropy coefficient:我們還試圖調整熵係數,該熵係數充當正則項並給策略增加隨機性。探索是強化學習中找到一個好的策略的至關重要的一點,如果策略收斂得太快,代理可能會發現自己陷入重複執行相同次優操作的局部最大值中。可以通過調整熵係數來糾正此行為,以防止過早收斂並鼓勵探索。
Lambda:Lambda是用於減少Generalized Advantage Estimator(GAE)中方差的平滑參數。GAE使用每個時間步驟的獎勵來估算採取特定行動後,代理的狀況會好轉多少。Lambda通過確保策略不會過度適應特定的狀態-操作對,幫助穩定這種學習。
關鍵發現
在運行和微調每個列出的超參數後,我們得出了一些有趣的結論。首先,較高的n_step值範圍似乎會產生更健康的獎勵和優勢曲線。這意味著,當我們的代理在更新模型之前在每個環境中採取更多步驟時,它將學習更有效的交易策略。因為當n_steps參數較高時,模型的表現似乎更好,這可能意味著最佳策略是一種策略,即交易員購買股票並持有較長時間。這可能表明,我們在交易時可以採取的最佳策略是買入一隻股票並持有它,而不是在更高的頻率上進行微交易的股票。
除了從調整n_steps超參數中獲得的一些有趣的見解外,我們還發現在我們的模型中gamma的最佳值相對較高,性能最大化可達0.99。gamma值代表折扣率,因此會影響我們根據最新經驗更新策略的程度。這個超參數在較大值上的成功意味著,在改變策略時,新體驗會得到輕微的權衡。這意味著代理只稍微優先考慮短期回報。
加入熵正則化有助於減少梯度估計中固有的噪聲。通過調整熵係數,我們發現將默認值調整到較高的0.01會導致更穩定的情節獎勵增加,並產生更健康的優勢曲線。在1e-3到1e-5的較小範圍內,我們看到熵損失迅速崩潰,這表明agent的策略過於迅速地變得確定性。相反,當熵係數過高的值(0.1 - -0.5),我們看到這一集獎勵壓扁和熵的減少損失,表明我們的代理無法學習由於高的概率熵係數是持有所有可能的行動幾乎是相同的。對於我們的代理來說,擁有一個相當高的熵係數值有助於防止由於短期市場趨勢而採取行動,因為它們並不總是轉化為長期收益。
在改變lambda超參數時,我們發現它有一個很高的最優值範圍為0.99 ~ 0.999。當lambda設置為0時,GAE就變成了一步優勢估計器,它在進行策略更新時只考慮當前狀態。這類政策有很高的偏見。另一方面,如果我們讓lambda為1,GAE成為基線蒙特卡羅估計器,它可能會受到高方差的影響。有一個較高的lambda值表明在模型中注入一些偏差對我們的代理來說是重要的,但它確實有價值的長期回報。最大的增長是當我們的代理不受市場短期波動的影響,而是專注於長期的增量收益。
在進行了充分的超參數調整後,我們能夠使用真實的市場數據生成我們的政策交易運行,每天政策可以買進、賣出或持有股票。灰色的點表示持有,黃色表示買入,綠色表示賣出。在下面的測試運行中,我們可以看到,總的來說,該政策在持有購買的資產幾天來產生一些利潤方面做得很好,但它也經歷了縮水,損失了一些利潤。這個測試運行是使用本文前面建議的超參數生成的。儘管超參數設置較強,但模型中仍存在大量波動性,這表明強模型訓練性能與實時模型結果並不完全相關。這個結果通常是金融建模中反覆出現的主題。儘管如此,我們的智能體知道除了最大化我們的目標函數,沒有其他目標,卻能夠盈利,這無疑是強化學習的一個了不起的壯舉。
總體而言,我們在這家PPO股票交易員上的工作使我們能夠深入研究最先進的強化學習研究,同時還致力於利用我們的知識來解決實際問題。儘管問題非常複雜,但是我們每個人都能夠執行最適合我們每個技能的任務,並隨後與團隊的其他成員分享我們的結果以改善模型的性能。
作者:UCLA DataRes
原文地址:https://ucladatares.medium.com/stock-market-trading-with-reinforcement-learning-df406c2c1935
deephub翻譯組