回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...


回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...


來源 | Towards Data Science

編譯 | Guoxi

責編 | 喬治

出品 | 區塊鏈大本營(Blockchain_camp)

上個月,AI 工程師 Adam King 結合人工智能在預測方面得天獨厚的優勢,提出使用深度強化學習構建加密貨幣自動交易的程序。在展示模型中,程序的收益率竟達到了驚人的 60 倍(只討論技術,無關投資建議)。但在當時,這個展示模型略顯粗糙。雖然能獲得收益,但它並不穩定。使用它可能讓你賺得盆滿缽盈,也有可能讓你賠得一無所有,頗有些“富貴險中求”的意味。不穩定的問題一直困擾著 Adam 小哥,經過一個月的蟄伏,小哥提出將特徵工程和貝葉斯優化兩大殺器引入模型。這些改進會奏效麼?收益率又能提升多少呢?一起來看看 Adam 小哥的最新力作吧!


在上一篇文章中,我們使用深度強化學習創建了一個可以賺錢的比特幣自動交易智能體。雖然這個智能體能夠做到自動交易比特幣獲得收益,但它的收益率並沒有讓人眼前一亮,今天我們會大幅度改進這個比特幣交易智能體,從而提高它的收益率

需要注意的是,本篇文章的目的是測試當下最先進的深度強化學習技術是否能與區塊鏈相結合,創造出一個可以盈利的比特幣自動交易智能體。目前看來業界都還沒有意識到深度強化學習在自動交易方面強大的潛力,反而認為它並不是一個“能用來構建交易算法的工具”。不過,深度學習領域的最新進展已經表明,在同一個問題上強化學習智能體通常能夠比普通的監督學習智能體學習到更多的特徵。

出於這個原因,我做了相關的實驗來探究基於深度強化學習的交易智能體究竟能達到怎樣的收益率,當然了,結果也可能會是深度強化學習有著很強的侷限性以至於並不適合做交易智能體,但不去嘗試誰又知道結果如何呢?

首先,我們將會改進深度強化學習模型的策略網絡( policy network )並使輸入數據變得平穩,以便交易智能體能在很少的數據中學習到更多的特徵。

接下來,我們將使用當下先進的特徵工程方法來改善交易智能體的觀察空間,同時微調交易智能體的獎勵函數( reward function )以幫助它發現更好的交易策略。

最後,在訓練並測試交易智能體獲得的收益率之前,我們將使用貝葉斯優化的方法來尋找能最大化收益率的超參數

前方高能,繫好安全帶,讓我們開始這場乾貨滿滿的探索之旅吧。


關於深度強化學習模型的改進

在上一篇文章中,我們已經實現了深度強化學習模型的基本功能,

GitHub 地址:

https://github.com/notadamking/Bitcoin-Trader-RL

當務之急是提高深度強化學習智能體的盈利能力,換句話說就是要對模型進行一些改進。

循環神經網絡(Recurrent Neural Network,RNN)

我們需要做的第一個改進就是使用循環神經網絡來改進策略網絡,也就是說,使用長短期記憶網絡( Long Short-Term Memory ,LSTM )網絡代替之前使用的多層感知機( Multi-Layer Perceptron,MLP )網絡。由於循環神經網絡隨著時間的推移可以一直保持內部狀態,因此我們不再需要滑動“回顧窗口“來捕捉價格變動之前的行為,循環神經網絡的循環本質可以在運行時自動捕捉這些行為。在每個時間步長中,輸入數據集中的新一個數據與上一個時間步長的輸出會被一起輸入到循環神經網絡中。

因而長短期記憶網絡可以一直維持一個內部狀態。在每個時間步長中,智能體會新記住一些新的數據關係,也會忘掉一些之前的數據關係,這個內部狀態也就會隨之更新。

回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

循環神經網絡會接收上一個時間步長的輸出


回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

循環神經網絡如何處理上一個時間步長的輸出與這一個時間步長的輸入


回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

長短期記憶網絡實現代碼 LSTM_model.py


