當前位置:
首頁 > 新聞 > 能用強化學習買賣比特幣賺錢嗎?能能能,當然能!

能用強化學習買賣比特幣賺錢嗎?能能能,當然能!

雷鋒網 AI 科技評論按:人工智慧熱潮還沒過去,電子貨幣和區塊鏈的熱潮又滾滾而來。以 BTC(比特幣)為代表的電子貨幣近半年來吸引了全世界的注意力,每個人都想在這個熱潮中分一杯羹 —— 只不過,不是每個人都賺到錢了,尤其是經驗不足的投資者們。

那麼問題來了,現在人工智慧技術也有了長足進步,連 AlphaGo 在打敗柯潔之後都還能繼續進化,可以對圍棋無師自通,所以我們有沒有機會同樣用 AlphaGo 所用的強化學習(Reinforcement Learning)方法學習一個百戰百勝的電子貨幣人工智慧呢?

斯坦福大學計算機系畢業生、曾在谷歌大腦團隊研究機器翻譯、對話建模和總結的深度學習研究員 Denny Britz 近日就在一篇博客中發表了自己的觀點並介紹了相關入門知識。他認為訓練基於強化學習的交易人工智慧不僅可行,而且還是一個非常有價值的研究課題。雷鋒網 AI 科技評論把這篇博客全文翻譯如下。

能用強化學習買賣比特幣賺錢嗎?能能能,當然能!

深度學習的學術研究人員們一直以來都和金融投資市場保持了相當的距離。這可能是由於金融界的名聲不好,或者是這個問題從研究的角度來看不夠有趣,也可能是因為獲得數據太貴太困難。

我會在這篇文章中論證這個觀點:訓練一個強化學習智能體在金融(以及加密貨幣)市場中交易也可以是一個非常有意思的研究課題。我覺得學術研究界並沒有給這個問題給予足夠的重視,但其實這個問題有潛力推動許多相關領域的技術發展。這個問題和訓練 DotA 之類的多玩家遊戲智能體很像,其它類似的問題也還有很多。不過由於之前對投資交易沒有任何理解,我自己做這個項目花了好幾個月的時間。

請注意,我要研究的問題並不是「用深度學習預測價格」。所以如果你想看這方面的示例代碼和模型的話恐怕要失望了。我想從更高的層次仔細聊聊為什麼用機器學習的方法學習交易很困難,以及我覺得強化學習可以完美替代哪一部分。如果大家對這個問題的興趣足夠濃厚,我可能未來會再發一篇文章介紹一些實證例子。

我估計這篇文章的大多數讀者都沒有什麼投資交易經驗,就像我當時也是從頭學起一樣,所以我會首先介紹一些基本情況。這篇文章中我會以加密貨幣交易作為例子來分析,不過這一套想法同樣適用於大多數的其它金融市場。我選擇加密貨幣的理由是因為數據是免費的、公開的、便於獲得,而且每個人都可以參與交易。在其它金融市場進行交易的門檻要高一些,獲取數據也要貴一些。

加密貨幣交易市場的基本微觀結構

加密貨幣市場(以及大多數金融市場)的交易都是以我們稱作「帶有開放式掛單列表的連續雙重拍賣」的方式在交易平台上內進行的。這種說法有點生硬,其實就是說這裡有買家和賣家,經過交易平台撮合之後他們就可以相互交易了。加密貨幣的交易平台已經有好幾十個,每個交易平台支持的幣種都有所不同。不過從界面和提供的數據角度來看,都是大同小異。

我們來看看 GDAX,這是美國開設的交易平台里最熱門的之一。假設你要交易的是「BTC-美元」交易對(用美元換比特幣),那麼進入交易界面以後,你看到的大概是這樣的畫面。

能用強化學習買賣比特幣賺錢嗎?能能能,當然能!

頁面上提供了很多信息,我們從基礎的開始一項項看。

價格走勢圖(中央)

能用強化學習買賣比特幣賺錢嗎?能能能,當然能!

圖中給出的當前價格是來自於最近完成的交易的。根據最近發生的交易是買入還是賣出,這個價格會不斷變化。價格走勢圖通常會以 K 線圖的方式來顯示,其中的每一條紅色或者綠色的豎線就表示了那個時間段的開盤價、最高價、最低價、以及收盤價。在上面這張圖中,每一條豎線的時間段是 1 個小時,不過這個長短也可以自由選擇。價格線下方的柱狀線表示成交量,表示的是對應時間段內發生的所有交易的總量為多少。成交量也是一個重要指標,因為它可以體現出市場的流動性。比如假設你想買十萬美元的比特幣,但是沒有人願意賣,那市場的流動性就非常差;也就是說你買不到。高成交量表示很多人都願意參與交易,同時也就代表著你可以在願意的時候隨時進行買賣。總體來講,當你越想投資很多錢的時候,你就越希望看到很高的成交量。成交量同時也體現了價格趨勢的「質量」。高成交量下的價格趨勢變化要比低成交量下的價格趨勢變化更可靠。大多數時候,高成交量表示市場內的相當多參與者之間達成了共識(也有例外的情況,比如當存在市場操控行為的時候)。

