上個(gè)月,AI 工程師 Adam King 結(jié)合人工智能在預(yù)測(cè)方面得天獨(dú)厚的優(yōu)勢(shì),提出使用深度強(qiáng)化學(xué)習(xí)構(gòu)建加密貨幣自動(dòng)交易的程序。在展示模型中,程序的收益率竟達(dá)到了驚人的 60 倍(只討論技術(shù),無(wú)關(guān)投資建議)。
但在當(dāng)時(shí),這個(gè)展示模型略顯粗糙。雖然能獲得收益,但它并不穩(wěn)定。使用它可能讓你賺得盆滿缽盈,也有可能讓你賠得一無(wú)所有,頗有些“富貴險(xiǎn)中求”的意味。
不穩(wěn)定的問(wèn)題一直困擾著 Adam 小哥,經(jīng)過(guò)一個(gè)月的蟄伏,小哥提出將特征工程和貝葉斯優(yōu)化兩大殺器引入模型。這些改進(jìn)會(huì)奏效么?收益率又能提升多少呢?一起來(lái)看看Adam 小哥的最新力作吧!
在上一篇文章中,我們使用深度強(qiáng)化學(xué)習(xí)創(chuàng)建了一個(gè)可以賺錢(qián)的比特幣自動(dòng)交易智能體。雖然這個(gè)智能體能夠做到自動(dòng)交易比特幣獲得收益,但它的收益率并沒(méi)有讓人眼前一亮,今天我們會(huì)大幅度改進(jìn)這個(gè)比特幣交易智能體,從而提高它的收益率。
需要注意的是,本篇文章的目的是測(cè)試當(dāng)下最先進(jìn)的深度強(qiáng)化學(xué)習(xí)技術(shù)是否能與區(qū)塊鏈相結(jié)合,創(chuàng)造出一個(gè)可以盈利的比特幣自動(dòng)交易智能體。目前看來(lái)業(yè)界都還沒(méi)有意識(shí)到深度強(qiáng)化學(xué)習(xí)在自動(dòng)交易方面強(qiáng)大的潛力,反而認(rèn)為它并不是一個(gè)“能用來(lái)構(gòu)建交易算法的工具”。不過(guò),深度學(xué)習(xí)領(lǐng)域的最新進(jìn)展已經(jīng)表明,在同一個(gè)問(wèn)題上強(qiáng)化學(xué)習(xí)智能體通常能夠比普通的監(jiān)督學(xué)習(xí)智能體學(xué)習(xí)到更多的特征。
出于這個(gè)原因,我做了相關(guān)的實(shí)驗(yàn)來(lái)探究基于深度強(qiáng)化學(xué)習(xí)的交易智能體究竟能達(dá)到怎樣的收益率,當(dāng)然了,結(jié)果也可能會(huì)是深度強(qiáng)化學(xué)習(xí)有著很強(qiáng)的局限性以至于并不適合做交易智能體,但不去嘗試誰(shuí)又知道結(jié)果如何呢?
首先,我們將會(huì)改進(jìn)深度強(qiáng)化學(xué)習(xí)模型的策略網(wǎng)絡(luò)( policy network )并使輸入數(shù)據(jù)變得平穩(wěn),以便交易智能體能在很少的數(shù)據(jù)中學(xué)習(xí)到更多的特征。
接下來(lái),我們將使用當(dāng)下先進(jìn)的特征工程方法來(lái)改善交易智能體的觀察空間,同時(shí)微調(diào)交易智能體的獎(jiǎng)勵(lì)函數(shù)( reward function )以幫助它發(fā)現(xiàn)更好的交易策略。
最后,在訓(xùn)練并測(cè)試交易智能體獲得的收益率之前,我們將使用貝葉斯優(yōu)化的方法來(lái)尋找能最大化收益率的超參數(shù)。
前方高能,系好安全帶,讓我們開(kāi)始這場(chǎng)干貨滿滿的探索之旅吧。
關(guān)于深度強(qiáng)化學(xué)習(xí)模型的改進(jìn)
在上一篇文章中,我們已經(jīng)實(shí)現(xiàn)了深度強(qiáng)化學(xué)習(xí)模型的基本功能,
GitHub 地址:
https://github.com/notadamking/Bitcoin-Trader-RL
當(dāng)務(wù)之急是提高深度強(qiáng)化學(xué)習(xí)智能體的盈利能力,換句話說(shuō)就是要對(duì)模型進(jìn)行一些改進(jìn)。
循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,RNN)
我們需要做的第一個(gè)改進(jìn)就是使用循環(huán)神經(jīng)網(wǎng)絡(luò)來(lái)改進(jìn)策略網(wǎng)絡(luò),也就是說(shuō),使用長(zhǎng)短期記憶網(wǎng)絡(luò)( Long Short-Term Memory ,LSTM )網(wǎng)絡(luò)代替之前使用的多層感知機(jī)( Multi-Layer Perceptron,MLP )網(wǎng)絡(luò)。由于循環(huán)神經(jīng)網(wǎng)絡(luò)隨著時(shí)間的推移可以一直保持內(nèi)部狀態(tài),因此我們不再需要滑動(dòng)“回顧窗口“來(lái)捕捉價(jià)格變動(dòng)之前的行為,循環(huán)神經(jīng)網(wǎng)絡(luò)的循環(huán)本質(zhì)可以在運(yùn)行時(shí)自動(dòng)捕捉這些行為。在每個(gè)時(shí)間步長(zhǎng)中,輸入數(shù)據(jù)集中的新一個(gè)數(shù)據(jù)與上一個(gè)時(shí)間步長(zhǎng)的輸出會(huì)被一起輸入到循環(huán)神經(jīng)網(wǎng)絡(luò)中。
因而長(zhǎng)短期記憶網(wǎng)絡(luò)可以一直維持一個(gè)內(nèi)部狀態(tài)。在每個(gè)時(shí)間步長(zhǎng)中,智能體會(huì)新記住一些新的數(shù)據(jù)關(guān)系,也會(huì)忘掉一些之前的數(shù)據(jù)關(guān)系,這個(gè)內(nèi)部狀態(tài)也就會(huì)隨之更新。
循環(huán)神經(jīng)網(wǎng)絡(luò)會(huì)接收上一個(gè)時(shí)間步長(zhǎng)的輸出
循環(huán)神經(jīng)網(wǎng)絡(luò)如何處理上一個(gè)時(shí)間步長(zhǎng)的輸出與這一個(gè)時(shí)間步長(zhǎng)的輸入
長(zhǎng)短期記憶網(wǎng)絡(luò)實(shí)現(xiàn)代碼 LSTM_model.py
介于循環(huán)神經(jīng)網(wǎng)絡(luò)對(duì)于內(nèi)部狀態(tài)得天獨(dú)厚的優(yōu)勢(shì),在這里,我們使用長(zhǎng)短期記憶網(wǎng)絡(luò)策略更新了近端策略?xún)?yōu)化 PPO2 模型。
數(shù)據(jù)平穩(wěn)性
在上一篇文章中我曾指出比特幣交易的數(shù)據(jù)是非平穩(wěn)的(Non-Stationary,即存在一些趨勢(shì),而不能僅僅看作是隨機(jī)的波動(dòng)),因此,任何機(jī)器學(xué)習(xí)模型都難以預(yù)測(cè)未來(lái)。
平穩(wěn)時(shí)間序列是平均值,方差和自相關(guān)系數(shù)(與其自身的滯后相關(guān))都恒定的時(shí)間序列。
而且,加密貨幣價(jià)格的時(shí)間序列有著很明顯的趨勢(shì)和季節(jié)效應(yīng)(季節(jié)效應(yīng)是指與季節(jié)相關(guān)聯(lián)的股市非正常收益,是股市中的一種“異像”,是與市場(chǎng)有效性相悖的情況),這兩者都會(huì)影響算法對(duì)時(shí)間序列預(yù)測(cè)的準(zhǔn)確率,所以在這里,我們需要使用差分和變換的方法來(lái)處理輸入數(shù)據(jù),從現(xiàn)有的時(shí)間序列中構(gòu)建一個(gè)正常的數(shù)據(jù)分布來(lái)解決這個(gè)問(wèn)題。
從原理上來(lái)說(shuō),差分過(guò)程就是給任意兩個(gè)時(shí)間步長(zhǎng)內(nèi)加密貨幣幣價(jià)的導(dǎo)數(shù)(即收益率)做差值。在理想情況下,這樣做可以消除輸入時(shí)間序列中存在的趨勢(shì),但是,差分處理對(duì)季節(jié)效應(yīng)并不奏效,處理后的數(shù)據(jù)仍然具有很強(qiáng)的季節(jié)效應(yīng)。這就需要我們?cè)诓罘痔幚碇斑M(jìn)行對(duì)數(shù)處理來(lái)消除它,經(jīng)過(guò)這樣的處理最終我們會(huì)得到平穩(wěn)的輸入時(shí)間序列,如下方右圖所示。
從左到右分別為:
加密貨幣的收盤(pán)價(jià),差分處理后的收盤(pán)價(jià),對(duì)數(shù)處理和差分處理后的收盤(pán)價(jià)
對(duì)數(shù)處理和差分處理的代碼 diff_and_log_time_series.py
處理后的輸入時(shí)間序列平穩(wěn)性如何,我們可以使用增廣迪基-福勒檢驗(yàn)( Augmented Dickey-Fuller test )驗(yàn)證一下。
運(yùn)行以下代碼:
增廣迪基-福勒檢驗(yàn)的代碼 adfuller_test.py
我們得到的 p 值為 0.00 ,這意味著我們拒絕假設(shè)檢驗(yàn)中的零假設(shè)并確認(rèn)處理后的輸入時(shí)間序列是平穩(wěn)的。
我們可以運(yùn)行上面的增廣迪基-福勒檢驗(yàn)代碼來(lái)檢驗(yàn)輸入時(shí)間序列的平穩(wěn)性。
在完成了這項(xiàng)工作之后,接下來(lái)我們將使用特征工程的方法進(jìn)一步優(yōu)化交易智能體的觀察空間。
特征工程
為了進(jìn)一步提升交易智能體的收益率,我們需要做一些特征工程。
特征工程是使用該領(lǐng)域知識(shí)來(lái)生成額外的輸入數(shù)據(jù)從而優(yōu)化機(jī)器學(xué)習(xí)模型的過(guò)程。
具體到交易智能體,我們將在輸入數(shù)據(jù)集中添加一些常見(jiàn)且有效的技術(shù)指標(biāo),以及 Python 數(shù)據(jù)分析程序庫(kù) StatsModels 中季節(jié)效應(yīng)預(yù)測(cè)模型 SARIMAX 的輸出。這些技術(shù)指標(biāo)會(huì)為我們的輸入數(shù)據(jù)集帶來(lái)一些相關(guān)的,但可能會(huì)滯后的信息,這些信息能大大提升交易智能體預(yù)測(cè)的準(zhǔn)確性。這些優(yōu)化方法的組合可以為交易智能體提供一個(gè)非常好的觀察空間,讓智能體學(xué)習(xí)到更多的特征,從而獲得更多的收益。
技術(shù)分析
為了選擇技術(shù)指標(biāo),我們將比較 Python 技術(shù)分析庫(kù) ta 中可用的所有 32 個(gè)指標(biāo)( 58 個(gè)特征)的相關(guān)性。可以使用數(shù)據(jù)分析工具 pandas 來(lái)計(jì)算相同類(lèi)型的各個(gè)指標(biāo)(如動(dòng)量,體積,趨勢(shì),波動(dòng)率)之間的相關(guān)性,然后在每種類(lèi)型中僅選擇最不相關(guān)的指標(biāo)作為特征。這樣,就可以在不給觀察空間帶來(lái)過(guò)多噪音干擾的情況下,最大程度地發(fā)掘這些技術(shù)指標(biāo)的價(jià)值。
使用 Python 高級(jí)可視化庫(kù) seaborn 做出的比特幣數(shù)據(jù)集上技術(shù)指標(biāo)相關(guān)性的熱力圖
結(jié)果顯示,波動(dòng)率指標(biāo)以及一些動(dòng)量指標(biāo)都是高度相關(guān)的。在刪除所有重復(fù)的特征(每個(gè)類(lèi)型中相關(guān)性的絕對(duì)平均值大于 0.5 的特征)之后,我們將剩余的 38 個(gè)技術(shù)特征添加到交易智能體的觀察空間中。
在代碼中,我們需要?jiǎng)?chuàng)建一個(gè)名為 add_indicators(添加指標(biāo))的函數(shù)來(lái)將這些特征添加到數(shù)據(jù)幀中,為了避免在每個(gè)時(shí)間步長(zhǎng)中重復(fù)計(jì)算這些特征,我們只在交易智能體環(huán)境初始化的過(guò)程中調(diào)用 add_indicators 函數(shù)。
交易智能體環(huán)境初始化的代碼 initialize_env.py
在這里,初始化交易智能體環(huán)境,在進(jìn)行數(shù)據(jù)平穩(wěn)性處理之前將特征添加到了數(shù)據(jù)幀中。
統(tǒng)計(jì)分析
接下來(lái)我們需要添加預(yù)測(cè)模型。
由于季節(jié)效應(yīng)自回歸移動(dòng)平均模型(Seasonal Auto Regressive Integrated Moving Average,SARIMA)可以在每個(gè)時(shí)間步長(zhǎng)中快速計(jì)算價(jià)格的預(yù)測(cè)值,在平穩(wěn)數(shù)據(jù)集中運(yùn)算非常準(zhǔn)確,因此我們使用它來(lái)進(jìn)行加密貨幣幣價(jià)預(yù)測(cè)。
除了上述這些優(yōu)點(diǎn)之外,該模型實(shí)現(xiàn)起來(lái)非常簡(jiǎn)單,它還可以給出預(yù)測(cè)值的置信區(qū)間,通常情況下這比單獨(dú)給出一個(gè)預(yù)測(cè)值能提供更多的信息。就比如說(shuō),當(dāng)置信區(qū)間較小時(shí),交易智能體就會(huì)更相信這個(gè)預(yù)測(cè)值的準(zhǔn)確性,當(dāng)置信區(qū)間很大時(shí)交易智能體就知道要承擔(dān)更大的風(fēng)險(xiǎn)。
加入 SARIMA 預(yù)測(cè)模型的代碼 add_sarimax_predictions.py
這里我們將 SARIMAX 預(yù)測(cè)模型和置信區(qū)間添加到交易智能體的觀察空間中。
現(xiàn)在我們已經(jīng)使用性能更好的循環(huán)神經(jīng)網(wǎng)絡(luò)更新了策略,并使用特征工程的方法改進(jìn)了交易智能體的觀察空間,是時(shí)候優(yōu)化其他的部分了。
獎(jiǎng)勵(lì)優(yōu)化
有些人可能會(huì)覺(jué)得上一篇文章中的獎(jiǎng)勵(lì)函數(shù)(即獎(jiǎng)勵(lì)資產(chǎn)總價(jià)值不斷增加)已經(jīng)是最好的解決方案了,但是,通過(guò)進(jìn)一步的研究我發(fā)現(xiàn)獎(jiǎng)勵(lì)函數(shù)還有提升的空間。雖然我們之前使用的簡(jiǎn)單獎(jiǎng)勵(lì)函數(shù)已經(jīng)能夠獲得收益,但它給出的投資策略非常不穩(wěn)定,往往會(huì)導(dǎo)致資產(chǎn)的嚴(yán)重?fù)p失。為了改善這一點(diǎn),除了考慮利潤(rùn)的增加以外,我們還需要考慮其他獎(jiǎng)勵(lì)的指標(biāo)。
獎(jiǎng)勵(lì)指標(biāo)的一個(gè)簡(jiǎn)單改進(jìn)就是,不僅僅獎(jiǎng)勵(lì)在比特幣價(jià)格上漲時(shí)持有比特幣帶來(lái)的利潤(rùn),還獎(jiǎng)勵(lì)在比特幣價(jià)格下跌時(shí)拋售比特幣而避免的損失。就比如說(shuō),我們可以獎(jiǎng)勵(lì)智能體買(mǎi)入比特幣而總資產(chǎn)增加的行為,以及賣(mài)出比特幣避免總資產(chǎn)減少的行為。
雖然這種獎(jiǎng)勵(lì)指標(biāo)在提高收益率方面非常出色,但這樣做并沒(méi)有考慮到高回報(bào)帶來(lái)的高風(fēng)險(xiǎn)。投資者早已發(fā)現(xiàn)這種簡(jiǎn)單投資策略背后存在的漏洞,并將其改進(jìn)成一種風(fēng)險(xiǎn)可調(diào)節(jié)的獎(jiǎng)勵(lì)指標(biāo)。
基于波動(dòng)率的獎(jiǎng)勵(lì)指標(biāo)
這種風(fēng)險(xiǎn)可調(diào)節(jié)的獎(jiǎng)勵(lì)指標(biāo)中的典型就是夏普比率(Sharpe Ratio,又被稱(chēng)為夏普指數(shù))。它計(jì)算的是特定時(shí)間段內(nèi)投資組合的超額收益與波動(dòng)性的比率。具體的計(jì)算公式如下:
夏普比率的計(jì)算公式:(投資組合的收益-大盤(pán)的收益)/投資組合的標(biāo)準(zhǔn)差
從公式中我們可以得出,為了保持較高的夏普比率,投資組合必須同時(shí)保證高收益和低波動(dòng)性(也就是風(fēng)險(xiǎn))。
作為一種獎(jiǎng)勵(lì)指標(biāo),夏普比率經(jīng)受住了時(shí)間的考驗(yàn),但它對(duì)于自動(dòng)交易智能體來(lái)說(shuō)并不是很完美,因?yàn)樗鼤?huì)對(duì)上行標(biāo)準(zhǔn)差( upside volatility )產(chǎn)生不利影響,而在比特幣交易環(huán)境中有時(shí)我們需要利用上行標(biāo)準(zhǔn)差,因?yàn)樯闲袠?biāo)準(zhǔn)差(即比特幣價(jià)格瘋狂上漲)通常都是很好的機(jī)會(huì)窗口。
而使用索提諾比率( Sortino Ratio )可以很好地解決這個(gè)問(wèn)題。索提諾比率與夏普比率非常相似,只是它在風(fēng)險(xiǎn)上只考慮了下行標(biāo)準(zhǔn)差,而不是整體標(biāo)準(zhǔn)差。因此,索提諾比率并不會(huì)對(duì)上行標(biāo)準(zhǔn)差產(chǎn)生什么不利影響。因而我們給交易智能體的第一條獎(jiǎng)勵(lì)指標(biāo)就選擇索提諾比率,它的計(jì)算公式如下:
索提諾比率的計(jì)算公式:(投資組合的收益-大盤(pán)的收益)/投資組合的下行標(biāo)準(zhǔn)差
其他獎(jiǎng)勵(lì)指標(biāo)
我們選擇 Calmar 比率作為交易智能體的第二個(gè)獎(jiǎng)勵(lì)指標(biāo)。到目前為止,我們所有的獎(jiǎng)勵(lì)指標(biāo)都沒(méi)有考慮到比特幣幣價(jià)最大回撤率(drawdown)這個(gè)關(guān)鍵因素。
最大回撤率是指比特幣幣價(jià)從價(jià)格頂峰到價(jià)格低谷之間的價(jià)值差,用來(lái)描述買(mǎi)入比特幣后最糟糕的情況。
最大回撤率對(duì)我們的投資策略來(lái)說(shuō)是致命的,因?yàn)橹恍枰淮螏艃r(jià)突然跳水,我們長(zhǎng)時(shí)間累積的高收益就會(huì)化為烏有。
最大回撤率
為了消除最大回撤率帶來(lái)的負(fù)面影響,我們需要選用可以處理這種情況的獎(jiǎng)勵(lì)指標(biāo),就比如說(shuō)選用 Calmar 比率。該比率與夏普比率類(lèi)似,只是它將分母上投資組合的標(biāo)準(zhǔn)差替換為最大回撤率。
Calmar 比率的計(jì)算公式:(投資組合的收益-大盤(pán)的收益)/最大回撤率
我們最后一個(gè)獎(jiǎng)勵(lì)指標(biāo)是在對(duì)沖基金行業(yè)中廣泛使用的 Omega 比率。從理論上來(lái)說(shuō),在衡量風(fēng)險(xiǎn)與收益時(shí),Omega 比率應(yīng)該優(yōu)于 Sortino 比率和 Calmar 比率,因?yàn)樗軌蛟趩蝹€(gè)指標(biāo)中使用收益的分布來(lái)評(píng)估風(fēng)險(xiǎn)。
計(jì)算 Omega 比率時(shí),我們需要分別計(jì)算在特定基準(zhǔn)之上或之下投資組合的概率分布,然后兩者相除計(jì)算比率。Omega 比率越高,比特幣上漲潛力超過(guò)下跌潛力的概率就越高。
Omege 比率的計(jì)算公式
Omega 比率的計(jì)算公式看起來(lái)很復(fù)雜,不過(guò)不要擔(dān)心,在代碼中實(shí)現(xiàn)它并不難。
代碼實(shí)現(xiàn)
雖然說(shuō)編寫(xiě)每個(gè)獎(jiǎng)勵(lì)指標(biāo)的代碼聽(tīng)起來(lái)很有意思且很有挑戰(zhàn)性,但這里為了方便大家的理解,我選擇使用Python 量化金融程序包 empyrical來(lái)計(jì)算它們。幸運(yùn)的是,這個(gè)程序包中恰好包含了我們上面定義的三個(gè)獎(jiǎng)勵(lì)指標(biāo),因而在每個(gè)時(shí)間步長(zhǎng)中,我們只需要將該時(shí)間段內(nèi)收益和大盤(pán)收益的列表發(fā)給 Empyrical 函數(shù),它就會(huì)返回這三個(gè)比率。
使用 empyrical 程序包計(jì)算三個(gè)獎(jiǎng)勵(lì)指標(biāo)的代碼 risk_adjusted_reward.py
在代碼中,我們通過(guò)預(yù)先定義的獎(jiǎng)勵(lì)函數(shù)設(shè)置了每個(gè)時(shí)間步長(zhǎng)的獎(jiǎng)勵(lì)。
到目前為止,我們已經(jīng)確定了如何衡量一個(gè)交易策略的成功與否,現(xiàn)在是時(shí)候弄清楚哪些指標(biāo)會(huì)帶來(lái)較高的收益。我們需要將這些獎(jiǎng)勵(lì)函數(shù)輸入到自動(dòng)超參數(shù)優(yōu)化軟件框架 Optuna 中,然后使用貝葉斯優(yōu)化來(lái)的方法為輸入數(shù)據(jù)集尋找最優(yōu)的超參數(shù)。
工具集
俗話說(shuō),好馬配好鞍。任何一個(gè)優(yōu)秀的技術(shù)人員都需要一套好用的工具,否則就會(huì)巧婦難為無(wú)米之炊。
但我并不是說(shuō)我們要重復(fù)造輪子,我們應(yīng)該學(xué)會(huì)使用程序員前輩用禿頭的代價(jià)為我們開(kāi)發(fā)的工具,這樣他們的工作也算沒(méi)有白費(fèi)。對(duì)于我們所開(kāi)發(fā)的交易智能體,它要用到的最重要的工具就是自動(dòng)超參數(shù)優(yōu)化軟件框架 Optuna,從原理上來(lái)說(shuō),它使用了樹(shù)結(jié)構(gòu)的 Parzen 窗估計(jì)(Tree-structured Parzen Estimators,TPEs)來(lái)實(shí)現(xiàn)貝葉斯優(yōu)化,而這種估計(jì)方法是可以并行化運(yùn)行的,這使得我們的顯卡有了用武之地,執(zhí)行搜索需要的時(shí)間也會(huì)大大縮短。簡(jiǎn)而言之,
貝葉斯優(yōu)化是一種搜索超參數(shù)空間以找到能最大化給定目標(biāo)函數(shù)的超參數(shù)的高效解決方案。
也就是說(shuō),貝葉斯優(yōu)化能夠有效地改進(jìn)任何黑箱模型。從工作原理上來(lái)說(shuō),貝葉斯優(yōu)化通過(guò)使用替代函數(shù)( surrogate functions )或是替代函數(shù)的分布對(duì)要優(yōu)化的目標(biāo)函數(shù)進(jìn)行建模。隨著時(shí)間的推移,算法不斷地檢索超參數(shù)空間以找到那些能夠最大化目標(biāo)函數(shù)的超參數(shù),分布的效果也會(huì)逐漸改善。
理論說(shuō)了這么多,我們要如何把這些技術(shù)應(yīng)用在比特幣自動(dòng)交易智能體中呢?從本質(zhì)上來(lái)講,我們可以使用這種技術(shù)來(lái)找到一組最優(yōu)的超參數(shù),使得智能體的收益率最高。這個(gè)過(guò)程就像是在超參數(shù)的汪洋大海中撈取一根效果最好的針,而貝葉斯優(yōu)化就是帶我們找到這根針的磁鐵。讓我們開(kāi)始吧。
使用 Optuna 優(yōu)化超參數(shù)并不是什么難事。
首先,我們需要?jiǎng)?chuàng)建一個(gè) optuna 實(shí)例,也就是裝載所有超參數(shù)試驗(yàn)的容器。在每次試驗(yàn)中我們需要調(diào)整超參數(shù)的設(shè)置來(lái)計(jì)算目標(biāo)函數(shù)相應(yīng)的損失函數(shù)值。在實(shí)例初始化完成后,我們需要向其中傳入目標(biāo)函數(shù)然后調(diào)用 study.optimize() 函數(shù)開(kāi)始優(yōu)化,Optuna 將使用貝葉斯優(yōu)化的方法來(lái)尋找能夠最小化損失函數(shù)的超參數(shù)配置。
使用 Optuna 程序庫(kù)貝葉斯優(yōu)化的代碼 optimize_with_optuna.py
在這個(gè)例子中,目標(biāo)函數(shù)就是在比特幣交易環(huán)境中訓(xùn)練并測(cè)試智能體,而目標(biāo)函數(shù)的損失值則定義為測(cè)試期間智能體平均收益的相反數(shù),之所以給收益值加上負(fù)號(hào),是因?yàn)槠骄找嬖礁咴胶茫?Optuna 看來(lái)?yè)p失函數(shù)越低越好,一個(gè)負(fù)號(hào)剛好解決這個(gè)問(wèn)題。optimize 優(yōu)化函數(shù)為目標(biāo)函數(shù)提供了試驗(yàn)對(duì)象,代碼中我們可以指定試驗(yàn)對(duì)象中的變量設(shè)置。
優(yōu)化目標(biāo)函數(shù)的代碼 optimize_objective_fn.py
optimize_ppo2 優(yōu)化智能體函數(shù)和 optimize_envs 優(yōu)化智能體環(huán)境函數(shù)接收試驗(yàn)對(duì)象作為輸入并返回包含要測(cè)試參數(shù)的字典。每個(gè)變量的搜索空間由 suggest 函數(shù)進(jìn)行設(shè)置,我們需要在試驗(yàn)中調(diào)用 suggest 函數(shù)并給函數(shù)中傳入指定的參數(shù)。
比如說(shuō),如果設(shè)置參數(shù)在對(duì)數(shù)尺度上服從均勻分布,即調(diào)用函數(shù)
trial.suggest_loguniform('n_steps',16,2048),
相當(dāng)于給函數(shù)了一個(gè) 16-2048 之間的 2 的指數(shù)次方(如16,32,64,…,1024,2048)的新浮點(diǎn)數(shù)。
再者,如果設(shè)置參數(shù)在普通尺度上服從均勻分布,即調(diào)用函數(shù)
trial.suggest_uniform('cliprange',0.1,0.4),
相當(dāng)于給函數(shù)一個(gè) 0.1 到 0.4 之間的新浮點(diǎn)數(shù)(如0.1,0.2,0.3,0.4)。
相信你已經(jīng)看出來(lái)了其中的規(guī)律,就是這樣來(lái)設(shè)置變量:
suggest_categorical('categorical',['option_one','option_two']),其中 categorical 為設(shè)置變量的策略, option_one 和 option_two 分別為變量的兩個(gè)選項(xiàng),在剛才的函數(shù)中這兩個(gè)選項(xiàng)為變量的范圍,弄懂了這個(gè)相信下面的代碼就難不倒你了。
化交易智能體的代碼 optimize_ppo2.py
優(yōu)化交易環(huán)境的代碼 optimize_envs.py
代碼寫(xiě)好后,我們?cè)谝慌_(tái)高性能服務(wù)器上以 CPU/顯卡協(xié)同運(yùn)算的方式運(yùn)行了優(yōu)化函數(shù)。在設(shè)置中,Optuna 創(chuàng)建了一個(gè) SQLite 數(shù)據(jù)庫(kù),我們可以從中加載優(yōu)化的實(shí)例。該實(shí)例記錄了測(cè)試過(guò)程中性能最好的一次試驗(yàn),從中我們可以推算出智能體交易環(huán)境中最優(yōu)的超參數(shù)集。
加載 optuna 實(shí)例的代碼 load_optuna_study.py
到這里,我們已經(jīng)改進(jìn)了模型,改進(jìn)了特征集,并優(yōu)化了所有的超參數(shù)。但俗話說(shuō),是騾子是馬得拉出來(lái)遛遛。
那么,交易智能體在新的獎(jiǎng)勵(lì)指標(biāo)下表現(xiàn)如何呢?
在訓(xùn)練過(guò)程中,我分別使用了利潤(rùn)、Sortino 比率、Calmar 比率和 Omega 比率四個(gè)獎(jiǎng)勵(lì)指標(biāo)來(lái)優(yōu)化智能體。接下來(lái)我們需要在測(cè)試環(huán)境中檢驗(yàn)?zāi)姆N獎(jiǎng)勵(lì)指標(biāo)訓(xùn)練出來(lái)的智能體收益最高,當(dāng)然了,測(cè)試環(huán)境中的數(shù)據(jù)都是智能體在訓(xùn)練過(guò)程中從未見(jiàn)到過(guò)的比特幣價(jià)格走勢(shì),這樣保證了測(cè)試的公平性。
收益比較
在查看結(jié)果之前,我們需要知曉一個(gè)成功的交易策略是什么樣的。出于這個(gè)原因,我們將針對(duì)一些常見(jiàn)且有效的比特幣交易策略進(jìn)行基準(zhǔn)測(cè)試。令人震驚的是,在過(guò)去的十年中一個(gè)最有效的比特幣交易策略就是買(mǎi)入并持有,而另外兩個(gè)不錯(cuò)的交易策略則是使用簡(jiǎn)單但有效的技術(shù)分析來(lái)生成買(mǎi)入/賣(mài)出信號(hào),從而指導(dǎo)交易。
1、買(mǎi)入并持有
這種交易策略指盡可能多地購(gòu)買(mǎi)比特幣并一直持有下去(也就是區(qū)塊鏈社區(qū)中的江湖黑話“ HODL ”)。雖然說(shuō)這種交易策略并不是特別復(fù)雜,但在過(guò)去這樣做賺錢(qián)的機(jī)率很高。
2、相對(duì)強(qiáng)弱指數(shù)分歧(Relative Strength Index(RSI) divergence )
當(dāng)相對(duì)強(qiáng)弱指數(shù)持續(xù)下跌且收盤(pán)價(jià)持續(xù)上漲時(shí),這就是需要賣(mài)出的信號(hào),而當(dāng)相對(duì)強(qiáng)弱指數(shù)持續(xù)上漲且收盤(pán)價(jià)持續(xù)下跌時(shí),就是需要買(mǎi)入的信號(hào)。
3、簡(jiǎn)單移動(dòng)平均線( Simple Moving Average,SMA )交叉
當(dāng)長(zhǎng)期簡(jiǎn)單移動(dòng)平均線超過(guò)短期簡(jiǎn)單移動(dòng)平均線時(shí),這就是需要賣(mài)出的信號(hào),而當(dāng)短期簡(jiǎn)單移動(dòng)平均線超過(guò)長(zhǎng)期簡(jiǎn)單移動(dòng)平均線時(shí),就是需要買(mǎi)入的信號(hào)。
你可能會(huì)問(wèn),為什么要做這些簡(jiǎn)單的基準(zhǔn)測(cè)試呢?這樣做是為了通過(guò)比較證明我們的強(qiáng)化學(xué)習(xí)交易智能體可以在比特幣市場(chǎng)上發(fā)揮作用,如果智能體的收益連這些簡(jiǎn)單的基準(zhǔn)收益都超不過(guò),那么我們就相當(dāng)于花費(fèi)了大量的開(kāi)發(fā)時(shí)間和顯卡算力來(lái)進(jìn)行了一場(chǎng)天馬行空的科學(xué)實(shí)驗(yàn)。現(xiàn)在,讓我們來(lái)證明事實(shí)并非如此。
實(shí)驗(yàn)結(jié)果
我們的數(shù)據(jù)集選用從加密貨幣數(shù)據(jù)網(wǎng)站 CryptoDataDownload 上下載的每小時(shí)收盤(pán)價(jià)位置價(jià)值( OHCLV )數(shù)據(jù),其中前 80% 的數(shù)據(jù)用來(lái)訓(xùn)練智能體,后 20% 作為全新的數(shù)據(jù)進(jìn)行測(cè)試,以了解智能體的收益能力。當(dāng)前這種簡(jiǎn)單的交叉驗(yàn)證形式足以滿足我們的需求,而如果這個(gè)比特幣自動(dòng)交易智能體真的走向生產(chǎn)就緒,我們就可以使用全部的數(shù)據(jù)集進(jìn)行訓(xùn)練,然后在每天新產(chǎn)生的數(shù)據(jù)集上進(jìn)行測(cè)試。
廢話不多說(shuō),我們來(lái)看看結(jié)果。
可以看到,使用 Omega 比率作為獎(jiǎng)勵(lì)指標(biāo)的智能體在測(cè)試階段并沒(méi)有讓人眼前一亮的交易。
使用 Omega 比率作為獎(jiǎng)勵(lì)指標(biāo)的智能體在超過(guò) 3500 小時(shí)的交易時(shí)間里資產(chǎn)的總價(jià)值
分析智能體所進(jìn)行的交易我們可以發(fā)現(xiàn),很明顯 Omega 比率這種獎(jiǎng)勵(lì)指標(biāo)產(chǎn)生了過(guò)度交易(over-trade)的交易策略,以至于智能體未能抓住市場(chǎng)機(jī)會(huì)獲得收益。
使用 Calmar 比率作為獎(jiǎng)勵(lì)指標(biāo)的智能體與使用 Omega 比率作為獎(jiǎng)勵(lì)指標(biāo)的智能體相比略有改進(jìn),但最終結(jié)果非常相似。看起來(lái)像是我們投入了大量的時(shí)間和精力,只是為了讓事情變得更糟......
使用 Calmar 比率作為獎(jiǎng)勵(lì)指標(biāo)的智能體在超過(guò) 3500 小時(shí)的交易時(shí)間里資產(chǎn)的總價(jià)值
如果僅使用利潤(rùn)作為獎(jiǎng)勵(lì)指標(biāo)效果如何呢?在上一篇文章中這種獎(jiǎng)勵(lì)指標(biāo)被證明有點(diǎn)失敗,這次做的所有修改和優(yōu)化能否化腐朽為神奇呢?
在為期四個(gè)月的測(cè)試周期內(nèi),使用利潤(rùn)作為獎(jiǎng)勵(lì)指標(biāo)的智能體平均收益達(dá)到賬戶(hù)初始金額的350%。你可能已經(jīng)被這個(gè)結(jié)果嚇呆了。這應(yīng)該就是強(qiáng)化學(xué)習(xí)能達(dá)到的巔峰了吧,對(duì)吧?
使用利潤(rùn)作為獎(jiǎng)勵(lì)指標(biāo)的智能體在超過(guò) 3500 小時(shí)的交易時(shí)間里資產(chǎn)的總價(jià)值
并不是這樣的。使用 Sortino 比率作為獎(jiǎng)勵(lì)指標(biāo)的智能體平均收益達(dá)到了賬戶(hù)初始金額的850%。當(dāng)我看到這個(gè)數(shù)字時(shí),我都不敢相信自己的眼睛,以至于我立馬回去檢查代碼中是否存在問(wèn)題。但經(jīng)過(guò)徹底的檢查后,很明顯代碼中沒(méi)有任何錯(cuò)誤,也就是說(shuō)這些智能體已經(jīng)知道如何進(jìn)行比特幣交易。
使用 Sortino 比率作為獎(jiǎng)勵(lì)指標(biāo)的智能體在超過(guò) 3500 小時(shí)的交易時(shí)間里資產(chǎn)的總價(jià)值
看起來(lái)使用 Sortino 比率作為獎(jiǎng)勵(lì)指標(biāo)的智能體學(xué)習(xí)到了在最小化持有比特幣風(fēng)險(xiǎn)的前提下低價(jià)買(mǎi)入和高價(jià)賣(mài)出的重要性,同時(shí)它們還躲過(guò)了過(guò)度交易和投資不足兩大陷阱。雖然說(shuō)智能體學(xué)到的具體交易策略我們不得而知,但是我們可以清楚地看到智能體已經(jīng)學(xué)會(huì)通過(guò)交易比特幣獲得收益了。
如果你不信,請(qǐng)看下圖。
使用 Sortino 比率作為獎(jiǎng)勵(lì)指標(biāo)的智能體正在交易比特幣,
其中綠色的三角形表示買(mǎi)入信號(hào),紅色的三角形表示賣(mài)出信號(hào)。
現(xiàn)在,我并沒(méi)有被實(shí)驗(yàn)成功的興奮沖昏頭腦。我清楚地知道比特幣自動(dòng)交易智能體還遠(yuǎn)遠(yuǎn)沒(méi)有達(dá)到生產(chǎn)就緒。話雖如此,但這些結(jié)果比我迄今為止看到的任何交易策略都要令人印象深刻。而且令人震驚的是,我們并沒(méi)有告訴智能體關(guān)于加密貨幣市場(chǎng)如何運(yùn)作、如何在加密貨幣市場(chǎng)上賺錢(qián)這樣的先驗(yàn)知識(shí),而是僅靠智能體重復(fù)地試驗(yàn)和試錯(cuò)就達(dá)到了這么好的效果,不過(guò),這里經(jīng)過(guò)了很多很多次的試驗(yàn)和試錯(cuò)。
寫(xiě)在最后
在本篇文章中,我們優(yōu)化了基于強(qiáng)化學(xué)習(xí)的比特幣自動(dòng)交易智能體,讓它在交易比特幣時(shí)做出更好的決策,從而獲得更多的收益!在這個(gè)過(guò)程中我們花費(fèi)了大量的時(shí)間和精力,也遇到了很多的困難,我們把困難分解細(xì)化再逐個(gè)攻破,最終完成了智能體的優(yōu)化,其中具體的操作步驟如下:
使用循環(huán)神經(jīng)網(wǎng)絡(luò)升級(jí)現(xiàn)有模型,即升級(jí)成使用平穩(wěn)性數(shù)據(jù)的長(zhǎng)短期記憶網(wǎng)絡(luò);
使用領(lǐng)域知識(shí)和統(tǒng)計(jì)分析進(jìn)行特征工程,為智能體提供了 40 多個(gè)用來(lái)學(xué)習(xí)的新特征;
將投資的風(fēng)險(xiǎn)引入智能體的獎(jiǎng)勵(lì)指標(biāo),而不只是關(guān)注利潤(rùn);
使用貝葉斯優(yōu)化來(lái)尋找模型中最優(yōu)的超參數(shù);
使用常見(jiàn)的交易策略進(jìn)行基準(zhǔn)測(cè)試,以確保智能體的收益可以跑贏市場(chǎng)。
從理論上來(lái)說(shuō),這個(gè)高收益的交易智能體已經(jīng)做得很不錯(cuò)了。
但是,我收到了相當(dāng)多的反饋,他們聲稱(chēng)交易智能體只是在學(xué)習(xí)擬合曲線,因此,面對(duì)生產(chǎn)環(huán)境中的實(shí)時(shí)數(shù)據(jù),交易智能體永遠(yuǎn)不可能獲得收益。雖然我們?cè)诓煌瑪?shù)據(jù)集上訓(xùn)練/測(cè)試智能體的方法應(yīng)該能夠解決這個(gè)問(wèn)題,但是模型確實(shí)會(huì)有過(guò)度擬合數(shù)據(jù)集的可能,并且可能不會(huì)很好地推廣到實(shí)時(shí)數(shù)據(jù)。話雖這么說(shuō),但在我看來(lái)這些交易智能體學(xué)習(xí)到的遠(yuǎn)遠(yuǎn)不只是簡(jiǎn)單的曲線擬合,因此,我認(rèn)為它們能夠在實(shí)時(shí)交易的場(chǎng)景中獲得收益。
為了檢驗(yàn)這個(gè)想法,接下來(lái)的一段時(shí)間里我會(huì)把這些基于強(qiáng)化學(xué)習(xí)的智能體帶到生產(chǎn)環(huán)節(jié),為此,我們首先要更新智能體的運(yùn)行環(huán)境以支持以太幣、萊特幣等其他加密貨幣,然后我們將升級(jí)智能體讓它可以在加密貨幣交易所 Coinbase Pro 上實(shí)時(shí)交易。
這將會(huì)是一個(gè)激動(dòng)人心的實(shí)驗(yàn),請(qǐng)不要錯(cuò)過(guò)它。
需要強(qiáng)調(diào)的是,本篇文章中所有的方法和投資策略都是出于教育目的,不應(yīng)被視為投資建議。我們的比特幣自動(dòng)交易智能體也遠(yuǎn)遠(yuǎn)沒(méi)有達(dá)到實(shí)際生產(chǎn)層面,所以請(qǐng)管好自己的錢(qián)包。
-
機(jī)器人
+關(guān)注
關(guān)注
210文章
28231瀏覽量
206614 -
python
+關(guān)注
關(guān)注
56文章
4783瀏覽量
84473 -
比特幣
+關(guān)注
關(guān)注
57文章
7002瀏覽量
140361
原文標(biāo)題:回報(bào)率850%? 這個(gè)用Python優(yōu)化的比特幣交易機(jī)器人簡(jiǎn)直太燒腦了...
文章出處:【微信號(hào):rgznai100,微信公眾號(hào):rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論