人工智能與量化投資--深度學(xué)習(xí)前沿技術(shù)在股價預(yù)測中的應(yīng)用

在本文中敷燎,我將創(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拨黔,隨后出現(xiàn)的幾起案子蛔溃,更是在濱河造成了極大的恐慌,老刑警劉巖篱蝇,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贺待,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機喘垂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事∶稳荆” “怎么了遂铡?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長脆荷。 經(jīng)常有香客問我桃焕,道長师痕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任厢塘,我火速辦了婚禮琅关,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芋类。我一直安慰自己胖喳,他們只是感情好,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惰拱,像睡著了一般搬瑰。 火紅的嫁衣襯著肌膚如雪泽论。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機與錄音鹦赎,去河邊找鬼谍椅。 笑死,一個胖子當著我的面吹牛古话,可吹牛的內(nèi)容都是我干的雏吭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼陪踩,長吁一口氣:“原來是場噩夢啊……” “哼杖们!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肩狂,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤胀莹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后婚温,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡媳否,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年栅螟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篱竭。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡力图,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掺逼,到底是詐尸還是另有隱情吃媒,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布吕喘,位于F島的核電站赘那,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏氯质。R本人自食惡果不足惜募舟,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闻察。 院中可真熱鬧拱礁,春花似錦琢锋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鸯乃,卻和暖如春鲸阻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背飒责。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工赘娄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宏蛉。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓遣臼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拾并。 傳聞我的和親對象是個殘疾皇子揍堰,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容