交易歷史(右側)

能用強化學習買賣比特幣賺錢嗎?能能能,當然能!

右側的列表顯示了所有近期完成的交易。每個交易都有成交量、價格、時間戳以及方向(買入還是賣出)。交易是掛單者和吃單者之間匹配完成的。下面還會詳細解釋。

掛單列表(左側)

能用強化學習買賣比特幣賺錢嗎?能能能,當然能!

頁面左側的這個就是掛單列表了,裡面的信息就是誰想要在什麼價格買入或者賣出多少。掛單列表分為了兩個部分,買單(bids)以及賣單(asks)。根據交易規則,賣一價(best ask)是所有當前交易者里願意賣出的最低價,它需要高於所有當前交易者里願意買入的最高價,即買一價(best bid)。如果新增加的買單價格高於賣一價,那麼這筆交易就會立即成交;如果新增加的賣單價格低於買一價,同樣會立即成交。

每一筆掛單都有自己的價格和數量,比如圖中賣一是數量為 0.012、價格為 7886.98 的賣單,意味著你可以從這位交易者手上以 $7886.98 的價格買到 0.012 個 BTC。而如果你想要買的數量超過 0.012 個 BTC,你就還需要從列表中更高一位、報價更高的賣家手裡再買入一部分。成交之後的賣單就會從掛單列表裡消失,直到新增的賣單或者新增的買單補充了被剛才的交易清空的價位。換句話說,當你買入或者賣出的時候,你實際上就改變了掛單列表裡的買賣單分布。如果你買入或者賣出的量足夠大,你可能就會大幅改變掛單列表的狀況,並且影響到當前價格。

另外值得注意的是,你實際付出的錢要多於「數量 x 價格」,GDAX 對每筆交易收取 0.3% 的手續費,在整個金融市場中都算是比較高的,其它多數加密貨幣交易平台通常是在 0.1% 到 0% 之間。

更多細節信息以及操作指導可以搜索或者在交易平台體驗一下,這裡就不介紹更多了。

數據

我這篇文章選擇研究加密貨幣的主要原因就是因為數據是公開、免費、便於獲取的。多數交易平台都支持流傳輸 API,可以實時獲取交易平台的數據更新。在這裡繼續用 GDAX 作為例子獲取數據,不過其實其它交易平台的數據也差不多。我們從頭開始做一下構建機器學習模型需要的各個基本步驟。

交易 - Trade

假定一筆交易剛剛發生了。每筆交易的信息里都包含時間戳、交易平台給定的唯一交易 ID、價格、成交量以及方向。如果想要根據交易信息做出 K 線圖的話,設定一個時間窗口,然後統計每個時間窗口內的開盤價、最高價、最低價、以及收盤價,再把它們畫出來就好了。


{

"time": "2014-11-07T22:19:28.578544Z",

"trade_id": 74,

"price": "10.00000000",

"size": "0.01000000",

"side": "buy"

}

掛單列表更新 - BookUpdate

假定掛單列表裡的掛單更新了。每個掛單的信息都包含方向、價格以及這個價格的數量。注意這樣獲取到的數據只是掛單列表發生了變化的那一部分,要獲取整個掛單列表的話還需要自己進行合併。


{

"type": "l2update",

"product_id": "BTC-USD",

"changes": [

["buy", "10000.00", "3"],

["sell", "10000.03", "1"],

["sell", "10000.04", "2"],

["sell", "10000.07", "0"]

]

}

掛單列錶快照 - BookSnapshot

這和掛單列表更新類似,不過這是整個掛單列表。由於完成的掛單列表會很大,獲取一次完成列表之後都使用掛單列表更新會更快、更有效率。不過偶爾用一下整個掛單列表也還是很有用的。


{

"type": "snapshot",

"product_id": "BTC-EUR",

"bids": [["10000.00", "2"]],

"asks": [["10000.02", "3"]]

}

關於市場數據,差不多知道這麼多就夠了。以上這幾個事件獲取到的數據流也就是 GDAX 的網頁用戶界面上的所有信息。

幾個交易指標

在開發交易演算法的時候,要以什麼作為優化目標呢?一個很明顯的答案自然是「盈利」,但其實故事並沒有這麼簡單。你不僅需要把你的交易策略和基準線對比,而且你還需要評估它相比其它投資方式的風險和穩定性。下面我會簡單列舉幾個交易者們最常用的基本指標。

凈利潤/凈損失 Net PnL