介於循環神經網絡對於內部狀態得天獨厚的優勢,在這裡,我們使用長短期記憶網絡策略更新了近端策略優化 PPO2 模型

數據平穩性

在上一篇文章中我曾指出比特幣交易的數據是非平穩的(Non-Stationary,即存在一些趨勢,而不能僅僅看作是隨機的波動),因此,任何機器學習模型都難以預測未來。

平穩時間序列是平均值,方差和自相關係數(與其自身的滯後相關)都恆定的時間序列。


而且,加密貨幣價格的時間序列有著很明顯的趨勢和季節效應(季節效應是指與季節相關聯的股市非正常收益,是股市中的一種“異像”,是與市場有效性相悖的情況),這兩者都會影響算法對時間序列預測的準確率,所以在這裡,我們需要使用差分和變換的方法來處理輸入數據,從現有的時間序列中構建一個正常的數據分佈來解決這個問題。

從原理上來說,差分過程就是給任意兩個時間步長內加密貨幣幣價的導數(即收益率)做差值。在理想情況下,這樣做可以消除輸入時間序列中存在的趨勢,但是,差分處理對季節效應並不奏效,處理後的數據仍然具有很強的季節效應。這就需要我們在差分處理之前進行對數處理來消除它,經過這樣的處理最終我們會得到平穩的輸入時間序列,如下方右圖所示。


回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

從左到右分別為:加密貨幣的收盤價,差分處理後的收盤價,對數處理和差分處理後的收盤價

回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

對數處理和差分處理的代碼 diff_and_log_time_series.py


處理後的輸入時間序列平穩性如何,我們可以使用增廣迪基-福勒檢驗( Augmented Dickey-Fuller test )驗證一下。

運行以下代碼:

回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

增廣迪基-福勒檢驗的代碼 adfuller_test.py


我們得到的 p 值為 0.00 ,這意味著我們拒絕假設檢驗中的零假設並確認處理後的輸入時間序列是平穩的

我們可以運行上面的增廣迪基-福勒檢驗代碼來檢驗輸入時間序列的平穩性。

在完成了這項工作之後,接下來我們將使用特徵工程的方法進一步優化交易智能體的觀察空間


特徵工程

為了進一步提升交易智能體的收益率,我們需要做一些特徵工程。

特徵工程是使用該領域知識來生成額外的輸入數據從而優化機器學習模型的過程。


具體到交易智能體,我們將在輸入數據集中添加一些常見且有效的技術指標,以及 Python 數據分析程序庫 StatsModels 中季節效應預測模型 SARIMAX 的輸出。這些技術指標會為我們的輸入數據集帶來一些相關的,但可能會滯後的信息,這些信息能大大提升交易智能體預測的準確性。這些優化方法的組合可以為交易智能體提供一個非常好的觀察空間,讓智能體學習到更多的特徵,從而獲得更多的收益。

技術分析

為了選擇技術指標,我們將比較 Python 技術分析庫 ta 中可用的所有 32 個指標( 58 個特徵)的相關性。可以使用數據分析工具 pandas 來計算相同類型的各個指標(如動量,體積,趨勢,波動率)之間的相關性,然後在每種類型中僅選擇最不相關的指標作為特徵。這樣,就可以在不給觀察空間帶來過多噪音干擾的情況下,最大程度地發掘這些技術指標的價值。

回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

使用 Python 高級可視化庫 seaborn 做出的比特幣數據集上技術指標相關性的熱力圖


結果顯示,波動率指標以及一些動量指標都是高度相關的。在刪除所有重複的特徵(每個類型中相關性的絕對平均值大於 0.5 的特徵)之後,我們將剩餘的 38 個技術特徵添加到交易智能體的觀察空間中。

在代碼中,我們需要創建一個名為 add_indicators(添加指標)的函數來將這些特徵添加到數據幀中,為了避免在每個時間步長中重複計算這些特徵,我們只在交易智能體環境初始化的過程中調用 add_indicators 函數。

