如何用深度強(qiáng)化學(xué)習(xí)自動(dòng)炒股

向AI轉(zhuǎn)型的程序員都關(guān)注了這個(gè)號(hào)??????
人工智能大數(shù)據(jù)與深度學(xué)習(xí) 公眾號(hào):datayx
深度學(xué)習(xí)技術(shù)在股票交易上的應(yīng)用研究調(diào)查
http://gregharris.info/a-survey-of-deep-learning-techniques-applied-to-trading/
文中縮寫(xiě):
DBN = 深度信念網(wǎng)絡(luò)
LSTM = 長(zhǎng)短期記憶網(wǎng)絡(luò)
MLP = 多層感知器
RBM = 受限玻爾茲曼機(jī)
ReLU = 修正線性單元
CNN = 卷積神經(jīng)網(wǎng)絡(luò)
限價(jià)委托單薄模型(Limit Order Book Modeling)
Sirignano(2016)提出一種預(yù)測(cè)限價(jià)委托單薄變化的方法。他開(kāi)發(fā)了一個(gè)「空間神經(jīng)網(wǎng)絡(luò)(spatial neural network)」,該網(wǎng)絡(luò)可以利用局部空間結(jié)構(gòu)的優(yōu)勢(shì),比標(biāo)準(zhǔn)的神經(jīng)網(wǎng)絡(luò)更具可解釋性、也更具計(jì)算效率。他模擬了在下一狀態(tài)變化時(shí)最好的出價(jià)和要價(jià)。
架構(gòu):每個(gè)神經(jīng)網(wǎng)絡(luò)有 4 層。標(biāo)準(zhǔn)的神經(jīng)網(wǎng)絡(luò)每個(gè)隱藏層有 250 個(gè)神經(jīng)元,而該空間神經(jīng)網(wǎng)絡(luò)有 50 個(gè)。他在隱藏層神經(jīng)元上使用雙曲正切激活函數(shù)。
訓(xùn)練:他在 2014 年至 2015 年的 489 支股票的委托單薄上訓(xùn)練并測(cè)試了該網(wǎng)絡(luò)(每支股票有一個(gè)單獨(dú)的模型)。他使用了來(lái)自納斯達(dá)克的 Level III 限價(jià)委托單薄數(shù)據(jù),這些數(shù)據(jù)有著納秒級(jí)別的十進(jìn)制精度。訓(xùn)練包括了 50 TB 的數(shù)據(jù),并且使用了 50 個(gè) GPU 組成的集群。他總結(jié)了 200 個(gè)特征:現(xiàn)價(jià)委托單薄在首個(gè) 50 非零買(mǎi)入和賣(mài)出(bid/ask)水平的價(jià)格和大小。他使用 dropout 防止過(guò)擬合,并在每個(gè)隱藏層之間使用批規(guī)范化( batch normalization)來(lái)防止內(nèi)部的協(xié)變量轉(zhuǎn)變(covariate shift)。最后,使用 RMSProp 算法完成訓(xùn)練。RMSProp 類(lèi)似于帶有動(dòng)量的隨機(jī)梯度下降,但它通過(guò)一個(gè)過(guò)去梯度的移動(dòng)平均(running average)對(duì)梯度進(jìn)行規(guī)范化。他使用了一個(gè)自適應(yīng)學(xué)習(xí)速率——在任何時(shí)候,當(dāng)訓(xùn)練錯(cuò)誤率隨著訓(xùn)練時(shí)間增加時(shí),這個(gè)學(xué)習(xí)速率就會(huì)按一定的常數(shù)因子下降。他使用一個(gè)被一個(gè)驗(yàn)證集強(qiáng)加的提前停止(early stopping)來(lái)減少過(guò)擬合。在訓(xùn)練時(shí)為了減少過(guò)擬合,他也用了一個(gè) l^2 懲罰機(jī)制。
結(jié)果:他的結(jié)果顯示限價(jià)委托單薄展現(xiàn)出了一定程度的局部空間結(jié)構(gòu)。他能提前 1 秒預(yù)測(cè)委托單薄,也能預(yù)測(cè)下一次買(mǎi)入/賣(mài)出變化的時(shí)候。這一空間神經(jīng)網(wǎng)絡(luò)超過(guò)了標(biāo)準(zhǔn)的神經(jīng)網(wǎng)絡(luò)和沒(méi)有線性特征的邏輯回歸。這兩種神經(jīng)網(wǎng)絡(luò)都比邏輯回歸的錯(cuò)誤率低 10%。
基于價(jià)格的分類(lèi)模型
1.Dixon 等人(2016)使用一個(gè)深度神經(jīng)網(wǎng)絡(luò)預(yù)測(cè) 43 種大宗商品和外匯期貨在接下來(lái) 5 分鐘的價(jià)格變化。
架構(gòu):他們的輸入層有 9896 個(gè)神經(jīng)元,輸入由滯后的價(jià)格差別和合同間的協(xié)動(dòng)構(gòu)成的特征。網(wǎng)絡(luò)中有 5 層學(xué)習(xí)到的全連接層。4 個(gè)隱藏層中的第一層有 1000 個(gè)神經(jīng)元,而且后面的每層逐次減少 100 個(gè)神經(jīng)元。輸出層有 129 個(gè)神經(jīng)元(每一類(lèi) {-1,0,1} 對(duì)應(yīng) 3 個(gè)神經(jīng)元,乘以 43 個(gè)合同)。
訓(xùn)練:他們使用標(biāo)準(zhǔn)的帶有隨機(jī)梯度下降的反向傳播方法進(jìn)行訓(xùn)練。他們通過(guò)使用 mini-batching(依次在數(shù)個(gè)訓(xùn)練樣本上計(jì)算梯度,而非單個(gè)樣本) 加速訓(xùn)練過(guò)程。他們使用一個(gè)英特爾 Xeon Phi 協(xié)處理器進(jìn)行訓(xùn)練,而非使用英偉達(dá) GPU 。
結(jié)果:總體上,他們報(bào)告在三類(lèi)分類(lèi)上實(shí)現(xiàn)了 42% 的準(zhǔn)確率。他們做了一些前行訓(xùn)練(walk-forward training),而非傳統(tǒng)的回測(cè)(backtest)。他們的箱形圖(boxplot)展示了一些來(lái)自每一合同 mini-backtest 的普遍積極的夏普比率。他們沒(méi)有把交易成本或者交叉買(mǎi)入/賣(mài)出差價(jià)考慮在內(nèi)。他們所有的預(yù)測(cè)和特征都基于每 5 分鐘最后時(shí)刻的中間價(jià)位。
2.Takeuchi 和 Lee(2013)想要通過(guò)預(yù)測(cè)哪支股票將有比中值更高或更低的月度收益(monthly returns)來(lái)加強(qiáng)動(dòng)量效應(yīng)( momentum effect)。
架構(gòu):他們使用一個(gè)由堆棧 RBM 組成的自動(dòng)編碼器提取來(lái)自股票價(jià)格的特征,然后他們將特征送入一個(gè)前饋神經(jīng)網(wǎng)絡(luò)分類(lèi)器。每個(gè) RBM 包含由對(duì)稱(chēng)鏈(symmetric links)連接的可見(jiàn)單位層和隱藏單位層。第一層有 33 個(gè)單位,用于輸入來(lái)自某個(gè)時(shí)候一支股票的特征。對(duì)每個(gè)月 t 而言,特征包括 t-2 月到 t-13 月 12 個(gè)月份的特征,以及對(duì)應(yīng) t 月的近似 20 天的回報(bào)。他們通過(guò)計(jì)算關(guān)于所有股票每個(gè)月或每天的橫切面(cross-section)的 z-得分,正則化每個(gè)回報(bào)特征。編碼器最終層的隱藏單位的數(shù)量急劇縮減,強(qiáng)迫降維。輸出層有 2 個(gè)單位,對(duì)應(yīng)股票是否低于或高于月度收益的中間值。最終層的大小依次為 33-40-4-50-2。
訓(xùn)練:在預(yù)訓(xùn)練期間,他們將數(shù)據(jù)集分割成更小的、非重疊性的 mini-batches。然后,他們展開(kāi) RBM 形成一個(gè)編碼解碼器,使用反向傳播對(duì)其進(jìn)行精調(diào)。他們考慮了所有在 NYSE、AMEX 或納斯達(dá)克上交易的價(jià)格高于 5 美元的股票。他們?cè)?1965 年至 1989 年的數(shù)據(jù)上進(jìn)行訓(xùn)練(848,000 支股票的每月樣本),并在 1999 年至 2009 年的數(shù)據(jù)上進(jìn)行測(cè)試(924,300 支股票的每月樣本)。一些訓(xùn)練數(shù)據(jù)被保留,作為層的數(shù)量和每層單位的數(shù)量的驗(yàn)證。
結(jié)果:他們總體的準(zhǔn)確率大約是 53%。但他們考慮到預(yù)測(cè)前面十分之一股票和后面十分之一股票之間的差別時(shí),他們得到每月 3.35% 的收益,或者每年 45.93% 的收益。
3.Batres Estrada(2015)預(yù)測(cè)哪個(gè)標(biāo)準(zhǔn)普爾 500 指數(shù)的股票在哪天將有高于中值的回報(bào),而且他的研究看起來(lái)受到了 Takeuchi 和 Lee(2013)論文的影響。
架構(gòu):他使用一個(gè) 3 層 DBN 結(jié)合到一個(gè) MLP。在每個(gè)隱層有 400 個(gè)神經(jīng)元,而且他使用到了 S 形激活函數(shù)。輸出層是一個(gè)帶有兩個(gè)輸出神經(jīng)元的 Softmax 層,進(jìn)行的是二元分類(lèi)(中值之上或之下)。DBN 由堆棧 RBM 組成,每個(gè)進(jìn)行連續(xù)的訓(xùn)練。
訓(xùn)練:他首先預(yù)訓(xùn)練了 DBN 模塊,然后使用反向傳播精調(diào)整個(gè) DBN-MLP。輸入包括 33 個(gè)特征:t-2 至 t-13 月的月度對(duì)數(shù)收益率,20 支股票在 t 月的每日對(duì)數(shù)收益率,以及元月效應(yīng)的指示變量。這些特征使用每個(gè)時(shí)間段的 Z 得分進(jìn)行正則化。他使用了 1985 年至 2006 年的標(biāo)準(zhǔn)普爾 500 指數(shù)數(shù)據(jù)集,并按 70%、15% 和 15% 的比例分開(kāi)分別用作訓(xùn)練、驗(yàn)證和測(cè)試。他使用驗(yàn)證數(shù)據(jù)選擇層數(shù)、神經(jīng)元數(shù)和正則化參數(shù),也是使用 early-stopping 防止過(guò)擬合。
結(jié)果:他的模型有 53% 的準(zhǔn)確率,超過(guò)了正則化邏輯回歸以及一些 MLP 基線。
4.Sharang 和 Rao(2015)使用一個(gè)在技術(shù)指標(biāo)上訓(xùn)練的 DBN 交易一系列美國(guó)中期國(guó)債期貨。
架構(gòu):他們使用一個(gè)包含 2 個(gè)堆棧 RBM 的 DBN。第一個(gè) RBM 是 Gaussian - Bernoulli(15 個(gè)節(jié)點(diǎn)),第二個(gè) RBM 是 Bernoulli(20 節(jié)點(diǎn))。DBN 產(chǎn)生隱藏的特征,他們嘗試將這些特征輸入進(jìn) 3 個(gè)不同的分類(lèi)器:正則化邏輯回歸、支持向量機(jī)以及一個(gè)有 2 個(gè)隱層的神經(jīng)網(wǎng)絡(luò)。他們預(yù)測(cè)如果 5 天內(nèi)投資組合上升則結(jié)果是 1,反之是 -1。
訓(xùn)練:他們使用一個(gè)對(duì)比差異算法訓(xùn)練 DBN。他們基于開(kāi)倉(cāng)、走高、走低、收盤(pán)利益和體量數(shù)據(jù)計(jì)算信號(hào),這些數(shù)據(jù)最早的是 1985 年的,2008 年金融危機(jī)期間的一些點(diǎn)被移除了。他們使用 20 個(gè)特征:在不同時(shí)間段計(jì)算得到的「日常趨勢(shì)」,然后進(jìn)行規(guī)范化。所有的參數(shù)使用一個(gè)驗(yàn)證數(shù)據(jù)集進(jìn)行選擇。當(dāng)訓(xùn)練神經(jīng)網(wǎng)絡(luò)分類(lèi)器時(shí),他們提到在 mini-batch 梯度下降訓(xùn)練期間使用一個(gè)動(dòng)量參數(shù)將每次更新的系數(shù)收縮到一半。
結(jié)果:使用 PCA 構(gòu)建的投資組合對(duì)第一主成分沒(méi)有什么影響。這種投資組合是對(duì)工具的人工延展,所以真正的交易是在 ZF 和 ZN 合同之間的差價(jià)完成的。所有的輸入價(jià)格是中間價(jià),意味著買(mǎi)賣(mài)差價(jià)被忽略了。結(jié)果看起來(lái)是有益的,三種分類(lèi)模型的準(zhǔn)確率比隨機(jī)預(yù)測(cè)器高 5%-10%。
5.Zhu 等人(2016)使用震蕩箱理論( oscillation box theory)基于 DBN 做交易決策。震蕩箱理論表示,一個(gè)股票價(jià)格將在某個(gè)時(shí)間段在固定范圍內(nèi)震蕩。如果價(jià)格超出了這個(gè)范圍,然后它就進(jìn)入了一個(gè)新的震蕩箱。作者想要預(yù)測(cè)震蕩箱的邊界。他們的交易策略是當(dāng)價(jià)格超出了上邊界則買(mǎi)入股票,它低于下邊界時(shí)則賣(mài)出股票。
架構(gòu):他們使用一個(gè)由堆棧 RBM 構(gòu)成的 DBN 以及一個(gè)最后的反向傳播層。
訓(xùn)練:他們使用 block Gibbs sampling (塊吉布斯采樣)方法以一種無(wú)監(jiān)督的方式貪婪地訓(xùn)練從低到高的每一層。然后,以監(jiān)督方式訓(xùn)練反向傳播層,它將精調(diào)整個(gè)模型。他們選擇標(biāo)準(zhǔn)普爾 500 指數(shù)中的 400 支股票進(jìn)行測(cè)試,而且測(cè)試集覆蓋 2004 到 2005 年間的 400 天。他們使用了開(kāi)倉(cāng)、走高、走低、收盤(pán)價(jià)格,還有技術(shù)分析指標(biāo),作為全部的 14 個(gè)模型輸入。一些指標(biāo)通過(guò)使用灰色關(guān)聯(lián)分析(gray relation analysis)或灰色關(guān)聯(lián)度在預(yù)測(cè)中更具影響。
結(jié)果:在他們的交易策略中,每筆交易收取 0.5% 的交易成本,并為 stop-loss 和交易率增加了一些參數(shù)。我并未完全理解結(jié)果圖,但報(bào)告稱(chēng)有極大的收益。
基于文本的分類(lèi)模型
1.R?nnqvist 和 Sarlin (2016) 使用新聞文章來(lái)預(yù)測(cè)銀行危機(jī)。具體來(lái)說(shuō),他們創(chuàng)造了一種分類(lèi)器來(lái)評(píng)價(jià)一個(gè)給定的句子是否暗示了危機(jī)(distress)或安寧(tranquility)。
架構(gòu):他們?cè)谶@篇論文中使用了兩個(gè)神經(jīng)網(wǎng)絡(luò)。第一個(gè)用于語(yǔ)義的預(yù)訓(xùn)練,以減少維度。為了做到這一點(diǎn),他們?cè)谖谋旧线\(yùn)行一個(gè)滑動(dòng)窗口(sliding window),該窗口會(huì)取出一個(gè)包含 5 個(gè)詞的序列然后學(xué)習(xí)預(yù)測(cè)下一個(gè)詞。他們使用了一種前饋拓?fù)洌╢eed-forward topology),其中一旦學(xué)習(xí)到了連接權(quán)重,中間的投射層(projection layer)就會(huì)提供語(yǔ)義向量。他們也將句子的 ID 包括到了該模型的輸入中,以提供上下文語(yǔ)境和預(yù)測(cè)下一個(gè)詞的信息。他們使用了二進(jìn)制霍夫曼編碼(binary Huffman coding)將句子 ID 和 詞映射到輸入層中的激活模式(activation pattern),這能依據(jù)頻率粗糙地對(duì)詞進(jìn)行組織。他們說(shuō)帶有固定上下文大小的前饋拓?fù)湓诰渥有蛄械慕I媳妊h(huán)神經(jīng)網(wǎng)絡(luò)更加高效。他們沒(méi)有使用百萬(wàn)計(jì)的輸入(一個(gè)詞一個(gè)輸入),而是使用了來(lái)自已經(jīng)學(xué)到的語(yǔ)義模型的 600 個(gè)輸入。其第一層有 600 個(gè)節(jié)點(diǎn) ,中間層有 50 個(gè)修正線性隱藏節(jié)點(diǎn),而輸出層有兩個(gè)節(jié)點(diǎn)(危機(jī)/安寧)。
訓(xùn)練:他們的訓(xùn)練使用了在 2007-2009 年金融危機(jī)中在 101 家銀行上觀察到的 243 個(gè)危機(jī)事件。他們使用了 71.6 萬(wàn)個(gè)提及銀行的句子,這些句子選自危機(jī)期間或之后路透社(Reuters)的 660 萬(wàn)篇新聞文章。
結(jié)果:他們使用一種自定義的「有用性(Usefulness)」度量來(lái)評(píng)估他們的分類(lèi)模型。評(píng)估通過(guò)交叉驗(yàn)證完成,并為每一個(gè)分類(lèi)都分配了 N 家銀行。他們將危機(jī)的數(shù)量聚集到了不同的時(shí)間序列,但卻沒(méi)有繼續(xù)深入去考慮創(chuàng)造一種交易策略。
2.Fehrer 和 Feuerriegel (2015)訓(xùn)練了一個(gè)基于新聞?lì)^條預(yù)測(cè)德國(guó)股票收益的模型。
架構(gòu):他們使用了一種遞歸自編碼器,在每一個(gè)自編碼器上都有一個(gè)用于估計(jì)概率的附加 softmax 層。他們執(zhí)行了三類(lèi)預(yù)測(cè) {-1, 0, 1} 來(lái)預(yù)測(cè)下一天與新聞?lì)^條相關(guān)的股票的收益。
訓(xùn)練:他們使用高斯噪聲(aussian noise)對(duì)權(quán)重進(jìn)行了初始化,然后通過(guò)反向傳播進(jìn)行更新。他們使用了一個(gè)英語(yǔ)的 ad-hoc 新聞發(fā)布數(shù)據(jù)集,其覆蓋了 2004-2011 年之間關(guān)于德國(guó)市場(chǎng)的 8359 個(gè)頭條新聞。
結(jié)果:他們的遞歸自編碼器有 56% 的準(zhǔn)確度,這比更傳統(tǒng)的隨機(jī)森林建模方法 53% 的準(zhǔn)確度更好。他們沒(méi)有開(kāi)發(fā)交易策略,公開(kāi)發(fā)布了一個(gè)他們的代碼 Java 實(shí)施系統(tǒng)。
3.Ding 等人 (2015) 使用從新聞?lì)^條中提取出的結(jié)構(gòu)化信息預(yù)測(cè)每天標(biāo)準(zhǔn)普爾 500 指數(shù)的運(yùn)動(dòng)。他們使用 OpenIE 處理頭條來(lái)獲取結(jié)構(gòu)化的時(shí)間表征(執(zhí)行器、動(dòng)作、對(duì)象、時(shí)間)。他們使用一個(gè)神經(jīng)張量網(wǎng)絡(luò)通過(guò)成倍地結(jié)合事件參數(shù)(event argument)來(lái)學(xué)習(xí)它們的語(yǔ)義組合性(semantic compositionality),而不是像標(biāo)準(zhǔn)神經(jīng)網(wǎng)絡(luò)那樣只是絕對(duì)量地學(xué)習(xí)。
架構(gòu):他們結(jié)合了短期和長(zhǎng)期的事件影響,使用了一個(gè) CNN 來(lái)執(zhí)行輸入事件序列的語(yǔ)義組合。他們?cè)诰矸e層之上使用了一個(gè)最大池化層,這讓該網(wǎng)絡(luò)可以?xún)H保留由卷積層生成的最有用的特征。他們有一個(gè)單獨(dú)用于長(zhǎng)期和中期事件的卷積層。這兩個(gè)層與用于短期事件的輸入層一起將信息饋送到一個(gè)隱藏層,然后再饋送到兩個(gè)輸出節(jié)點(diǎn)。
訓(xùn)練:他們從路透社和彭博社的新聞里提取出了 1000 萬(wàn)個(gè)事件。為了進(jìn)行訓(xùn)練,他們使用隨機(jī)參數(shù)替換事件參數(shù)的方式來(lái)制造虛假的事件。在訓(xùn)練過(guò)程中,他們假設(shè)真實(shí)事件應(yīng)該比受損的事件得分更高。當(dāng)情況不是這樣時(shí),就更新模型的參數(shù)。
結(jié)果:他們發(fā)現(xiàn)結(jié)構(gòu)化事件是比預(yù)測(cè)股市的詞更好的特征。他們的方法的效果比基準(zhǔn)方法好 6%。他們預(yù)測(cè)了 S&P 500 指數(shù)和 15 支股票的情況,他們給出的表說(shuō)明他們可以以 65% 的準(zhǔn)確度預(yù)測(cè)標(biāo)準(zhǔn)普爾 500 指數(shù)。
波動(dòng)預(yù)測(cè)
1.Xiong 等人 (2015)通過(guò)對(duì)開(kāi)盤(pán)價(jià)、走高、走低和收盤(pán)價(jià)的估計(jì)來(lái)預(yù)測(cè)標(biāo)準(zhǔn)普爾 500 指數(shù)的日常波動(dòng)。
架構(gòu):他們使用了一個(gè)包含一個(gè) LSTM 模塊的單一 LSTM 隱藏層。他們使用每日的標(biāo)準(zhǔn)普爾 500 指數(shù)的收益和波動(dòng)作為輸入。他們還囊括了 25 個(gè)國(guó)內(nèi)的谷歌趨勢(shì),覆蓋了行業(yè)和經(jīng)濟(jì)的主要領(lǐng)域。
訓(xùn)練:他們使用了每次批處理(batch)帶有 32 個(gè)采樣器的 Adam 方法,并使用平均絕對(duì)百分誤差(MAPE)作為目標(biāo)損失函數(shù)。他們?cè)O(shè)置了最大的 LSTM 延遲以便涵蓋 10 個(gè)連續(xù)的觀察。
結(jié)果:結(jié)果表明他們的 LSTM 方法比 GARCH、Ridge 和 LASSO 技術(shù)的效果都好。
投資組合優(yōu)化
Heaton 等人(2016) 嘗試創(chuàng)造一種優(yōu)于生物技術(shù)指數(shù) IBB 的投資組合。他們有一個(gè)目標(biāo):追蹤少數(shù)股票和低驗(yàn)證誤差的指數(shù)。他們也嘗試在大規(guī)模下跌(drawdown)期間通過(guò)反相關(guān)(anti-correlated)來(lái)跑在指數(shù)的前面。他們沒(méi)有直接對(duì)協(xié)方差矩陣建模,而是在深度架構(gòu)擬合程序中進(jìn)行訓(xùn)練,其允許出現(xiàn)非線性。
架構(gòu):他們使用了帶有正則化和 ReLU 的自動(dòng)編碼。他們的自動(dòng)編碼器有一個(gè)帶有 5 個(gè)神經(jīng)元的隱藏層。
訓(xùn)練:他們使用了 2012-2016 年 IBB 成份股的每周收益數(shù)據(jù)。他們自動(dòng)編碼了該指數(shù)中的所有股票,并評(píng)估了每只股票和它的自動(dòng)編碼的版本之間的不同之處。他們也關(guān)注了數(shù)量不斷變化的其它股票,該數(shù)量是通過(guò)交叉驗(yàn)證選擇的。
結(jié)果:他們發(fā)現(xiàn)追蹤誤差是包括在投資組合中的股票數(shù)量的函數(shù),但似乎并沒(méi)有和傳統(tǒng)的方法進(jìn)行比較。他們也使用正收益替代了指數(shù)下跌,并找到了追蹤這種修改過(guò)的指數(shù)的投資組合。
?? 初衷
最近一段時(shí)間,受到新冠疫情的影響,股市接連下跌,作為一棵小白菜兼小韭菜,竟然產(chǎn)生了抄底的大膽想法,拿出僅存的一點(diǎn)私房錢(qián)梭哈了一把。
第二天,暴跌,俺加倉(cāng)
第三天,又跌,俺加倉(cāng)
第三天,又跌,俺又加倉(cāng)...