一段時間內演算法賺到多少錢(正值)或者賠了多少錢(負值)的直接計算,另外還要記得扣除手續費。

Alpha & Beta

Alpha 形容的是,相比另一種風險相對更小的投資方式,比如國債,這項投資的收益率能高出高多少。比如,相比國債的 Alpha 是 1%,就意味著在同一段時間內的收益率高出國債 1%。Beta 也與此相關,它形容的是你的投資策略相比整個市場的不穩定性有多大。比如 Beta 為 0.5 就代表,當整個市場的價格增加 $2 時,你的投資收益為 $1。

夏普比率 Sharpe Ratio

夏普比率代表著每一份增加的風險所能帶來的收益的多少,比如每增加 1% 的風險,增加的收益是 2% 還是 3%,顯然越大越好。它的計算過程不僅考慮到了策略的不穩定性,而且也考慮到了轉向其它風險更低的投資方式的可能性。

最大跌幅 Maximum Drawdown

最大跌幅形容的是一個局部極大值和緊接著的局部極小值之間的差距,是另一個針對風險的指標。比如,最大跌幅為 50% 的策略意味著某個時候你有可能會損失 50% 的資金。那麼接下來你的資金要翻一倍才能補回原來的數目。顯然,最大跌幅同樣是越小越好。

風險價值 Value at Risk

風險價值也是一個偏向於風險的指標,假定市場運行正常的話,它在嘗試量化在給定的時間窗口內損失一定資金的概率如何。比如,「1天 - 5% - 10% 的 VaR」代表一天之內有 5% 的可能性在投資中損失超過 10%。

監督學習

在從強化學習的角度研究這個問題之前,我們先看看用監督學習的方式創建一個能盈利的交易演算法會是什麼樣的。我們也就會看到這樣做有什麼問題,以及為什麼我們會需要強化學習的方法。

最明顯的一種解決方案就是預測價格。如果我們能預測市場價格會漲還是會跌,那麼只要低買高賣就好了。然而,這種思路有幾個問題。

首先,我們到底要預測什麼價格?正如前文對掛單列表的分析所說,買賣的時候其實並不是針對單個價格的。最終付出的價格要看掛單列表裡的掛單量,以及所付的手續費。簡單直接的做法自然是預測價格中點,即買一和賣一價格的平均數。這也是多數研究者的做法。然而,這個價格只是一個理論價格,並不是一個可以真的進行交易的價格,而且很可能和真實交易時的實際價格相去甚遠。

下一個問題是時間間隔。我們要預測的價格是下一筆交易的、下一秒的、下一分鐘的、下一小時的還是下一天的?僅憑直覺來看,要預測價格的時間點距離當前越遠,預測結果的不確定性就越高,預測問題的難度也就越高。

下面舉個例子。假設當前比特幣價格是 $10,000,然後我們準確地預測了一分鐘之後價格會上漲到 $10,050。那麼這代表著我們可以從這次低買高賣中賺到 $50 嗎?我們分析看看。

  • 當我們買入的時候,賣一價是 $10,000。大多數情況下我們可能沒法以 $10,000 的價格買到全部的 1.0 BTC,因為掛單列表裡一般不會有足夠的量。很可能我們不得不在 $10,000 買到 0.5BTC,在 $10,010 買到另外 0.5BTC,平均價格為 $10,005。在 GDAX 上我們還要支付 0.3% 的手續費,這差不多是 $30。

  • 一分鐘過去了,價格漲到了 $10,050 了。現在我們要賣出,然而市場變化速度很快,很可能當我們下單的時候價格又變了。假設現在是 $10,045 吧,然後和買入的時候類似,我們很可能沒辦法在這個價格賣出全部的 1.0BTC,不得不在 $10,045 賣出 0.5BTC,然後在 $10,040 賣出另外 0.5BTC,平均價格 $10,042.5。然後還有 0.3% 的手續費,差不多也是 $30。

那麼,這一筆交易賺了多少錢呢?-10005 - 30 - 30 + 10,042.5 = -$22.5。結果是並沒有賺到錢,雖然我們成功預測了價格上漲,但我們反而賠了 $22.5。上面的這個例子就顯示出了實際操作中會遇到的三個問題:賣一價/買一價的流動性不夠,網路延遲,以及手續費,這三件事都不是監督學習模型可以處理得了的。

從這裡我們能學到什麼呢?要憑藉一個簡單的價格預測策略就掙錢,我們就需要在更長的時間內預測相對大幅度的價格變化,或者非常精細地處理手續費和掛單。時間一旦變長,預測就變成了一個很難的問題;處理手續費和掛單也還需要單獨構建一個複雜的系統來處理。