回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

交易智能體環境初始化的代碼 initialize_env.py


在這裡,初始化交易智能體環境,在進行數據平穩性處理之前將特徵添加到了數據幀中。


統計分析

接下來我們需要添加預測模型。

由於季節效應自迴歸移動平均模型(Seasonal Auto Regressive Integrated Moving Average,SARIMA)可以在每個時間步長中快速計算價格的預測值,在平穩數據集中運算非常準確,因此我們使用它來進行加密貨幣幣價預測。

除了上述這些優點之外,該模型實現起來非常簡單,它還可以給出預測值的置信區間,通常情況下這比單獨給出一個預測值能提供更多的信息。就比如說,當置信區間較小時,交易智能體就會更相信這個預測值的準確性,當置信區間很大時交易智能體就知道要承擔更大的風險。

回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

加入 SARIMA 預測模型的代碼 add_sarimax_predictions.py


這裡我們將 SARIMAX 預測模型和置信區間添加到交易智能體的觀察空間中。

現在我們已經使用性能更好的循環神經網絡更新了策略,並使用特徵工程的方法改進了交易智能體的觀察空間,是時候優化其他的部分了。


獎勵優化

有些人可能會覺得上一篇文章中的獎勵函數(即獎勵資產總價值不斷增加)已經是最好的解決方案了,但是,通過進一步的研究我發現獎勵函數還有提升的空間。雖然我們之前使用的簡單獎勵函數已經能夠獲得收益,但它給出的投資策略非常不穩定,往往會導致資產的嚴重損失。為了改善這一點,除了考慮利潤的增加以外,我們還需要考慮其他獎勵的指標。

獎勵指標的一個簡單改進就是,不僅僅獎勵在比特幣價格上漲時持有比特幣帶來的利潤,還獎勵在比特幣價格下跌時拋售比特幣而避免的損失。就比如說,我們可以獎勵智能體買入比特幣而總資產增加的行為,以及賣出比特幣避免總資產減少的行為。

雖然這種獎勵指標在提高收益率方面非常出色,但這樣做並沒有考慮到高回報帶來的高風險。投資者早已發現這種簡單投資策略背後存在的漏洞,並將其改進成一種風險可調節的獎勵指標。

基於波動率的獎勵指標

這種風險可調節的獎勵指標中的典型就是夏普比率(Sharpe Ratio,又被稱為夏普指數)。它計算的是特定時間段內投資組合的超額收益與波動性的比率。具體的計算公式如下:


回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

夏普比率的計算公式:(投資組合的收益-大盤的收益)/投資組合的標準差


從公式中我們可以得出,為了保持較高的夏普比率,投資組合必須同時保證高收益和低波動性(也就是風險)。

作為一種獎勵指標,夏普比率經受住了時間的考驗,但它對於自動交易智能體來說並不是很完美,因為它會對上行標準差( upside volatility )產生不利影響,而在比特幣交易環境中有時我們需要利用上行標準差,因為上行標準差(即比特幣價格瘋狂上漲)通常都是很好的機會窗口。

而使用索提諾比率( Sortino Ratio )可以很好地解決這個問題。索提諾比率與夏普比率非常相似,只是它在風險上只考慮了下行標準差,而不是整體標準差。因此,索提諾比率並不會對上行標準差產生什麼不利影響。因而我們給交易智能體的第一條獎勵指標就選擇索提諾比率,它的計算公式如下:

回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

索提諾比率的計算公式:(投資組合的收益-大盤的收益)/投資組合的下行標準差


其他獎勵指標

我們選擇 Calmar 比率作為交易智能體的第二個獎勵指標。到目前為止,我們所有的獎勵指標都沒有考慮到比特幣幣價最大回撤率(drawdown)這個關鍵因素。

最大回撤率是指比特幣幣價從價格頂峰到價格低谷之間的價值差,用來描述買入比特幣後最糟糕的情況。