一番錯(cuò)誤操作后,結(jié)果慘不忍睹,第一次買(mǎi)股票就被股市一段暴打,受到了媳婦無(wú)情的嘲諷。痛定思痛,俺決定換一個(gè)思路:如何用深度強(qiáng)化學(xué)習(xí)來(lái)自動(dòng)模擬炒股? 實(shí)驗(yàn)驗(yàn)證一下能否獲得收益。
代碼 獲取方式:
分享本文到朋友圈
關(guān)注微信公眾號(hào) datayx 然后回復(fù) 炒股 即可獲取。
AI項(xiàng)目體驗(yàn)地址 https://loveai.tech
單肩包/雙肩包/斜挎包/手提包/胸包/旅行包/上課書(shū)包 /個(gè)性布袋等各式包飾挑選
https://shop585613237.taobao.com/
?? 監(jiān)督學(xué)習(xí)與強(qiáng)化學(xué)習(xí)的區(qū)別
監(jiān)督學(xué)習(xí)(如 LSTM)可以根據(jù)各種歷史數(shù)據(jù)來(lái)預(yù)測(cè)未來(lái)的股票的價(jià)格,判斷股票是漲還是跌,幫助人做決策。

而強(qiáng)化學(xué)習(xí)是機(jī)器學(xué)習(xí)的另一個(gè)分支,在決策的時(shí)候采取合適的行動(dòng) (Action) 使最后的獎(jiǎng)勵(lì)最大化。與監(jiān)督學(xué)習(xí)預(yù)測(cè)未來(lái)的數(shù)值不同,強(qiáng)化學(xué)習(xí)根據(jù)輸入的狀態(tài)(如當(dāng)日開(kāi)盤(pán)價(jià)、收盤(pán)價(jià)等),輸出系列動(dòng)作(例如:買(mǎi)進(jìn)、持有、賣(mài)出),使得最后的收益最大化,實(shí)現(xiàn)自動(dòng)交易。