監督學習的方法還有一個大問題,就是沒法從它裡面推導出一個策略。在上面的例子里,我們買入是因為預測到價格會上漲,而且也確實上漲了,一切都基本按照計划進行。可是如果價格是下降的怎麼辦,那就賣出嗎?還是繼續持有等待?假如價格又小幅上漲了一點點然後繼續下降了怎麼辦?以及如果我們對預測的結果不那麼確定,認為 65% 的可能性漲、35% 的可能性跌,那麼還要買入嗎?如何設定是否下單的閾值?

所以,如果要以監督學習的方式解決,僅僅一個預測模型是完全不夠的(除非你的模型非常準確、非常魯棒)。我們還需要一個基於規則的策略模型,把價格預測的結果作為數據,決定具體要怎麼做。那麼這個策略又要從何而來呢?如何優化策略的參數和做決定的閾值?這幾個問題都不那麼好解決,很多人會用簡單的啟發式方法,又或者直接憑人的直覺設定。

典型的策略設計工作流程

幸運的是,以上的許多問題都有解決方案。然而壞消息也有,就是這些方案並不怎麼高效。我們來看看交易策略開發的典型工作流程,大概長下面這樣:

  1. 數據分析:對數據進行探索性的分析,嘗試找到交易機會。你可能要看許多不同的圖表、計算統計數據等等。這一步的輸出是一個交易策略的「理念」,而且等待驗證。

  2. 監督學習模型訓練:如果有必要的話,你可能要訓練一個到多個監督學習模型用來預測能支撐你的交易策略發揮作用的數據點位。比如價格預測、交易量預測等等。

  3. 策略開發:你需要嘗試寫一個基於規則的策略,根據市場的當前狀況和監督學習模型的預測決定採取什麼動作。請注意,這個策略也會包含一些參數,比如決定閾值,這也需要通過優化學習,只不過可以稍後再做。

  4. 策略內部測試:在模擬器中根據歷史數據測試交易策略的初始版本。模擬器中可以包含掛單列表流動性、網路延遲、手續費等等因素。如果策略在模擬器中的表現還不錯,那麼你就可以進行下一步的參數優化。

  5. 參數優化:你可以用網格搜索這樣的搜索方法,嘗試策略中的參數的不同的值,比如閾值、相關係數等等,同樣在模擬器和歷史數據上進行測試。注意,如果對歷史數據擬合了會造成很大的風險,準備驗證數據集和測試數據集的時候一定要小心。

  6. 模擬運行以及紙面交易:在真的讓交易策略上線運行之前,在本地根據實時獲取的新市場數據進行新一輪模擬。這叫做紙面交易,可以幫助防止過擬合。直到交易策略在紙面交易中的表現很好之前,都不要急於讓它上線進行真正的交易。

  7. 上線交易:確認沒有問題後,用 API 把交易平台和策略連接起來,開始真實的買入賣出。

這是一個非常複雜的過程。根據不同的機構或者研究人員,這個流程可能會稍有不同,但是交易策略開發基本上就是按照這個順序做下來的。那麼,為什麼我認為這個過程效率很低呢?原因有下面幾個:

  • 迭代周期很長。第一步到第三步很大程度依靠的是做事的人自己的直覺,直到做到第四步、第五步你才會知道自己想的策略效果如何,然後很有可能會導致你推倒重來。實際上,這裡每一步都有失敗的風險,逼得你不得不從頭開始。

  • 模擬測試的步驟太靠後了。直到第四步模擬的時候你才開始顯式地考慮延遲、交易費用、流動性之類的環境因素。可是難道這些因素不應該在一開始設計策略的時候就考慮在內,或者直接作為模型參數的一部分么?

  • 交易策略和監督學習模型是分別獨立設計的,然而實際上它們之間是需要緊密協作的。既然監督學習模型的輸出需要作為策略的輸入,那麼聯合優化它們兩者不是更好么?

  • 交易策略很可能會太簡單。人類所能想到、能明確描述的東西太有限了。

  • 參數優化過程效率太低。比如說,我們假設你優化的目標是收益和風險的綜合值,然後你希望優化找到一組能帶來最高的夏普比率的參數。相比於高效的基於梯度的方法,你這裡只能用低效的網格搜索,然後希望運氣好可以試到好的參數(同時還不要過擬合)。

那麼,下面我們就看看強化學習能如何應對上面的大多數問題。

用於交易的強化學習模型

我們首先回憶一下,傳統的強化學習問題可以用馬爾可夫決策過程(MDP)描述。首先我們有一個在環境中做出行動的智能體,在第 t 步時智能體把環境的目前狀態 St作為自己的輸入,然後做出行為 At;接著在 t+1 步中接收到反饋 Rt+1以及更新的環境狀態 St+1。智能體根據某個策略 π:At= π(St) 選擇自己的行為。那麼我們的目標就是找到一個能夠在某個有限或者無限長的時間內最大化累積反饋 ∑Rt的策略。