最大回撤率對我們的投資策略來說是致命的,因為只需一次幣價突然跳水,我們長時間累積的高收益就會化為烏有。

回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

最大回撤率


為了消除最大回撤率帶來的負面影響,我們需要選用可以處理這種情況的獎勵指標,就比如說選用 Calmar 比率。該比率與夏普比率類似,只是它將分母上投資組合的標準差替換為最大回撤率。


回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

Calmar 比率的計算公式:(投資組合的收益-大盤的收益)/最大回撤率


我們最後一個獎勵指標是在對衝基金行業中廣泛使用的 Omega 比率。從理論上來說,在衡量風險與收益時,Omega 比率應該優於 Sortino 比率和 Calmar 比率,因為它能夠在單個指標中使用收益的分佈來評估風險。

計算 Omega 比率時,我們需要分別計算在特定基準之上或之下投資組合的概率分佈,然後兩者相除計算比率。Omega 比率越高,比特幣上漲潛力超過下跌潛力的概率就越高。


回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

Omege 比率的計算公式


Omega 比率的計算公式看起來很複雜,不過不要擔心,在代碼中實現它並不難


代碼實現

雖然說編寫每個獎勵指標的代碼聽起來很有意思且很有挑戰性,但這裡為了方便大家的理解,我選擇使用 Python 量化金融程序包 empyrical 來計算它們。幸運的是,這個程序包中恰好包含了我們上面定義的三個獎勵指標,因而在每個時間步長中,我們只需要將該時間段內收益和大盤收益的列表發給 Empyrical 函數,它就會返回這三個比率。

回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...


使用 empyrical 程序包計算三個獎勵指標的代碼 risk_adjusted_reward.py


在代碼中,我們通過預先定義的獎勵函數設置了每個時間步長的獎勵。

到目前為止,我們已經確定瞭如何衡量一個交易策略的成功與否,現在是時候弄清楚哪些指標會帶來較高的收益。我們需要將這些獎勵函數輸入到自動超參數優化軟件框架 Optuna 中,然後使用貝葉斯優化來的方法為輸入數據集尋找最優的超參數。


工具集

俗話說,好馬配好鞍。任何一個優秀的技術人員都需要一套好用的工具,否則就會巧婦難為無米之炊。

但我並不是說我們要重複造輪子,我們應該學會使用程序員前輩用禿頭的代價為我們開發的工具,這樣他們的工作也算沒有白費。對於我們所開發的交易智能體,它要用到的最重要的工具就是自動超參數優化軟件框架 Optuna,從原理上來說,它使用了樹結構的 Parzen 窗估計(Tree-structured Parzen Estimators,TPEs)來實現貝葉斯優化,而這種估計方法是可以並行化運行的,這使得我們的顯卡有了用武之地,執行搜索需要的時間也會大大縮短。簡而言之,

貝葉斯優化是一種搜索超參數空間以找到能最大化給定目標函數的超參數的高效解決方案。

也就是說,貝葉斯優化能夠有效地改進任何黑箱模型。從工作原理上來說,貝葉斯優化通過使用替代函數( surrogate functions )或是替代函數的分佈對要優化的目標函數進行建模。隨著時間的推移,算法不斷地檢索超參數空間以找到那些能夠最大化目標函數的超參數,分佈的效果也會逐漸改善。

理論說了這麼多,我們要如何把這些技術應用在比特幣自動交易智能體中呢?從本質上來講,我們可以使用這種技術來找到一組最優的超參數,使得智能體的收益率最高。這個過程就像是在超參數的汪洋大海中撈取一根效果最好的針,而貝葉斯優化就是帶我們找到這根針的磁鐵。讓我們開始吧。

使用 Optuna 優化超參數並不是什麼難事。

首先,我們需要創建一個 optuna 實例,也就是裝載所有超參數試驗的容器。在每次試驗中我們需要調整超參數的設置來計算目標函數相應的損失函數值。在實例初始化完成後,我們需要向其中傳入目標函數然後調用 study.optimize() 函數開始優化,Optuna 將使用貝葉斯優化的方法來尋找能夠最小化損失函數的超參數配置。


