在本文中敷燎,我將創(chuàng)建一個預(yù)測股票價格變動的完整流程。按照我們的思路走下去侮措,我們將獲得一些非常好的結(jié)果懈叹。為此,我們將使用生成對抗網(wǎng)絡(luò)(GAN)與LSTM(一種遞歸神經(jīng)網(wǎng)絡(luò))作為生成器分扎,并使用卷積神經(jīng)網(wǎng)絡(luò)CNN作為裁決器澄成。我們使用LSTM的原因很明顯,我們正在嘗試預(yù)測時間序列數(shù)據(jù)畏吓。為什么我們使用GAN墨状,特別是CNN作為裁決器?這是一個很好的問題:稍后會有特別的部分來說明這個問題菲饼。
當然镐确,我們將詳細介紹每個步驟,但最困難的部分是GAN:成功訓(xùn)練GAN的非常困難的部分是獲得正確的超參數(shù)集。出于這個原因,我們將使用貝葉斯優(yōu)化(連同高斯過程)和深度強化學(xué)習(xí)(DRL)來決定何時以及如何改變GAN的超參數(shù)。在創(chuàng)建強化學(xué)習(xí)時褥实,我將使用該領(lǐng)域的最新進展哥艇,例如Rainbow和PPO。
我們將使用許多不同類型的輸入數(shù)據(jù)祖乳。除了股票的歷史交易數(shù)據(jù)和技術(shù)指標汁咏,我們將使用NLP的最新進展(BERT遷移學(xué)習(xí))來創(chuàng)建情緒分析(作為基本面分析的一部分),用于提取整體趨勢方向的傅立葉變換女揭,用于識別其他高級特征的棧式自編碼器抡爹,用于查找相關(guān)資產(chǎn)的特征投資組合欧穴,用于股票函數(shù)近似的自回歸積分移動平均值(ARIMA)等等,以便捕獲盡可能多的關(guān)于股票的信息调缨,模式,依賴關(guān)系等弦叶。眾所周知妇多,數(shù)據(jù)越多越好伤哺。預(yù)測股票價格變動是一項非常復(fù)雜的任務(wù),因此我們對股票的了解越多(從不同的角度來看)械巡,我們的盈利就越高芦鳍。
為了創(chuàng)建所有的神經(jīng)網(wǎng)絡(luò),我們將使用MXNet及其高級API - Gluon葛账,并在多個GPU上進行訓(xùn)練柠衅。
注意:雖然我試圖詳細了解了數(shù)學(xué)和幾乎所有算法和技術(shù)背后的機制,但本文不會明確地解釋機器/深度學(xué)習(xí)或股票市場如何運作籍琳。我們的目的是分享如何使用不同的技術(shù)和算法來準確預(yù)測股票價格變動菲宴,并且給出在每一步使用每種技術(shù)的原因和背后的理由贷祈。
目錄
1、概述
2喝峦、數(shù)據(jù)
2.1势誊、關(guān)聯(lián)資產(chǎn)
2.2、技術(shù)指標
2.3谣蠢、基本面分析
2.3.1粟耻、Transformer的雙向嵌入表示 - BERT
2.4、用于趨勢分析的傅立葉變換
2.5眉踱、ARIMA作為特征
2.6挤忙、統(tǒng)計學(xué)檢查
2.6.1、異方差性谈喳,多重共線性册烈,序列相關(guān)性
2.7、特征工程
2.7.1婿禽、特征對于XGBoost的重要性
2.8赏僧、使用棧式自編碼器提取高級特征
2.8.1、激活函數(shù) - GELU(高斯誤差)
3扭倾、生成對抗網(wǎng)絡(luò)(GAN)
3.1淀零、為什么GAN用于股市預(yù)測
3.2、Metropolis-Hastings GAN和Wasserstein GAN
3.3吆录、生成器 - 單層RNN
3.3.1窑滞、LSTM還是GRU
3.3.2琼牧、LSTM的架構(gòu)
3.3.3恢筝、學(xué)習(xí)率調(diào)度程序
3.3.4、如何防止過擬合和偏差 - 方差權(quán)衡
3.4巨坊、裁決器 - 一維CNN
3.4.1撬槽、為什么CNN可以做裁決器?
3.4.2趾撵、CNN的架構(gòu)
3.5侄柔、超參數(shù)
4、超參數(shù)優(yōu)化
4.1占调、針對超參數(shù)優(yōu)化的強化學(xué)習(xí)
4.1.1暂题、強化學(xué)習(xí)理論
4.1.1.1、Rainbow
4.1.1.2究珊、PPO
4.1.2薪者、進一步深入強化學(xué)習(xí)
4.2、貝葉斯優(yōu)化
4.2.1剿涮、高斯過程
5言津、結(jié)果
6攻人、接下來的研究內(nèi)容?
7悬槽、免責(zé)聲明
1怀吻、概述
準確預(yù)測股票市場是一項復(fù)雜的任務(wù),因為特定股票在特定方向上有數(shù)百萬個事件和前提條件初婆。因此蓬坡,我們需要能夠捕獲盡可能多的這些前提條件。我們還需要做出幾個重要假設(shè):1)市場不是100%隨機磅叛,2)歷史會重演渣窜,3)市場遵循人們的理性行為,4)市場是“完美的”宪躯。不過乔宿,請閱讀底部的免責(zé)聲明。
我們將嘗試預(yù)測高盛(紐約證券交易所代碼:GS)的價格走勢访雪。為此详瑞,我們將使用2010年1月1日至2018年12月31日的每日收盤價(訓(xùn)練數(shù)據(jù)為7年,驗證數(shù)據(jù)為2年)臣缀。
2坝橡、數(shù)據(jù)
我們需要了解影響GS的股價上漲或下跌的因素。這是人們所關(guān)心的問題精置。因此计寇,我們需要盡可能多地合并信息(從不同方面和角度描繪股票)。 (我們將使用1585天的日線數(shù)據(jù)來訓(xùn)練各種算法(我們擁有70%的訓(xùn)練數(shù)據(jù))并預(yù)測接下來的680天(測試數(shù)據(jù))脂倦。然后我們將預(yù)測結(jié)果與測試數(shù)據(jù)分類進行比較(我們將其稱為特征)在后面的章節(jié)中我們會詳細介紹番宁,我們將使用的特征包括:
關(guān)聯(lián)資產(chǎn) - 這些是其他資產(chǎn)(任何類型,不一定是股票赖阻,如商品蝶押,外匯,指數(shù)火欧,甚至固定收益證券)棋电。像高盛這樣的大公司顯然不會“生活”在一個孤立的世界中 - 它依賴于許多外部因素并與之互動,包括競爭對手苇侵,客戶赶盔,全球經(jīng)濟,地緣政治形勢榆浓,財政和貨幣政策于未,融資情況等。詳情將在后面列出。
技術(shù)指標 - 很多投資者都遵循技術(shù)指標沉眶。我們將最受歡迎的指標作為獨立特征打却。其中包括 - 7日和21日均線,指數(shù)均線谎倔,動量柳击,布林通道,MACD片习。
基本面分析 - 一個非常重要的特征捌肴,表明股票是上漲還是下跌∨河剑基本面分析有兩個方面可以為我們所用:1)使用10-K和10-Q報告分析公司業(yè)績状知,分析ROE和市盈率等(我們不會使用此報告),2)新聞 - 可能新聞可以指示可能在特定方向上移動股票的即將發(fā)生的事件孽查。我們將閱讀高盛的所有每日新聞饥悴,并提取當天對高盛的總體情緒是正面的,中立的還是負面的(我們的打分會介于0-1之間)盲再。由于許多投資者都會仔細閱讀新聞并根據(jù)新聞做出投資決策(當然不是所有人)西设,如果今天高盛的消息非常積極,那么股票將在明天激增答朋。這里的重點在于贷揽,我們將以這些特征的權(quán)重作為我們以后判斷股票趨勢的依據(jù)。稍后會詳細介紹梦碗。
為了創(chuàng)建準確的情緒預(yù)測禽绪,我們將使用神經(jīng)語言處理(NLP)。我們將使用BERT - 谷歌最近宣布的NLP方法用于情感分類股票新聞情緒提取的遷移學(xué)習(xí)洪规。
傅立葉變換 - 除了每日收盤價印屁,我們還將創(chuàng)建傅里葉變換,以概括多個長期和短期趨勢淹冰。使用這些變換库车,我們將消除大量噪聲(隨機的)并創(chuàng)建真實股票移動的近似值。趨勢近似可以幫助LSTM網(wǎng)絡(luò)更準確地選擇其預(yù)測趨勢樱拴。
自回歸整合移動平均線(ARIMA) - 這是預(yù)測時間序列數(shù)據(jù)未來值的最流行技術(shù)之一(在神經(jīng)網(wǎng)絡(luò)流行之前)。我們把它也加上洋满,看看它是否是一個重要的預(yù)測特征晶乔。
棧式自編碼器 - 經(jīng)過數(shù)十年的研究后,人們發(fā)現(xiàn)了大多數(shù)上述特征(基本面分析牺勾,技術(shù)分析等)正罢。但也許我們錯過了一些東西。也許由于大量的數(shù)據(jù)點驻民,事件翻具,資產(chǎn)履怯,圖表等,人們無法理解隱藏的相關(guān)性裆泳。使用棧式自編碼器(神經(jīng)網(wǎng)絡(luò))叹洲,我們可以使用計算機的強大功能,可能找到新的影響股票走勢的特征工禾。即使我們無法用人類語言理解這些功能运提,我們也會在GAN中使用它們。
深度無監(jiān)督學(xué)習(xí)用于期權(quán)定價中的異常檢測闻葵。我們將再使用一項特征 - 每天我們都會為高盛股票增加90天看漲期權(quán)的價格民泵。期權(quán)定價本身結(jié)合了大量數(shù)據(jù)。期權(quán)合約的價格取決于股票的未來價值(分析師也試圖預(yù)測價格槽畔,以便為看漲期權(quán)提供最準確的價格)栈妆。使用深度無監(jiān)督學(xué)習(xí)(自組織映射),我們將嘗試發(fā)現(xiàn)每天定價中的異常情況厢钧。異常(例如定價的急劇變化)可能有利于LSTM來做股票價格的模式識別签钩。
現(xiàn)在我們有了這么多的特征,接下來我們需要執(zhí)行幾個重要的步驟:
對數(shù)據(jù)的“質(zhì)量”進行統(tǒng)計檢查坏快。如果我們創(chuàng)建的數(shù)據(jù)存在缺陷铅檩,那么無論我們的算法有多復(fù)雜,結(jié)果都不會很理想莽鸿。檢查包括確保數(shù)據(jù)不會受到異方差性昧旨,多重共線性或串行相關(guān)性的影響。
創(chuàng)建特征權(quán)重祥得。如果某個特征(例如另一個股票或技術(shù)指標)對我們想要預(yù)測的股票沒有權(quán)重兔沃,那么我們就不需要在神經(jīng)網(wǎng)絡(luò)的訓(xùn)練中使用它。我們將使用XGBoost(eXtreme Gradient Boosting)级及,一種增強樹回歸算法來創(chuàng)建權(quán)重乒疏。
作為我們數(shù)據(jù)準備的最后一步,我們還將使用主成分分析(PCA)創(chuàng)建Eigen投資組合饮焦,以減少自編碼器創(chuàng)建的特征的維數(shù)怕吴。
2.1、關(guān)聯(lián)資產(chǎn)
如前所述县踢,我們將使用其他股票數(shù)據(jù)作為特征转绷,而不僅僅是GS。
那么其他股票是否會影響GS的股票走勢硼啤?良好地了解公司议经,其業(yè)務(wù)線,競爭格局,依賴關(guān)系煞肾,供應(yīng)商和客戶類型等對于選擇正確的關(guān)聯(lián)資產(chǎn)非常重要:
首先是與GS類似的公司咧织。我們將把JPMorgan Chase和Morgan Stanley等添加到數(shù)據(jù)集中。
作為一家投資銀行籍救,高盛(Goldman Sachs)依賴于全球經(jīng)濟习绢。經(jīng)濟不景氣或波動意味著沒有并購或首次公開募股,也可能是有限的自營交易收益钧忽。這就是為什么我們將包括全球經(jīng)濟指數(shù)毯炮。此外,我們將包括LIBOR(美元和英鎊計價)利率耸黑,因為分析師可能會考慮經(jīng)濟的沖擊來設(shè)定這些利率以及其他FI證券桃煎。
每日波動率指數(shù)(VIX) - 理由同上。
綜合指數(shù) - 如納斯達克和紐約證券交易所(來自美國)大刊,F(xiàn)TSE100(英國)为迈,日經(jīng)225(日本),恒生和BSE Sensex(亞太指數(shù))指數(shù)缺菌。
貨幣 - 全球貿(mào)易多次反映貨幣如何變動葫辐,因此我們將使用一攬子貨幣(如美元兌日元,英鎊兌美元等)作為特征伴郁。
總的來說耿战,我們在數(shù)據(jù)集中有72個其他資產(chǎn) - 每個資產(chǎn)的日線數(shù)據(jù)。
2.2焊傅、技術(shù)指標
我們已經(jīng)介紹了什么是技術(shù)指標以及我們使用它們的原因剂陡,讓我們直接來看代碼。我們將僅為GS創(chuàng)建技術(shù)指標狐胎。
""" Function to create the technical indicators """
def get_technical_indicators(dataset):
# Create 7 and 21 days Moving Average
dataset['ma7'] = dataset['price'].rolling(window=7).mean()
dataset['ma21'] = dataset['price'].rolling(window=21).mean()
# Create MACD
dataset['26ema'] = pd.ewma(dataset['price'], span=26)
dataset['12ema'] = pd.ewma(dataset['price'], span=12)
dataset['MACD'] = (dataset['12ema']-dataset['26ema'])
# Create Bollinger Bands
dataset['20sd'] = pd.stats.moments.rolling_std(dataset['price'],20)
dataset['upper_band'] = dataset['ma21'] + (dataset['20sd']*2)
dataset['lower_band'] = dataset['ma21'] - (dataset['20sd']*2)
# Create Exponential moving average
dataset['ema'] = dataset['price'].ewm(com=0.5).mean()
# Create Momentum
dataset['momentum'] = dataset['price']-1
return dataset
所以我們每個交易日都有技術(shù)指標(包括MACD鸭栖,布林帶等)。我們共有12項技術(shù)指標握巢。
2.3晕鹊、基本面分析
對于基本面分析,我們將對所有關(guān)于GS的每日新聞進行情緒分析暴浦。最后使用sigmoid溅话,結(jié)果將在0和1之間。分數(shù)越接近0 - 新聞越消極(接近1表示積極情緒)肉渴。對于每一天公荧,我們將創(chuàng)建平均每日分數(shù)(作為0到1之間的數(shù)字)并將其添加到特征。
2.3.1同规、Transformer的雙向嵌入表示 - BERT
為了將新聞分類為正面或負面(或中性),我們將使用BERT,一種預(yù)訓(xùn)練的NLP模型券勺。
MXNet / Gluon已經(jīng)提供預(yù)先訓(xùn)練的BERT模型绪钥。我們只需要實例化它們并添加兩個(任意數(shù)量)Dense層,并使用softmax关炼。
import bert
BERT和NLP部分的細節(jié)不在本文的范圍內(nèi)程腹,如果您有興趣,可以自行dig一番儒拂!
2.4寸潦、用于趨勢分析的傅立葉變換
傅立葉變換使用函數(shù)創(chuàng)建一系列正弦波(具有不同的幅度和幀)。組合時社痛,這些正弦波接近原始函數(shù)见转。
我們將使用傅里葉變換來提取GS的全球和本地趨勢,并對其進行一些去噪蒜哀。那么讓我們看看它是如何工作的斩箫。
""" Code to create the Fuorier trasfrom """
data_FT = dataset_ex_df[['Date', 'GS']]
close_fft = np.fft.fft(np.asarray(data_FT['GS'].tolist()))
fft_df = pd.DataFrame({'fft':close_fft})
fft_df['absolute'] = fft_df['fft'].apply(lambda x: np.abs(x))
fft_df['angle'] = fft_df['fft'].apply(lambda x: np.angle(x))
plt.figure(figsize=(14, 7), dpi=100)
fft_list = np.asarray(fft_df['fft'].tolist())
for num_ in [3, 6, 9, 100]:
fft_list_m10= np.copy(fft_list); fft_list_m10[num_:-num_]=0
plt.plot(np.fft.ifft(fft_list_m10), label='Fourier transform with {} components'.format(num_))
plt.plot(data_FT['GS'], label='Real')
plt.xlabel('Days')
plt.ylabel('USD')
plt.title('Figure 3: Goldman Sachs (close) stock prices & Fourier transforms')
plt.legend()
plt.show()
我們使用傅里葉變換的組件越多,逼近函數(shù)越接近實際股票價格撵儿。我們使用傅里葉變換來提取長期和短期趨勢乘客,因此我們將使用具有3、6和9個分量的變換。您可以推斷出具有3個組件的轉(zhuǎn)換表示長期趨勢。
用于去噪數(shù)據(jù)的另一種技術(shù)稱為小波變換垦缅。小波和傅立葉變換給出了類似的結(jié)果喉童,因此我們只使用傅里葉變換。
2.5购城、ARIMA作為特征
ARIMA是一種預(yù)測時間序列數(shù)據(jù)的技術(shù)。我們將展示如何使用它,盡管ARIMA不會作為我們的最終預(yù)測井氢,我們將使用它作為一種技術(shù)來對股票進行一些去噪并(可能)提取一些新的模式或特征。
error = mean_squared_error(test, predictions)
print('Test MSE: %.3f' % error)
output >>> Test MSE: 10.151
ARIMA給出了實際股票價格的非常好的近似值岳链。我們將通過ARIMA使用預(yù)測價格作為LSTM的輸入特征花竞,因為正如我們之前提到的,我們希望捕獲盡可能多的關(guān)于高盛的特征和模式掸哑。我們測試了MSE(均方誤差)约急,結(jié)果不太差(考慮到我們確實有很多測試數(shù)據(jù)),但是苗分,我們只會將它用作LSTM中的一個特征厌蔽。
2.6、統(tǒng)計學(xué)檢查
確保數(shù)據(jù)質(zhì)量良好對我們的模型非常重要摔癣。為了確保我們的數(shù)據(jù)合適奴饮,我們將執(zhí)行幾個簡單的檢查纬向,以確保我們實現(xiàn)和觀察的結(jié)果確實是真實的,而不是由于基礎(chǔ)數(shù)據(jù)分布導(dǎo)致一些邏輯性的錯誤戴卜。
2.6.1逾条、異方差性,多重共線性投剥,序列相關(guān)性
當誤差項(回歸的預(yù)測值與實際值之間的差異)取決于數(shù)據(jù)時师脂,會出現(xiàn)條件異方差性 - 例如,當數(shù)據(jù)點(沿x軸)增長時江锨,誤差項會增大吃警。
多重共線性是指誤差項(也稱為殘差)相互依賴的時間。
串行相關(guān)是指一個數(shù)據(jù)(特征)是另一個特征的條件(或完全依賴)啄育。
我們這里不會給出代碼酌心,因為它很簡單,我們的重點更多地放在深度學(xué)習(xí)部分灸撰,但數(shù)據(jù)質(zhì)量必須有保障谒府。
2.7、特征工程
print('Total dataset has {} samples, and {} features.'.format(dataset_total_df.shape[0], dataset_total_df.shape[1]))
output >>> Total dataset has 2265 samples, and 112 features.
在添加所有類型的數(shù)據(jù)(相關(guān)資產(chǎn)浮毯,技術(shù)指標完疫,基本面分析,傅里葉和Arima)之后债蓝,我們有2265天內(nèi)的112個特征(訓(xùn)練數(shù)據(jù)只有1585天) 壳鹤。
我們還將用自編碼器生成更多特征。
2.7.1饰迹、特征對于XGBoost的重要性
擁有如此多的功能芳誓,我們必須考慮它們是否真正表明了GS股票的方向。例如啊鸭,我們在數(shù)據(jù)集中包含美元計價的LIBOR利率锹淌,因為我們認為LIBOR的變化可能表明經(jīng)濟的變化,反過來赠制,這可能表明GS股票行為的變化赂摆。但我們需要用實踐說話。有許多方法可以測試特征重要性钟些,但我們將使用XGBoost烟号,因為它在分類和回歸問題中都有相當不錯的表現(xiàn)。
由于數(shù)據(jù)集非常大政恍,為了演示汪拥,我們將僅使用技術(shù)指標。在實際特征重要性測試中篙耗,所有選定的特征都被證明很重要迫筑,因此我們在訓(xùn)練GAN時不會去掉任何特征宪赶。
regressor = xgb.XGBRegressor(gamma=0.0,n_estimators=150,base_score=0.7,colsample_bytree=1,learning_rate=0.05)
xgbModel = regressor.fit(X_train_FI,y_train_FI, eval_set = [(X_train_FI, y_train_FI), (X_test_FI, y_test_FI)], verbose=False)
fig = plt.figure(figsize=(8,8))
plt.xticks(rotation='vertical')
plt.bar([i for i in range(len(xgbModel.feature_importances_))], xgbModel.feature_importances_.tolist(), tick_label=X_test_FI.columns)
plt.title('Figure 6: Feature importance of the technical indicators.')
plt.show()
結(jié)果很明確,MA7铣焊,MACD和BB是其中的重要特征逊朽。
我遵循相同的邏輯來對整個數(shù)據(jù)集執(zhí)行特征重要性測試罕伯,訓(xùn)練花費的時間更長曲伊,結(jié)果更難以歸納。
2.8追他、使用棧式自編碼器提取高級特征
在我們研究自編碼器之前坟募,我們先討論激活函數(shù)。
2.8.1邑狸、激活函數(shù) - GELU(高斯誤差)
最近提出的GELU懈糯,全稱為Gaussian Error Linear Unites。在論文中单雾,作者展示了使用GELU優(yōu)于ReLU的幾個實例赚哗。 gelu也用于BERT,用于新聞情緒分析的NLP方法硅堆。
我們將使用GELU作為自編碼器屿储。
我在MXNet中實現(xiàn)了GELU。如果您按照代碼并將act_type ='relu'更改為act_type ='gelu'渐逃,則無法使用够掠,除非您更改MXNet的實現(xiàn)。
讓我們來看一下GELU茄菊,ReLU和LeakyReLU(最后一個主要用于GAN - 我們也使用它)疯潭。
def gelu(x):
return 0.5 * x * (1 + math.tanh(math.sqrt(2 / math.pi) * (x + 0.044715 * math.pow(x, 3))))
def relu(x):
return max(x, 0)
def lrelu(x):
return max(0.01*x, x)
plt.figure(figsize=(15, 5))
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=.5, hspace=None)
ranges_ = (-10, 3, .25)
plt.subplot(1, 2, 1)
plt.plot([i for i in np.arange(*ranges_)], [relu(i) for i in np.arange(*ranges_)], label='ReLU', marker='.')
plt.plot([i for i in np.arange(*ranges_)], [gelu(i) for i in np.arange(*ranges_)], label='GELU')
plt.hlines(0, -10, 3, colors='gray', linestyles='--', label='0')
plt.title('Figure 7: GELU as an activation function for autoencoders')
plt.ylabel('f(x) for GELU and ReLU')
plt.xlabel('x')
plt.legend()
plt.subplot(1, 2, 2)
plt.plot([i for i in np.arange(*ranges_)], [lrelu(i) for i in np.arange(*ranges_)], label='Leaky ReLU')
plt.hlines(0, -10, 3, colors='gray', linestyles='--', label='0')
plt.ylabel('f(x) for Leaky ReLU')
plt.xlabel('x')
plt.title('Figure 8: LeakyReLU')
plt.legend()
plt.show()
注意:在后面的文章中,我將嘗試使用U-Net面殖,并嘗試利用卷積層并提仁ā(并創(chuàng)建)關(guān)于股票的模式的更多特征。現(xiàn)在脊僚,我們將只使用一個僅由Dense層組成的簡單自編碼器相叁。
我們回到自編碼器的討論。
注意:我將在以后的文章中探討的一件事是刪除解碼器中的最后一層吃挑。通常钝荡,在自編碼器中,編碼器的數(shù)量==解碼器的數(shù)量舶衬。但是埠通,我們希望提取更高級別的特征(而不是創(chuàng)建相同的輸入),因此我們可以跳過解碼器中的最后一層逛犹。我們實現(xiàn)了這一點端辱,在訓(xùn)練期間創(chuàng)建了具有相同層數(shù)的編碼器和解碼器梁剔,但是當我們創(chuàng)建輸出時,我們?nèi)サ袅俗詈笠粚游璞危驗檫@樣解碼器能包含更高級別的特征荣病。
我們從自編碼器中創(chuàng)建了112個特征。由于我們只想擁有高級特征(整體模式)渗柿,我們將使用主成分分析(PCA)在新創(chuàng)建的112個特征上創(chuàng)建特征投資組合个盆。這將減少數(shù)據(jù)的維度(列數(shù))。 Eigen組合的描述能力將與原始的112個特征相同朵栖。
注意颊亮,這純粹是實驗性的。我并非100%確定我描述的邏輯成立陨溅。但是人工智能和深度學(xué)習(xí)不就是一場徹頭徹尾的實驗嗎终惑?
3、生成對抗網(wǎng)絡(luò)(GAN)
GAN如何運作门扇?
如前所述雹有,本文的目的不是詳細解釋深度學(xué)習(xí)背后的數(shù)學(xué),而是展示其應(yīng)用臼寄。當然霸奕,在我看來,對基礎(chǔ)和細節(jié)的理解是非常必要的脯厨。因此铅祸,我們將嘗試介紹GAN如何工作,以便讀者完全理解使用GAN預(yù)測股票價格變動的理由合武。如果您對GAN有經(jīng)驗临梗,請?zhí)^此部分和下一部分(并跳到第4.2節(jié))。
GAN網(wǎng)絡(luò)由兩個模型組成 - 生成器(G)和裁決器(D)稼跳。訓(xùn)練GAN的步驟如下:
使用隨機數(shù)據(jù)(噪聲表示為z)盟庞,生成器試圖“生成”與真實數(shù)據(jù)無法區(qū)分或非常接近的數(shù)據(jù)。其目的是學(xué)習(xí)真實數(shù)據(jù)的分布汤善。
隨機生成的數(shù)據(jù)被擬合到裁決器中什猖,裁決器充當分類器并試圖了解數(shù)據(jù)是來自生成器還是真實數(shù)據(jù)。 D估計輸入樣本到真實數(shù)據(jù)集的(分布)概率红淡。
然后不狮,G和D的Loss通過生成器傳播回來。因此在旱,生成器的Loss取決于生成器和裁決器摇零。這幫助Generator了解真實數(shù)據(jù)分布。如果生成器在生成真實數(shù)據(jù)(具有相同分布)方面做得不好桶蝎,則裁決器的工作將很容易區(qū)分生成與真實數(shù)據(jù)集驻仅。因此谅畅,裁決器的Loss將非常小。裁決器Loss越小噪服,生成器Loss則越大毡泻。這使得創(chuàng)建裁決器比較困難,因為裁決器太優(yōu)秀會導(dǎo)致巨大的生成器Loss粘优,使得生成器無法學(xué)習(xí)仇味。
該過程一直持續(xù)到Discriminator無法再區(qū)分生成數(shù)據(jù)與實際數(shù)據(jù)區(qū)。
當組合在一起時敬飒,D和G像是在玩minmax游戲(生成器試圖欺騙裁決器邪铲,即最小化z?pz(z)[log(1-D(G(G) z)))]。裁決器想要通過最大化x?pr(x)[logD(x)]來分離來自生成器D(G(z))的數(shù)據(jù)无拗。但是,由于具有各自的損失函數(shù)昧碉,它是不清楚兩者如何匯合在一起(這就是為什么我們使用普通GAN的一些變種英染,例如Wasserstein GAN)。
注意:我不會在本文中包含GAN背后的完整代碼和強化學(xué)習(xí)部分被饿。
3.1四康、為什么GAN用于股市預(yù)測
生成對抗網(wǎng)絡(luò)(GAN)主要用于創(chuàng)建逼真的圖像,繪畫和視頻剪輯狭握。在我們的案例中闪金,沒有很多GAN用于預(yù)測時間序列數(shù)據(jù)的應(yīng)用。然而论颅,主要思想應(yīng)該是相同的 - 我們希望預(yù)測未來的股票變動哎垦。在未來,GS股票的模式和行為應(yīng)該或多或少相同(除非它開始以完全不同的方式運作恃疯,或者經(jīng)濟急劇變化)漏设。因此,我們希望“生成”未來的數(shù)據(jù)今妄,這些數(shù)據(jù)將具有與我們已有的相似(當然不完全相同) - 歷史交易數(shù)據(jù)郑口。所以,從理論上講盾鳞,它應(yīng)該有效犬性。
在我們的例子中,我們將使用LSTM作為時間序列生成器腾仅,并使用CNN作為裁決器乒裆。
3.2、Metropolis-Hastings GAN和Wasserstein GAN
注意:接下來的內(nèi)容我們假定讀者有一些GAN的經(jīng)驗攒砖。
I缸兔、Metropolis-Hastings GAN
Uber的工程團隊最近對傳統(tǒng)GAN進行了改進日裙,名為Metropolis-Hastings GAN(MHGAN)。優(yōu)步的方法背后的想法(正如他們所說)與谷歌和加州大學(xué)伯克利分校創(chuàng)建的另一種方法有點類似惰蜜,稱為判別式拒絕采樣(DRS)昂拂。基本上抛猖,當我們訓(xùn)練GAN時格侯,我們使用裁決器(D)的唯一目的是更好地訓(xùn)練生成器(G)。通常财著,在訓(xùn)練GAN之后我們不再使用D.然而联四,MHGAN和DRS嘗試使用D來選擇由G生成的接近實際數(shù)據(jù)分布的樣本(MHGAN之間的微小差異是使用馬爾可夫鏈蒙特卡羅(MCMC)進行采樣)。
MHGAN采用從G生成的K個樣本撑教。然后它依次運行K輸出并遵循接受規(guī)則(從裁決器創(chuàng)建)決定是接受當前樣本還是保留最后接受的樣本朝墩。最后保留的輸出是被認為是G的實際輸出的輸出。
注意:MHGAN最初由優(yōu)步在pytorch中實現(xiàn)伟姐。我只把它移植到MXNet / Gluon收苏。
II、Wasserstein GAN
訓(xùn)練GAN非常困難愤兵。模型可能永遠不會收斂鹿霸,模式崩潰很容易發(fā)生。我們將使用名為Wasserstein GAN秆乳。
同樣懦鼠,我們不會詳細介紹,但最值得注意的點是:
我們知道GAN背后的主要目標是讓Generator開始將隨機噪聲轉(zhuǎn)換為我們想要模仿的某些給定數(shù)據(jù)屹堰。因此肛冶,在GAN中,比較兩個分布之間的相似性的想法是非常必要的双藕。兩個最廣泛使用的指標是:
KL散度(Kullback-Leibler) - DKL(p‖q)=∫xp(x)logp(x)q(x)dx淑趾。當p(x)等于q(x)時,DKL為零忧陪。
JS Divergence(Jensen-Shannon)扣泊。 JS散度以0和1為界,與KL散度不同嘶摊,它是對稱的延蟹,更平滑的。當損失從KL轉(zhuǎn)為JS分歧時叶堆,GAN訓(xùn)練取得了重大成功阱飘。
WGAN使用Wasserstein距離,W(pr,pg)=1Ksup‖f‖L≤Kx~pr[f(x)] - x~pg[f(x)](其中sup代表supremum)沥匈,作為損失函數(shù)(也稱為地球移動者的距離蔗喂,因為它通常被解釋為將一堆沙子移動到另一堆,兩個堆具有不同的概率分布高帖,在轉(zhuǎn)換期間使用最小能量)缰儿。與KL和JS差異相比,Wasserstein度量給出了一個平滑的度量(沒有突然的跳躍)散址。這使得它更適合在梯度下降期間創(chuàng)建穩(wěn)定的學(xué)習(xí)過程乖阵。
此外,與KL和JS相比预麸,Wasserstein距離幾乎無處不在瞪浸。眾所周知,在反向傳播過程中吏祸,我們會區(qū)分損失函數(shù)以創(chuàng)建漸變对蒲,從而更新權(quán)重。因此犁罩,具有可微分的損失函數(shù)是非常重要的齐蔽。
這是本文最難的部分〈补溃混合WGAN和MHGAN花了我三天時間。
3.3诱渤、生成器 - 單層RNN
3.3.1丐巫、LSTM還是GRU
如前所述,生成器使用LSTM(RNN)勺美。 RNN用于時間序列數(shù)據(jù)递胧,因為它們跟蹤所有先前的數(shù)據(jù)點,并且可以捕獲隨時間發(fā)展的模式赡茸。由于RNN的特點缎脾,RNN很多時候都會受到梯度消失的影響 - 也就是說,在訓(xùn)練期間權(quán)重變化變得非常之小占卧,以至于網(wǎng)絡(luò)無法收斂到最小的損失(相反的狀況有時也會出現(xiàn) - 梯度變得太大遗菠。這稱為梯度爆炸,解決方法非常簡單 - 如果梯度開始超過某個常數(shù)华蜒,截斷它辙纬。GRU和長短期記憶(LSTM)解決了這兩個問題。它們兩者之間的最大區(qū)別是:1)GRU有2個Gate(更新和復(fù)位)叭喜,LSTM有4個(更新贺拣,輸入,忘記和輸出),2)LSTM維持內(nèi)存狀態(tài)譬涡,而GRU沒有闪幽, 3)LSTM在輸出Gate之前用非線性(sigmoid),GRU不用涡匀。
在大多數(shù)情況下盯腌,LSTM和GRU在準確性方面給出了類似的結(jié)果,但GRU的計算密度要低得多渊跋,因為GRU的可訓(xùn)練參數(shù)更少腊嗡。不過LSTM應(yīng)用更為廣泛。
3.3.2拾酝、LSTM的架構(gòu)
我們使用的LSTM架構(gòu)非常簡單 - 一個LSTM層具有112個輸入單元(因為我們在數(shù)據(jù)集中有112個特征)和500個隱藏單元燕少,一個Dense層具有1個輸出 - 每天的價格。初始化使用Xavier蒿囤,我們將使用L1 Loss(這是L1正則化的平均絕對誤差損失)客们。
注意 - 在代碼中,您可以看到我們使用Adam(學(xué)習(xí)率為.01)作為優(yōu)化器材诽。大家暫時可以不用過多關(guān)注 - 有一節(jié)特別專門解釋我們使用的超參數(shù)以及我們?nèi)绾蝺?yōu)化這些超參數(shù)底挫。
gan_num_features = dataset_total_df.shape[1]
sequence_length = 17
class RNNModel(gluon.Block):
def __init__(self, num_embed, num_hidden, num_layers, bidirectional=False, sequence_length=sequence_length, **kwargs):
super(RNNModel, self).__init__(**kwargs)
self.num_hidden = num_hidden
with self.name_scope():
self.rnn = rnn.LSTM(num_hidden, num_layers, input_size=num_embed, bidirectional=bidirectional, layout='TNC')
self.decoder = nn.Dense(1, in_units=num_hidden)
def forward(self, inputs, hidden):
output, hidden = self.rnn(inputs, hidden)
decoded = self.decoder(output.reshape((-1,self.num_hidden)))
return decoded, hidden
def begin_state(self, *args, **kwargs):
return self.rnn.begin_state(*args, **kwargs)
lstm_model = RNNModel(num_embed=gan_num_features, num_hidden=500, num_layers=1)
lstm_model.collect_params().initialize(mx.init.Xavier(), ctx=mx.cpu())
trainer = gluon.Trainer(lstm_model.collect_params(), 'adam', {'learning_rate': .01})
loss = gluon.loss.L1Loss()
我們在LSTM層中使用500個神經(jīng)元并使用Xavier初始化。正則化使用L1脸侥。讓我們看看LSTM里面有什么建邓。
print(lstm_model)
output >>>
RNNModel(
(rnn): LSTM(112 -> 500, TNC)
(decoder): Dense(500 -> 1, linear)
)
正如我們所看到的,LSTM的輸入是112個特征(dataset_total_df.shape [1])睁枕,然后是LSTM層中的500個神經(jīng)元官边,然后轉(zhuǎn)換為單個輸出 - 股票價格值。
LSTM背后的邏輯是:我們需要17天(sequence_length)天數(shù)據(jù)(數(shù)據(jù)是每天GS股票的股票價格+當天所有其他特征 - 相關(guān)資產(chǎn)外遇,情緒等)并試圖預(yù)測第18天注簿。然后我們將17天的窗口移動一天,并再次預(yù)測第18天跳仿。我們在整個數(shù)據(jù)集上進行迭代(當然是批量)诡渴。
在另一篇文章中,我將探討vanilla LSTM以及如何優(yōu)化菲语,例如:
使用雙向LSTM層 - 理論上妄辩,向后(從數(shù)據(jù)集的末尾到開頭)可能以某種方式幫助LSTM找出股票運行的模式。
使用棧式RNN架構(gòu) - 多個LSTM層谨究。然而恩袱,我們可能最終過度擬合模型,因為我們沒有大量數(shù)據(jù)(我們只有1,585天的數(shù)據(jù))胶哲。
GRU - 如前所述畔塔,GRU的cell要簡單得多。
將注意力機制添加到RNN。
--------------------------------------------
3.3.3澈吨、學(xué)習(xí)率調(diào)度程序
最重要的超參數(shù)之一是學(xué)習(xí)率把敢。在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時,為幾乎所有優(yōu)化器(例如SGD谅辣,Adam或RMSProp)設(shè)置學(xué)習(xí)速率至關(guān)重要修赞,因為它既控制收斂速度又控制網(wǎng)絡(luò)的最終性能。最簡單的學(xué)習(xí)率策略之一是在整個培訓(xùn)過程中具有固定的學(xué)習(xí)率桑阶。選擇較小的學(xué)習(xí)速率可以使優(yōu)化器找到好的解決方案柏副,但這是以限制收斂速度為代價的。隨著時間訓(xùn)練的推移改變學(xué)習(xí)率是比較好的折中方法蚣录。
schedule = CyclicalSchedule(TriangularSchedule, min_lr=0.5, max_lr=2, cycle_length=500)
iterations=1500
plt.plot([i+1 for i in range(iterations)],[schedule(i) for i in range(iterations)])
plt.title('Learning rate for each epoch')
plt.xlabel("Epoch")
plt.ylabel("Learning Rate")
plt.show()
3.3.4割择、如何防止過擬合和偏差 - 方差權(quán)衡
特征眾多的神經(jīng)網(wǎng)絡(luò)尤其需要防止過度擬合。
我們使用幾種技術(shù)來防止過度擬合:
首先確保數(shù)據(jù)質(zhì)量萎河。我們已經(jīng)進行了統(tǒng)計檢查荔泳,并確保數(shù)據(jù)不會受到多重共線性或串行自相關(guān)的影響。此外虐杯,我們對每個特征進行了權(quán)重檢查玛歌。最后還要注意初始特征選擇(例如,選擇相關(guān)資產(chǎn)擎椰,技術(shù)指標等)支子,這是通過一些關(guān)于股票市場運作方式背后的機制的領(lǐng)域知識來完成的。
正則化(或權(quán)重懲罰)达舒。兩種最廣泛使用的正則化技術(shù)是LASSO(L1)和Ridge(L2)译荞。 L1增加了平均絕對誤差,L2增加了平均誤差休弃。簡單的解釋差異就是,L1同時進行變量選擇和參數(shù)收縮圈膏,而L2僅進行參數(shù)收縮并最終保留模型中的所有系數(shù)塔猾。在存在相關(guān)變量的情況下,L2可能是首選稽坤。此外丈甸,L2在最小二乘估計具有較高方差的情況下效果最佳。因此尿褪,這取決于我們的模型目標睦擂。兩種類型的正則化的影響是完全不同的。雖然它們都會對大權(quán)重進行懲罰杖玲,但L1正則化會導(dǎo)致零不可微函數(shù)顿仇。 L2正則化有利于較小的權(quán)重,但L1正則化有利于權(quán)重變?yōu)榱恪R虼司饰牛褂肔1正則化鸿吆,您可以得到一個稀疏模型 - 一個參數(shù)較少的模型。在這兩種情況下述呐,L1和L2正則化模型的參數(shù)“收縮”惩淳,但在L1正則化的情況下,收縮直接影響模型的復(fù)雜性(參數(shù)的數(shù)量)乓搬。準確地說思犁,L2在最小二乘估計具有較高方差的情況下效果最佳。 L1對異常值更穩(wěn)健进肯,在數(shù)據(jù)稀疏時使用激蹲,并創(chuàng)建特征權(quán)重。我們將使用L1坷澡。
Dropout托呕。 Dropout層隨機刪除隱藏圖層中的節(jié)點。
Dense-sparse-dense訓(xùn)練频敛。
Early stopping项郊。
構(gòu)建復(fù)雜神經(jīng)網(wǎng)絡(luò)時的另一個重要需考慮因素是偏差 - 方差權(quán)衡≌遄基本上着降,訓(xùn)練神經(jīng)網(wǎng)絡(luò)時我們得到的誤差是偏差,方差和不可約誤差的函數(shù) - σ(由噪聲和隨機性引起的誤差)拗军。權(quán)衡的最簡單公式是:誤差=偏差^ 2 +方差+σ任洞。
偏差。偏差表現(xiàn)了模型的泛化能力发侵。高偏差(欠擬合)意味著模型不能很好地處理未知數(shù)據(jù)交掏。
方差刃鳄。方差衡量模型對數(shù)據(jù)集變化的敏感性盅弛。高方差表示過度擬合愉烙。
3.4禀苦、裁決器 - 一維CNN
3.4.1、為什么CNN可以做裁決器?
我們通常將CNN用于與圖像相關(guān)的工作(分類,上下文提取等)。它們在提取特征方面非常強大。例如身辨,在狗的圖像中萧落,第一個卷積層將檢測邊緣陨倡,第二個將開始檢測圓敛滋,第三個將檢測到鼻子。在我們的例子中兴革,數(shù)據(jù)點形成小趨勢绎晃,小趨勢形成大趨勢蜜唾,大趨勢形成模式。 CNN檢測特征的能力可用于提取有關(guān)GS股票價格變動模式的信息庶艾。
使用CNN的另一個原因是CNN在空間數(shù)據(jù)上運行良好 - 這意味著彼此更接近的數(shù)據(jù)點彼此之間的相關(guān)性更高袁余,而不是數(shù)值相關(guān)。對于時間序列數(shù)據(jù)咱揍,這也適用颖榜。在我們的例子中,每個數(shù)據(jù)點(對于每個特征)是連續(xù)的每一天煤裙。很自然地假設(shè)彼此距離越近掩完,彼此之間的相關(guān)性就越大。需要考慮的一件事(雖然這項工作沒有涉及)是周期性以及它如何改變(如果有的話)CNN硼砰。
注意:與本文中的許多其他部分一樣且蓬,使用CNN進行時間序列數(shù)據(jù)是實驗性的。我們將檢查結(jié)果题翰,而不提供數(shù)學(xué)或其他研究恶阴。結(jié)果可能因使用不同的數(shù)據(jù),激活函數(shù)等而有所不同豹障。
3.4.2冯事、CNN架構(gòu)
如下是用MXNet打印的CNN。
Sequential(
(0): Conv1D(None -> 32, kernel_size=(5,), stride=(2,))
(1): LeakyReLU(0.01)
(2): Conv1D(None -> 64, kernel_size=(5,), stride=(2,))
(3): LeakyReLU(0.01)
(4): BatchNorm(axis=1, eps=1e-05, momentum=0.9, fix_gamma=False, use_global_stats=False, in_channels=None)
(5): Conv1D(None -> 128, kernel_size=(5,), stride=(2,))
(6): LeakyReLU(0.01)
(7): BatchNorm(axis=1, eps=1e-05, momentum=0.9, fix_gamma=False, use_global_stats=False, in_channels=None)
(8): Dense(None -> 220, linear)
(9): BatchNorm(axis=1, eps=1e-05, momentum=0.9, fix_gamma=False, use_global_stats=False, in_channels=None)
(10): LeakyReLU(0.01)
(11): Dense(None -> 220, linear)
(12): Activation(relu)
(13): Dense(None -> 1, linear)
)
3.5沼填、超參數(shù)
我們將跟蹤和優(yōu)化的超參數(shù)是:
batch_size:LSTM和CNN的批大小
cnn_lr:CNN的學(xué)習(xí)率
stride:CNN中的步長
lrelu_alpha:GAN中LeakyReLU的alpha
batchnorm_momentum:CNN中批量正則化的動量
padding:CNN中的padding
kernel_size:CNN中的內(nèi)核大小
Dropout:LSTM中的Dropout
filters:初始filter數(shù)量
我們將訓(xùn)練200多個epoch桅咆。
4、超參數(shù)優(yōu)化
在200個epoch的GAN訓(xùn)練之后坞笙,我們記錄MAE(這是LSTM中的LOSS函數(shù)岩饼,GG)并將其作為獎勵值傳遞給強化學(xué)習(xí),該學(xué)習(xí)將決定是否改變繼續(xù)訓(xùn)練的超參數(shù)薛夜。如稍后所述籍茧,該方法嚴格用于試驗RL。
如果RL決定它將更新超參數(shù)梯澜,它將調(diào)用貝葉斯優(yōu)化庫寞冯,該庫將提供下一個最佳預(yù)期的超級參數(shù)集
4.1、針對超參數(shù)優(yōu)化的強化學(xué)習(xí)
為什么我們在超參數(shù)優(yōu)化中使用強化學(xué)習(xí)晚伙?因為股市一直在變化吮龄。即使我們設(shè)法訓(xùn)練我們的GAN和LSTM以創(chuàng)建非常準確的結(jié)果,結(jié)果可能僅在一段時間內(nèi)有效咆疗。意思是漓帚,我們需要不斷優(yōu)化整個過程儿惫。為了優(yōu)化流程柳刮,我們可以:
添加或刪除特征(例如添加可能相關(guān)的新股票或貨幣)
改善我們的深度學(xué)習(xí)模式掰烟。改進模型的最重要方法之一是通過超參數(shù)窄潭。一旦找到了一組超參數(shù),我們需要決定何時更改它們以及何時使用已知的集合昧辽。此外衙熔,股票市場代表一個連續(xù)的空間,取決于數(shù)百萬參數(shù)搅荞。
注意:本文整個強化學(xué)習(xí)部分的目的面向研究红氯。我們將使用GAN作為環(huán)境探索不同的RL方法。在不使用RL的情況下取具,我們可以通過多種方式在深度學(xué)習(xí)模型上成功執(zhí)行超參數(shù)優(yōu)化脖隶。
注意:接下來的內(nèi)容假定您對RL有一些了解 - 尤其是Policy optimization和Q-learning。
4.1.1暇检、強化學(xué)習(xí)理論
在不解釋RL的基礎(chǔ)知識的情況下产阱,我們將詳細介紹我們實現(xiàn)的具體方法。我們將使用無模型RL算法块仆,原因很明顯我們不了解整個環(huán)境构蹬,因此沒有明確的模型來說明環(huán)境是如何工作的,我們不需要預(yù)測股票價格變動悔据。我們將使用無模型RL的兩個流行的實現(xiàn) - Policy optimization和Q學(xué)習(xí)庄敛。
Q-learning - 在Q-learning中我們學(xué)習(xí)從一個給定的狀態(tài)采取行動的值。 Q值是采取行動后的預(yù)期回報科汗。我們將使用Rainbow藻烤,它是七種Q學(xué)習(xí)算法的組合。
Policy optimization - 在Policy optimization中头滔,我們學(xué)習(xí)從給定狀態(tài)采取的操作怖亭。 (如果我們使用像Actor / Critic這樣的方法),我們也會學(xué)習(xí)處于給定狀態(tài)的值坤检。我們將使用Proximal Policy Optimization兴猩。
構(gòu)建RL算法的一個關(guān)鍵點是準確設(shè)置獎勵。它必須捕獲環(huán)境的所有方面以及代理與環(huán)境的交互早歇。我們將獎勵R定義為:
獎勵= 2 * lossG + lossD + accuracyG倾芝,
其中l(wèi)ossG,accuracyG和lossD分別是Generator的損失和準確性箭跳,以及Discriminator的損失晨另。環(huán)境是GAN和LSTM訓(xùn)練的結(jié)果。不同代理可以采取的行動是如何更改GAN的D和G網(wǎng)絡(luò)的超參數(shù)谱姓。
4.1.1.1拯刁、Rainbow
什么是Rainbow?
Rainbow是一種基于Q學(xué)習(xí)的非策略深度強化學(xué)習(xí)算法逝段,它將七種算法結(jié)合在一起:
DQN垛玻。 DQN是Q學(xué)習(xí)算法的擴展,其使用神經(jīng)網(wǎng)絡(luò)來表示Q值奶躯。與監(jiān)督(深度)學(xué)習(xí)類似帚桩,在DQN中,我們訓(xùn)練神經(jīng)網(wǎng)絡(luò)并嘗試最小化損失函數(shù)嘹黔。我們通過隨機抽樣過渡(狀態(tài)账嚎,行動,獎勵)來訓(xùn)練網(wǎng)絡(luò)儡蔓。例如郭蕉,這些層不僅可以是完全連接的層,也可以是卷積層喂江。
Double Q learning召锈。雙QL處理Q學(xué)習(xí)中的大問題,即高估偏差获询。
Prioritized replay涨岁。在vanilla DQN中,所有轉(zhuǎn)換都存儲在重放緩沖區(qū)中吉嚣,并均勻地對此緩沖區(qū)進行采樣梢薪。然而,并非所有過渡在學(xué)習(xí)階段都同樣有益(這也使得學(xué)習(xí)效率低尝哆,因為需要更多的epoch)秉撇。Prioritized replay不是均勻采樣,而是使用分布秋泄,該分布為先前迭代中具有較高Q損失的樣本提供更高的概率琐馆。
Dueling networks。它通過使用兩個單獨的流(即印衔,具有兩個不同的微型神經(jīng)網(wǎng)絡(luò))來改變Q learning架構(gòu)啡捶。一個流用于value,一個用于advantage奸焙。它們都共享一個卷積編碼器瞎暑。棘手的部分是流的合并 - 它使用了一個特殊的聚合器。
Multi-step learning与帆。差異在于它使用N步返回計算Q值所以更準確了赌。
分布式RL。 Q學(xué)習(xí)使用平均估計Q值作為目標值玄糟。但是勿她,在許多情況下,Q值在不同情況下可能不同阵翎。分布式RL可以直接學(xué)習(xí)(或近似)Q值的分布逢并,而不是對它們求平均值之剧。同樣,數(shù)學(xué)要復(fù)雜得多砍聊,但對我們而言背稼,好處是Q值的采樣更精確。
Noisy Nets玻蝌⌒分猓基本DQN實現(xiàn)了一個簡單的ε-貪婪機制來進行探索。這種探索方法有時效率低下俯树。 Noisy Nets解決這個問題的方法是添加一個有噪聲的線性層帘腹。隨著時間的推移,網(wǎng)絡(luò)將學(xué)習(xí)如何忽略噪聲许饿。但是這種學(xué)習(xí)在空間的不同部分以不同的速度進行阳欲。
4.1.1.2、PPO
近端策略優(yōu)化(PPO)是一種無策略優(yōu)化模型的強化學(xué)習(xí)米辐。比實現(xiàn)其他算法要簡單得多胸完,效果非常好。
我們?yōu)槭裁匆褂肞PO翘贮? PPO的一個優(yōu)點是它直接學(xué)習(xí)策略赊窥,而不是間接地通過值(Q學(xué)習(xí)使用Q值來學(xué)習(xí)策略的方式)。它可以在連續(xù)action空間中很好地工作狸页,這在我們的使用案例中是合適的锨能,并且可以(通過平均值和標準偏差)學(xué)習(xí)分布概率(如果將softmax作為輸出)。
策略梯度方法的問題在于它們對步長選擇極其敏感 - 如果它很小芍耘,則需要太長時間(二階導(dǎo)數(shù)矩陣);如果它很大址遇,會有很多噪聲顯著降低性能。由于策略的變化(以及獎勵和觀察變化的分布)斋竞,輸入數(shù)據(jù)是非平穩(wěn)的倔约。與監(jiān)督學(xué)習(xí)相比,不當?shù)牟襟E可能會更具破壞性坝初,因為它會影響下次訪問的整個分布浸剩。 PPO可以解決這些問題。更重要的是鳄袍,與其他一些方法相比的優(yōu)點例如:
與ACER相比绢要,它需要額外的代碼來保持非策略相關(guān)性,還需要一個replay緩沖區(qū)拗小,或者對代理目標函數(shù)施加約束的TRPO(舊的和新的之間的KL分歧)要復(fù)雜得多)重罪。這種約束用于控制變化過多的策略 - 這本身就會造成不穩(wěn)定。 PPO通過利用剪切(在[1-ε,1 +ε]之間)代理目標函數(shù)和修改目標函數(shù)來減少計算(由約束創(chuàng)建)剿配,因為具有非常大的更新搅幅。
與TRPO相比,它與在值和策略函數(shù)或輔助損失之間共享參數(shù)的算法兼容(盡管PPO也具有信任區(qū)域PO的增益)呼胚。
注意:為了我們的訓(xùn)練盏筐,我們不會過多地研究和優(yōu)化RL方法,PPO和其他方法砸讳。相反,我們將采用可用的方法界牡,并嘗試適應(yīng)我們的GAN簿寂,LSTM和CNN模型的超參數(shù)優(yōu)化過程。
4.1.2宿亡、進一步深入強化學(xué)習(xí)
進一步探索強化學(xué)習(xí)的一些想法:
接下來我將介紹的第一件事是使用增強隨機搜索(鏈接)作為替代算法常遂。該算法的作者已經(jīng)設(shè)法獲得與其他最先進的方法(如PPO)類似的獎勵結(jié)果,但速度平均快15倍挽荠。
選擇獎勵函數(shù)非常重要克胳。可以嘗試使用不同的函數(shù)作為替代圈匆。
使用好奇心作為exploration策略漠另。
創(chuàng)建多agent體系結(jié)構(gòu)。
4.2跃赚、貝葉斯優(yōu)化
我們也可以使用貝葉斯優(yōu)化來代替網(wǎng)格搜索笆搓,我們可以使用現(xiàn)有的庫。
4.2.1纬傲、高斯過程
5满败、結(jié)果
6、接下來的研究內(nèi)容叹括?
接下來算墨,我將嘗試創(chuàng)建一個RL環(huán)境來測試交易算法,以決定何時以及如何交易汁雷。 GAN的輸出將是環(huán)境中的參數(shù)之一净嘀。
7、免責(zé)聲明
本文中提供的任何內(nèi)容均不構(gòu)成任何特定證券摔竿,證券組合面粮,交易或投資策略適合任何特定人士的建議。期貨继低,股票和期權(quán)交易涉及巨大的損失風(fēng)險熬苍,并不適合每個投資者。期貨,股票和期權(quán)的估值可能會波動柴底,因此客戶的損失可能超過其原始投資婿脸。
使用所有交易策略需要您自擔(dān)風(fēng)險。
還有許多細節(jié)需要探索 - 選擇數(shù)據(jù)特征柄驻,選擇算法狐树,調(diào)整算法等等。本文花了我2個星期才完成鸿脓。而其實還有很多未涉及的方法抑钟。
人工智能與深度學(xué)習(xí)做量化請關(guān)注:AI量化(https://t.zsxq.com/RvfY37y) 星球限時免費,如需加入野哭,請私信我獲得免費邀請碼在塔!
零基礎(chǔ)學(xué)習(xí)Python與深度學(xué)習(xí)應(yīng)用請關(guān)注星球:Python與深度學(xué)習(xí)?https://t.zsxq.com/bUFayZ3
微信公眾號:QTechAI