能用強化學習買賣比特幣賺錢嗎?能能能,當然能!

下面我們看看這些符號在交易環境下都分別對應什麼。

智能體

從最簡單的開始。這個智能體就是我們的交易智能體。你可以把智能體看作是一個仿人類的交易者,它會打開交易所,看著交易平台的用戶界面,然後根據交易平台的目前狀態和自己賬戶里的資金做出交易決定。

環境

這裡開始有一點麻煩。顯然我們會認為交易平台就是我們的環境。不過有一點值得注意的是,同一個交易平台上還有很多別的智能體,有人類,也有一些基於演算法的自動交易程序。假設某個時刻我們以分鐘為級別做出行動,那麼就是做出一個行動,等待一分鐘,獲得一個新的環境狀態,再做出一個行動,周而復始。當我們觀察到了一個新的狀態之後,就會把它看作是市場環境的響應,其中當然也包含了其它參與者的響應。那麼從我們的智能體的角度出發的話,別的這些參與者也同樣是環境的一部分,而且還不受我們的控制。

然而,如果把其它的市場參與者(智能體)看作是整個大的、複雜的環境的一部分的話,我們就失去了顯式地對它們建模的機會。比如,想像我們學習到了如何對其它市場上運行的演算法和交易策略做反向工程,然後嘗試利用它們,這將是一件多麼美妙的事情啊。假如這樣做的話,我們就來到了一個多智能體強化學習問題的環境下,這正是一個熱門的研究領域;我稍後還會多說一點。不過目前,簡單起見,就先假設不考慮這部分,就認為我們就是在單個的、包含了所有其它智能體的行為的複雜環境裡面。

狀態

對於在交易平台做交易來說,我們觀測到的並不是環境的完整狀態。比如,我們並沒有辦法識別環境中的其它的智能體、它們的數量如何、每個人各自有多少賬戶餘額、各自有多少掛單之類的。這也意味著,我們要處理的是一個部分可觀察的馬爾可夫決策過程(POMDP)。智能體觀察到的並不是環境的真實狀態St,而是這個狀態的一部分衍生值。我們就把它稱作觀測值 Xt,它由全狀態的某個函數 Xt~ O(St) 計算得到。

在我們這個問題中,每一個時間步驟 t 中的觀測值僅僅是截至到 t 的所有交易平台發生的事件的歷史(參見前文「數據」小節)。這個事件歷史可以用來構建當前的交易狀態。不過,為了讓智能體能夠做出決策,還有一些其它的數據也應當包括在觀測值之內,比如當前的賬戶餘額、當前的掛單列表,等等。

時間尺度

我們也需要決定智能體的行動應該在怎麼樣的時間尺度上做出。每天、每小時、每分鐘、每秒、每毫秒,甚至可變時間尺度?這些不同的選擇就各自需要不同的方法。如果買入一種資產,持有它數天、數周甚至數月,基本上就可以認為這是長期投資,基於的分析是類似「比特幣未來會成功嗎」這樣的問題的。通常情況下,這類投資決定都是根據外部事件、新聞,以及對這種資產的價值和潛力的基本認識做出的。那麼這類分析基本上也就需要對整個世界的運轉規律有相當的認識,很難自動化地使用機器學習方法。在另一個極端上,我們也知道有高頻交易(HFT)這樣的技術,所有交易決定幾乎全部依賴於市場本身的微觀結構信號。這些決定需要在納秒尺度上做出,運行在 FPGA 硬體上的演算法簡單但是極為快速,掛單交易信息通過專門設立的線路連接並發送到交易平台。

從另一個角度上,可以把時間尺度看作是「人性」的體現,長期投資和高頻交易就分別在坐標的兩端。前者需要總體視角、需要對世界的運行規律有了解、需要人類的直覺和高層次分析,後者的全部奧妙則在於簡單但是極為高速的模式識別。

神經網路流行的原因之一就是因為,提供了許多數據之後可以學到比線性回歸或者樸素貝葉斯複雜得多的數據表徵。然而神經網路的速度要相對慢一些,沒法在納秒級的速度上做出預測,從而也就沒法和高頻交易演算法的速度競爭。所以我認為神經網路發揮作用的甜點應當就在這兩個極端當中的某處。我們希望選擇這樣一個時間尺度:在這個時間尺度上它分析判斷數據可以比人類更快,但同時也足夠聰明,可以勝過那些「快但是簡單」的演算法。我的猜測,僅僅是個人猜測,就是神經網路做出行動的理想時間尺度應當是在幾毫秒到幾分鐘之間。人類交易者也可以在這些時間尺度上做出行動,但是不見得會比演算法塊。而且綜合分析這同一段時間內的信息的速度也顯然是人類不如演算法。那這就是演算法的優勢。