回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

使用 Optuna 程序庫貝葉斯優化的代碼 optimize_with_optuna.py


在這個例子中,目標函數就是在比特幣交易環境中訓練並測試智能體,而目標函數的損失值則定義為測試期間智能體平均收益的相反數,之所以給收益值加上負號,是因為平均收益越高越好,而在 Optuna 看來損失函數越低越好,一個負號剛好解決這個問題。optimize 優化函數為目標函數提供了試驗對象,代碼中我們可以指定試驗對象中的變量設置。

回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

優化目標函數的代碼 optimize_objective_fn.py


optimize_ppo2 優化智能體函數和 optimize_envs 優化智能體環境函數接收試驗對象作為輸入並返回包含要測試參數的字典。每個變量的搜索空間由 suggest 函數進行設置,我們需要在試驗中調用 suggest 函數並給函數中傳入指定的參數。

比如說,如果設置參數在對數尺度上服從均勻分佈,即調用函數

trial.suggest_loguniform('n_steps',16,2048),

相當於給函數了一個 16-2048 之間的 2 的指數次方(如16,32,64,…,1024,2048)的新浮點數。

再者,如果設置參數在普通尺度上服從均勻分佈,即調用函數

trial.suggest_uniform('cliprange',0.1,0.4),

相當於給函數一個 0.1 到 0.4 之間的新浮點數(如0.1,0.2,0.3,0.4)。

相信你已經看出來了其中的規律,就是這樣來設置變量:

suggest_categorical('categorical',['option_one','option_two']),其中 categorical 為設置變量的策略, option_one 和 option_two 分別為變量的兩個選項,在剛才的函數中這兩個選項為變量的範圍,弄懂了這個相信下面的代碼就難不倒你了。

回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

化交易智能體的代碼 optimize_ppo2.py


回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

優化交易環境的代碼 optimize_envs.py


代碼寫好後,我們在一臺高性能服務器上以 CPU/顯卡協同運算的方式運行了優化函數。在設置中,Optuna 創建了一個 SQLite 數據庫,我們可以從中加載優化的實例。該實例記錄了測試過程中性能最好的一次試驗,從中我們可以推算出智能體交易環境中最優的超參數集。

回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

加載 optuna 實例的代碼 load_optuna_study.py


到這裡,我們已經改進了模型,改進了特徵集,並優化了所有的超參數。但俗話說,是騾子是馬得拉出來遛遛。

那麼,交易智能體在新的獎勵指標下表現如何呢?

在訓練過程中,我分別使用了利潤、Sortino 比率、Calmar 比率和 Omega 比率四個獎勵指標來優化智能體。接下來我們需要在測試環境中檢驗哪種獎勵指標訓練出來的智能體收益最高,當然了,測試環境中的數據都是智能體在訓練過程中從未見到過的比特幣價格走勢,這樣保證了測試的公平性。


收益比較

在查看結果之前,我們需要知曉一個成功的交易策略是什麼樣的。出於這個原因,我們將針對一些常見且有效的比特幣交易策略進行基準測試。令人震驚的是,在過去的十年中一個最有效的比特幣交易策略就是買入並持有,而另外兩個不錯的交易策略則是使用簡單但有效的技術分析來生成買入/賣出信號,從而指導交易。

1、買入並持有

這種交易策略指儘可能多地購買比特幣並一直持有下去(也就是區塊鏈社區中的江湖黑話“ HODL ”)。雖然說這種交易策略並不是特別複雜,但在過去這樣做賺錢的機率很高。

2、相對強弱指數分歧(Relative Strength Index(RSI) divergence )

當相對強弱指數持續下跌且收盤價持續上漲時,這就是需要賣出的信號,而當相對強弱指數持續上漲且收盤價持續下跌時,就是需要買入的信號。

3、簡單移動平均線( Simple Moving Average,SMA )交叉