?? OpenAI Gym 股票交易環(huán)境
觀測(cè) Observation
策略網(wǎng)絡(luò)觀測(cè)的就是一只股票的各項(xiàng)參數(shù),比如開(kāi)盤(pán)價(jià)、收盤(pán)價(jià)、成交數(shù)量等。部分?jǐn)?shù)值會(huì)是一個(gè)很大的數(shù)值,比如成交金額或者成交量,有可能百萬(wàn)、千萬(wàn)乃至更大,為了訓(xùn)練時(shí)網(wǎng)絡(luò)收斂,觀測(cè)的狀態(tài)數(shù)據(jù)輸入時(shí),必須要進(jìn)行歸一化,變換到 [-1, 1] 的區(qū)間內(nèi)。
| 參數(shù)名稱(chēng) | 參數(shù)描述 | 說(shuō)明 |
|---|---|---|
| date | 交易所行情日期 | 格式:YYYY-MM-DD |
| code | 證券代碼 | 格式:sh.600000。sh:上海,sz:深圳 |
| open | 今開(kāi)盤(pán)價(jià)格 | 精度:小數(shù)點(diǎn)后4位;單位:人民幣元 |
| high | 最高價(jià) | 精度:小數(shù)點(diǎn)后4位;單位:人民幣元 |
| low | 最低價(jià) | 精度:小數(shù)點(diǎn)后4位;單位:人民幣元 |
| close | 今收盤(pán)價(jià) | 精度:小數(shù)點(diǎn)后4位;單位:人民幣元 |
| preclose | 昨日收盤(pán)價(jià) | 精度:小數(shù)點(diǎn)后4位;單位:人民幣元 |
| volume | 成交數(shù)量 | 單位:股 |
| amount | 成交金額 | 精度:小數(shù)點(diǎn)后4位;單位:人民幣元 |
| adjustflag | 復(fù)權(quán)狀態(tài) | 不復(fù)權(quán)、前復(fù)權(quán)、后復(fù)權(quán) |
| turn | 換手率 | 精度:小數(shù)點(diǎn)后6位;單位:% |
| tradestatus | 交易狀態(tài) | 1:正常交易 0:停牌 |
| pctChg | 漲跌幅(百分比) | 精度:小數(shù)點(diǎn)后6位 |
| peTTM | 滾動(dòng)市盈率 | 精度:小數(shù)點(diǎn)后6位 |
| psTTM | 滾動(dòng)市銷(xiāo)率 | 精度:小數(shù)點(diǎn)后6位 |
| pcfNcfTTM | 滾動(dòng)市現(xiàn)率 | 精度:小數(shù)點(diǎn)后6位 |
| pbMRQ | 市凈率 | 精度:小數(shù)點(diǎn)后6位 |
動(dòng)作 Action
假設(shè)交易共有買(mǎi)入、賣(mài)出和保持 3 種操作,定義動(dòng)作(action)為長(zhǎng)度為 2 的數(shù)組
action[0]為操作類(lèi)型;action[1]表示買(mǎi)入或賣(mài)出百分比;
動(dòng)作類(lèi)型 action[0] | 說(shuō)明 |
|---|---|
| 1 | 買(mǎi)入 action[1] |
| 2 | 賣(mài)出 action[1] |
| 3 | 保持 |
注意,當(dāng)動(dòng)作類(lèi)型 action[0] = 3 時(shí),表示不買(mǎi)也不拋售股票,此時(shí) action[1] 的值無(wú)實(shí)際意義,網(wǎng)絡(luò)在訓(xùn)練過(guò)程中,Agent 會(huì)慢慢學(xué)習(xí)到這一信息。
獎(jiǎng)勵(lì) Reward
獎(jiǎng)勵(lì)函數(shù)的設(shè)計(jì),對(duì)強(qiáng)化學(xué)習(xí)的目標(biāo)至關(guān)重要。在股票交易的環(huán)境下,最應(yīng)該關(guān)心的就是當(dāng)前的盈利情況,故用當(dāng)前的利潤(rùn)作為獎(jiǎng)勵(lì)函數(shù)。即當(dāng)前本金 + 股票價(jià)值 - 初始本金 = 利潤(rùn)。
# profits
reward = self.net_worth - INITIAL_ACCOUNT_BALANCE
reward = 1 if reward > 0 else reward = -100
為了使網(wǎng)絡(luò)更快學(xué)習(xí)到盈利的策略,當(dāng)利潤(rùn)為負(fù)值時(shí),給予網(wǎng)絡(luò)一個(gè)較大的懲罰 (-100)。
策略梯度
因?yàn)閯?dòng)作輸出的數(shù)值是連續(xù),因此使用基于策略梯度的優(yōu)化算法,其中比較知名的是 PPO 算法,OpenAI 和許多文獻(xiàn)已把 PPO 作為強(qiáng)化學(xué)習(xí)研究中首選的算法。PPO 優(yōu)化算法 Python 實(shí)現(xiàn)參考 stable-baselines。
????♀? 模擬實(shí)驗(yàn)
環(huán)境安裝
# 虛擬環(huán)境
virtualenv -p python3.6 venv
source ./venv/bin/activate
# 安裝庫(kù)依賴(lài)
pip install -r requirements.txt
股票數(shù)據(jù)獲取
股票證券數(shù)據(jù)集來(lái)自于 baostock,一個(gè)免費(fèi)、開(kāi)源的證券數(shù)據(jù)平臺(tái),提供 Python API。
>> pip install baostock -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn數(shù)據(jù)獲取代碼參考 get_stock_data.py
>> python get_stock_data.py將過(guò)去 20 多年的股票數(shù)據(jù)劃分為訓(xùn)練集,和末尾 1 個(gè)月數(shù)據(jù)作為測(cè)試集,來(lái)驗(yàn)證強(qiáng)化學(xué)習(xí)策略的有效性。劃分如下
1990-01-01 ~ 2019-11-29 | 2019-12-01 ~ 2019-12-31 |
|---|---|
| 訓(xùn)練集 | 測(cè)試集 |
驗(yàn)證結(jié)果
單只股票
初始本金
10000股票代碼:
sh.600036(招商銀行)訓(xùn)練集:
stockdata/train/sh.600036.招商銀行.csv測(cè)試集:
stockdata/test/sh.600036.招商銀行.csv模擬操作
20天,最終盈利約400

多只股票
選取 1002 只股票,進(jìn)行訓(xùn)練,共計(jì)
盈利:
44.5%不虧不賺:
46.5%虧損:
9.0%

?? 最后
股票 Gym 環(huán)境主要參考 Stock-Trading-Environment,對(duì)觀測(cè)狀態(tài)、獎(jiǎng)勵(lì)函數(shù)和訓(xùn)練集做了修改。
俺完全是股票沒(méi)入門(mén)的新手,難免存在錯(cuò)誤,歡迎指正!
數(shù)據(jù)和方法皆來(lái)源于網(wǎng)絡(luò),無(wú)法保證有效性,Just For Fun!
?? 參考資料
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"
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
notadamking/Stock-Trading-Environment
Welcome to Stable Baselines docs! - RL Baselines Made Easy