另一個基於相對短的時間尺度做行動的原因是因為可能會讓數據中的模式顯得更明顯。比如,多數人類交易者觀察的都是完全一樣的(提供了有限信息的)圖形化用戶界面,有些人也會看預定義的行情分析信號(比如 MACD),那麼他們的行動就會受限於這些信號中體現的信息,最終表現為某些規律性的行為模式。類似地,交易平台中的自動化交易演算法也是基於某些模式運行的。我們就希望強化學習演算法可以發現這些模式、利用這些模式。

值得注意的是,我們也可以根據不同的信號觸發,在多個不同的時間尺度上做出行動。比如我們可以選擇一旦市場上出現了大額交易就做出動作。這樣的事件觸發的智能體也可以根據觸發事件的頻率總體對應某些時間尺度。

行為空間

在強化學習中,我們會針對離散(有限)和連續(無限)行為空間做出區分。根據我們希望智能體達到的複雜程度,可以有多種不同的選擇。最簡單的方法就是設定三種行為:買入,持有,賣出。這樣也不是不行,但是這會限制模型在每一步中決定資金金額的能力。如果把複雜程度升級,下一步需要做的就是讓智能體學會要投資多少錢,比如根據模型預估的不確定性決定不同的投資金額。這樣就會讓我們來到連續行為空間,因為我們需要同時決定行為(離散的)和數量(連續的)。更複雜的狀況是,讓我們的智能體學會下限價單。在這種情況下智能體要同時決定掛單價格和掛單數量,兩者都是連續數值。它也還需要有撤銷沒有成交的限價單的能力。

反饋函數

這又是一項很複雜的東西。可選的反饋函數有很多種。很容易想到的是已實現盈虧。每當智能體結束一個倉位的操作(比如賣出了之前買入的資產,或者買入了之前借出的資產)之後就會獲得一次反饋。這輪交易的凈收益可以是正值,也可以是負值,就把它作為我們要的反饋信號。隨著智能體學習最大化累積反饋值,它就逐漸學習了如何在交易中盈利。技術上說這個反饋函數是正確的,而且在這個限定範圍之內可以學出最優策略。然而,和什麼都不做相比(這將是大多數時候的智能體行為),買入和賣出的行動數量都很少,反饋會很稀疏。所以,理想的智能體應當不需要頻繁地接收到反饋信號也能學習。

相比頻繁接收反饋信號的一種替代方案是未實現盈虧,就是指,雖然智能體當前還沒有結束所有倉位的操作,但是如果立即就結束的話會獲得多少利潤。比如,當智能體買入之後價格就開始下跌的話,即便還沒賣出(實現負利潤),智能體也會獲得負的反饋值。由於每個時間步驟上未實現盈虧都會發生變化,它就可以作為頻繁的反饋信號。然而,這種直接的反饋和延遲衰減函數結合使用的時候也可能會讓智能體偏向於短期的操作。

這兩種反饋函數都是針對利潤的樸素直接的優化。而實際交易中,交易者可能還希望最小化風險。假設策略 A 有稍低的回報和顯著更低的波動性,而策略 B 的回報提升不多,波動性卻很高的話,一般人們都會傾向於選擇策略 A。針對夏普比率做優化是一種簡單的在訓練中考量到風險的做法,但也還有許多其它的指標。我們也可以選擇最大跌幅這樣的指標。可以想像,根據利潤和風險之間的平衡,有許許多多複雜的反饋函數可以選擇。

強化學習模型的設計工作流程

現在我們對如何在交易中使用強化學習有大概的了解了,下面我們來看看為什麼我們更願意用強化學習而不是監督學習。開發強化學習的交易策略大概是下面這樣的步驟,要比前面監督學習的簡單得多,也要更加體系化。

對我們關心的指標做端到端優化

在上面講過的傳統策略開發過程中,我們要先經過流水線中的好幾步才能得到我們想要的指標數值。比如,如果我們想要找到一個最大跌幅不超過 25% 的策略,我們就要先訓練監督學習模型、想出一個基於規則的策略並且用到模型的數據、做內部測試並優化超參數,然後才能經過測試得出模型在這個指標上的表現。

強化學習就允許我們做端到端的優化,而且可以最大化反饋(也可以是延遲反饋)。只要在反饋函數中增加一項,我們就可以直接對最大跌幅做優化,而不需要分成好幾個互相獨立而且不確定互相影響的步驟。比如你可以在反饋函數中設定,當跌幅超過 25% 的時候會有一個很大的負反饋,這就會逼得智能體補課不考慮更換別的策略。當然了,我們也可以把最大跌幅和其它各種我們關心的指標結合在一起。所以強化學習的方法不僅更簡單,也可以得到厲害得多的模型。

學到的策略