當長期簡單移動平均線超過短期簡單移動平均線時,這就是需要賣出的信號,而當短期簡單移動平均線超過長期簡單移動平均線時,就是需要買入的信號。

你可能會問,為什麼要做這些簡單的基準測試呢?這樣做是為了通過比較證明我們的強化學習交易智能體可以在比特幣市場上發揮作用,如果智能體的收益連這些簡單的基準收益都超不過,那麼我們就相當於花費了大量的開發時間和顯卡算力來進行了一場天馬行空的科學實驗。現在,讓我們來證明事實並非如此。


實驗結果

我們的數據集選用從加密貨幣數據網站 CryptoDataDownload 上下載的每小時收盤價位置價值( OHCLV )數據,其中前 80% 的數據用來訓練智能體,後 20% 作為全新的數據進行測試,以瞭解智能體的收益能力。當前這種簡單的交叉驗證形式足以滿足我們的需求,而如果這個比特幣自動交易智能體真的走向生產就緒,我們就可以使用全部的數據集進行訓練,然後在每天新產生的數據集上進行測試。

廢話不多說,我們來看看結果。

可以看到,使用 Omega 比率作為獎勵指標的智能體在測試階段並沒有讓人眼前一亮的交易

回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

使用 Omega 比率作為獎勵指標的智能體在超過 3500 小時的交易時間裡資產的總價值


分析智能體所進行的交易我們可以發現,很明顯 Omega 比率這種獎勵指標產生了過度交易(over-trade)的交易策略,以至於智能體未能抓住市場機會獲得收益。

使用 Calmar 比率作為獎勵指標的智能體與使用 Omega 比率作為獎勵指標的智能體相比略有改進,但最終結果非常相似。看起來像是我們投入了大量的時間和精力,只是為了讓事情變得更糟......

回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

使用 Calmar 比率作為獎勵指標的智能體在超過 3500 小時的交易時間裡資產的總價值


如果僅使用利潤作為獎勵指標效果如何呢?在上一篇文章中這種獎勵指標被證明有點失敗,這次做的所有修改和優化能否化腐朽為神奇呢?

在為期四個月的測試周期內,使用利潤作為獎勵指標的智能體平均收益達到賬戶初始金額的350%。你可能已經被這個結果嚇呆了。這應該就是強化學習能達到的巔峰了吧,對吧?

回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...

使用利潤作為獎勵指標的智能體在超過 3500 小時的交易時間裡資產的總價值


並不是這樣的。使用 Sortino 比率作為獎勵指標的智能體平均收益達到了賬戶初始金額的850%。當我看到這個數字時,我都不敢相信自己的眼睛,以至於我立馬回去檢查代碼中是否存在問題。但經過徹底的檢查後,很明顯代碼中沒有任何錯誤,也就是說這些智能體已經知道如何進行比特幣交易。

回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...


使用 Sortino 比率作為獎勵指標的智能體在超過 3500 小時的交易時間裡資產的總價值


看起來使用 Sortino 比率作為獎勵指標的智能體學習到了在最小化持有比特幣風險的前提下低價買入和高價賣出的重要性,同時它們還躲過了過度交易和投資不足兩大陷阱。雖然說智能體學到的具體交易策略我們不得而知,但是我們可以清楚地看到智能體已經學會通過交易比特幣獲得收益了。

如果你不信,請看下圖。


回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...


使用 Sortino 比率作為獎勵指標的智能體正在交易比特幣,

其中綠色的三角形表示買入信號,紅色的三角形表示賣出信號。


現在,我並沒有被實驗成功的興奮衝昏頭腦。我清楚地知道比特幣自動交易智能體還遠遠沒有達到生產就緒。話雖如此,但這些結果比我迄今為止看到的任何交易策略都要令人印象深刻。而且令人震驚的是,我們並沒有告訴智能體關於加密貨幣市場如何運作、如何在加密貨幣市場上賺錢這樣的先驗知識,而是僅靠智能體重複地試驗和試錯就達到了這麼好的效果,不過,這裡經過了很多很多次的試驗和試錯。