相比於需要一行行手工設計的基於規則的策略,強化學習可以直接學到一個策略。我們不再需要指定規則、不再需要設定閾值(比如「預測價格上漲的確定性大於 75% 時買入」)。強化學習策略中會隱式地形成交易規則,而且會向著我們需要的指標進行優化。我們也就在策略開發過程上邁出了一大步!並且,由於這個策略是由神經網路之類的非常複雜的模型參數化的,它能夠學到的策略要比任何人類可以想到、可以描述的策略都要複雜和強力得多。以及正如我們剛才說到的,只要我們在意並設定反饋函數,學到的策略可以隱式地把風險之類的指標考慮進去。

直接在模擬環境中訓練

當使用監督學習方法時,我們需要分別做內部測試和參數優化這兩步,因為在策略中直接考慮進去掛單列表流動性、手續費結構、延時等等因素的話太難做了。想到了一個策略,然後花了很多時間做測試之後才發現它不好使的事情並不少見,延遲太高、市場行情變化太快等等原因都有可能。

而強化學習智能體是直接在模擬環境中訓練的,而且這個模擬環境可以儘可能複雜(把延遲、流動性和手續費都考慮在其中),那麼我們就不需要考慮剛才那些問題了。實際上,適應環境本身的限制也就應當是優化過程的一部分。比如我們在強化學習環境中模擬交易平台的延遲,導致智能體犯錯的話,智能體就會接收到負值的反饋,使得它之後學會更好地應對延遲。

我們可以進一步拓展這種做法,模擬同一個環境中的其它智能體,從而建模我們的智能體做出行動會對環境造成何種影響。在模擬環境的歷史數據中智能體的下單可能會帶來價格的變化,而我們其實不確定真實的市場對此會有什麼樣的響應。一般來說,模擬器都會忽略這些,假定智能體的下單沒有給市場帶來任何影響。不過,通過學習一個環境的模型,然後執行蒙特卡羅樹搜索之類的推演方法,我們就可以把市場(以及其它智能體)可能的反應考慮在內。這樣巧妙地處理了環境中的實時數據之後,我們就可以持續地改善模型。同時這裡也有一個探索和利用之間的有趣的平衡:我們應當優化模型,讓它在實時變化的環境中獲得更多的利潤,還是做次優的優化、更多地收集信息,以便我們可以優化環境和其它智能體的模型呢?

這會是一個非常強有力的想法。通過建設越來越複雜的模擬環境來擬合真實市場,我們也就可以訓練出非常複雜的模型,複雜到以至於可以把環境本身的限制考慮在內。

學習適應不同的市場環境

直覺上來說,同樣的策略可能在有些市場環境中表現比較好、有些環境中表現不好。一定程度上這是策略較為簡單的本質屬性造成的,有可能策略的參數化程度確實還沒有強到可以讓模型學習適應不同的市場環境。

不過,通過神經網路進行參數化的強化學習智能體學到的都是很強有力的交易策略,它們其實也有機會學會適應各種不同的市場環境,只要首先經過足夠長時間的訓練、有足夠的存儲容量,也許多學習一份歷史交易數據就可以學會適應一個新的交易平台。這也讓這些模型對市場狀況的變化更魯棒。實際上,通過在反饋函數里加入適當的懲罰項,我們可以直接地把模型優化得對市場變化更魯棒。

對其它智能體建模的能力

強化學習有一項獨特的技能,就是我們可以顯式地把其它智能體的影響考慮進來。目前為止我們討論的都是「市場會如何反應」,而其實市場也就是一群智能體和自動交易演算法而已,就像我們想要做的一樣。不過,如果我們可以顯示地在環境中對其它智能體建模,我們的智能體就可以學會利用它們的策略牟利。簡單來說,我們把「預測市場」的問題重新定義為了「利用其它智能體」。這也就和我們在 DotA 之類的多玩家遊戲中做的事情要類似得多了。

重新聊聊交易智能體這個問題

我這篇文章的目標不僅僅是想要對用於交易的強化學習智能體做一個入門介紹,也是希望引起更多研究人員的興趣、參與研究這個問題。交易其實可以是一個有趣的研究問題,原因有下面這些。

實時測試以及快速的迭代循環

以往訓練強化學習智能體的時候,把它們部署到真實世界並獲得反饋是一件很難或者很昂貴的事情。假設你訓練了一個玩星際 2 的智能體,你要如何讓它和一群高水平的人類玩家對抗呢?象棋、撲克以及其它強化學習研究者關注的熱門遊戲都有這個問題。可能你要想辦法進入某個世界級賽事,讓智能體完成許多場比賽之後再分析結果。

交易智能體的特點和其它那些多玩家遊戲的特點非常類似,但是在線測試它們就簡單太多了!你可以隨時通過交易平台的 API 部署自己的智能體,隨時獲得真實世界市場的反饋。如果你的智能體泛化能力不好、輸了錢,你就知道你可能對訓練數據過擬合了。換句話說,迭代更新的周期可以變得非常短。

足夠大的多玩家環境

交易環境本質上就是一個有數以千計的智能體參與的多玩家遊戲。這也是一個熱門研究領域。撲克、Dota2 等等遊戲上我們都已經在做出成果,同樣的技術也可以用在這裡。實際上,交易問題還是一個更困難的問題,因為任何時刻都會有可觀數量的玩家加入或者離開遊戲。學習如何為其它智能體建模也只是研究這類問題的其中一個方向。前面也提到過,智能體在實時環境中採取行動,目的完全可以是最大化自己收集到的關於其它智能體執行的交易策略的信息。

學習利用其它智能體以及操控市場

和上一個問題緊密相連的,就是我們能否利用環境中的其它智能體。比如,如果我們確切知道交易平台上的其它自動交易演算法的內容,我們就可以誘使它們執行本來不該執行的行為,然後從它們的錯誤中獲利。這同樣適用於人類交易者,他們中的相當一部分人都是基於某幾組廣為人知的市場信號進行交易的,比如指數移動平均、掛單列表壓力、MACD。

(作者註:請不要讓你的智能體做任何違法的事情!請務必遵守你當地的法律法規。並且,演算法的以往表現只對未來表現有有限的參考作用。)

稀疏回報以及探索

交易者一般只能從市場上獲得稀疏的反饋,大多數時候交易者都是在等待。不過買入和賣出動作畢竟只是採取的所有動作中的一小部分。簡單直接地使用一個「心裡只有反饋」的強化學習演算法是肯定會失敗的。這就為新演算法、新技術的使用提供了機會,尤其是可以高效地處理稀疏反饋的基於模型的演算法。

行為空間的探索也有類似的狀況。當下的許多標準演算法,比如 DQN 和 A3C 都使用的是非常樸素的方法做探索,基本上就是在策略中增加雜訊。然而在交易環境中,環境中的多數狀況都是不好的狀況,只有少數是好的。用簡單直接的隨機方法做探索基本沒什麼機會讓好的狀況和好的模型行為配對起來。這裡很需要一種新的方法。

多智能體自我對抗

正如和圍棋、象棋智能體可以做自我對弈,多智能體環境中可以做自我對抗。比如設想我們同時訓練了一大群互相競爭的智能體,然後觀察它們之間形成的市場變化模式是否和真實世界的市場行情有類似之處。我們也可以把不同類型的智能體放在一起比拼,有的是各種標準強化學習演算法的、有的是基於演化演算法的、有的是確定性的。我們也可以把真實世界的市場數據作為監督反饋信號,「迫使」模擬環境中的智能體共同形成和真實世界類似的行為。

時間上的連續性

由於市場的變化速度實際上在微秒到毫秒級,交易領域的問題實際上就成為了很好的連續時間領域的問題。在上面的例子中我們假定了固定的時間間隔並把它指定給了智能體。不過,其實我們還可以讓智能體學習控制間隔時間。這樣,智能體不僅可以自己決定採取哪些行動,還可以決定何時採取行動。這又是一個熱門研究問題,機器人之類的其它領域也可以由此受益。

非平穩、終身學習,以及災難性的遺忘

始終在更新變化是交易環境的固有屬性。市場狀況會變化,總有一些交易者在加入和離場,他們的策略也在時時更新。我們能否訓練出這樣的智能體,它們既可以學會自動調節,可以適應不斷變化的市場環境,同時還不「忘記」它們曾經學到過的東西呢?比如,智能體能否成功從熊市的交易策略轉向牛市的交易策略,然後再回到熊市的策略,同時這一整個過程還都不需要重新訓練呢?智能體能否自動適應新加入環境的智能體,並且自動學會利用它們呢?

遷移學習以及輔助任務

對於複雜問題,從零開始訓練強化學習演算法可能要花費很長時間,因為它們不僅要學習如何做出好的決定,還要學習「遊戲的基本規則」。加速強化學習智能體訓練的方法有很多,包括遷移學習以及使用輔助任務。比如,我們可以用專家給出的策略做強化學習智能體的預訓練,或者增加價格預測之類的輔助任務作為智能體的訓練目標,這都可以提升訓練速度。

結論

這篇文章的目的是對基於強化學習方法的交易智能體做一個入門介紹,討論為什麼這種方法優於現有的交易策略開發方法,以及提出什麼我相信更多研究人員都應該研究這個問題。我希望我這篇文章達到了部分效果。

感謝閱讀!

via WildML,雷鋒網 AI 科技評論編譯

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 雷鋒網 的精彩文章:

清華叉院發布Fintech研究成果:智能投資管理引擎系統
YouTube 也被「挖礦」了?

TAG:雷鋒網 |