寫在最後

在本篇文章中,我們優化了基於強化學習的比特幣自動交易智能體,讓它在交易比特幣時做出更好的決策,從而獲得更多的收益!在這個過程中我們花費了大量的時間和精力,也遇到了很多的困難,我們把困難分解細化再逐個攻破,最終完成了智能體的優化,其中具體的操作步驟如下:

  • 使用循環神經網絡升級現有模型,即升級成使用平穩性數據的長短期記憶網絡;
  • 使用領域知識和統計分析進行特徵工程,為智能體提供了 40 多個用來學習的新特徵;
  • 將投資的風險引入智能體的獎勵指標,而不只是關注利潤;
  • 使用貝葉斯優化來尋找模型中最優的超參數;
  • 使用常見的交易策略進行基準測試,以確保智能體的收益可以跑贏市場。


從理論上來說,這個高收益的交易智能體已經做得很不錯了。

但是,我收到了相當多的反饋,他們聲稱交易智能體只是在學習擬合曲線,因此,面對生產環境中的實時數據,交易智能體永遠不可能獲得收益。雖然我們在不同數據集上訓練/測試智能體的方法應該能夠解決這個問題,但是模型確實會有過度擬合數據集的可能,並且可能不會很好地推廣到實時數據。話雖這麼說,但在我看來這些交易智能體學習到的遠遠不只是簡單的曲線擬合,因此,我認為它們能夠在實時交易的場景中獲得收益。

為了檢驗這個想法,接下來的一段時間裡我會把這些基於強化學習的智能體帶到生產環節,為此,我們首先要更新智能體的運行環境以支持以太幣、萊特幣等其他加密貨幣,然後我們將升級智能體讓它可以在加密貨幣交易所 Coinbase Pro 上實時交易。

這將會是一個激動人心的實驗,請不要錯過它。

需要強調的是,本篇文章中所有的方法和投資策略都是出於教育目的,不應被視為投資建議。我們的比特幣自動交易智能體也遠遠沒有達到實際生產層面,所以請管好自己的錢包

參考資源:

1)基於 Python 語言和 Tensorflow 框架的循環神經網絡和長短期記憶網絡教程

https://adventuresinmachinelearning.com/recurrent-neural-networks-lstm-tutorial-tensorflow/

2)淺析基於 Python 語言的季節效應自迴歸移動平均模型預測時間序列

https://machinelearningmastery.com/sarima-for-time-series-forecasting-in-python/

3)淺析基於 Python 語言的非平穩性時間序列處理

https://www.analyticsvidhya.com/blog/2018/09/non-stationary-time-series-python/

4)超參數優化算法

https://papers.nips.cc/paper/4443-algorithms-for-hyper-parameter-optimization.pdf

5)機器學習方法在金融領域中的最新進展

https://dwz.cn/iUahVt2u


V神來北京啦!6月29-30日,2019第二屆以太坊技術及應用大會將在北京重磅開啟,屆時V神將攜以太坊核心團隊與國內外區塊鏈大咖帶來眾多以太坊開發乾貨包括

  • 以太坊2.0進展及未來動向
  • 信標鏈、鏈下(Layer2)、Casper、Plasma新動態及核心原理
  • 安全、零知識證明、De-Fi、擴容、PoS算法等熱門話題
  • 合約開發、Dapp開發、區塊鏈遊戲開發與設計、數據存儲等技術實踐
  • 開發工具與技術選型
  • 國內區塊鏈的發展與以太坊的新機遇


由於乾貨過於密集,小夥伴們要做好燒腦的心理準備哦!掃描下圖二維碼立享優惠,名額有限,先到先得!


回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...



大會第二天,「以太坊開發訓練營」也如期開幕,在前一天眾多嘉賓演講的洗禮之後,再和技術大牛一起 coding !是不是更爽?具體詳情如下:

回報率850%? 用Python優化的比特幣交易機器人簡直太燒腦了...


相關推薦

推薦中...