JAX-LOB:使用GPU加速限價訂單簿模擬


量化投資與機器學習微信公眾號,是業內垂直於量化投資、對沖基金、Fintech、人工智慧、大資料領域的主流自媒體公眾號擁有來自公募、私募、券商、期貨、銀行、保險、高校等行業30W+關注者,曾榮獲AMMA優秀品牌力、優秀洞察力大獎,連續4年被騰訊雲+社群評選為“年度最佳作者”。
2024《因子日曆》,唯一1次加印暢銷中···
點選圖片,即可購買!

前言
交易所利用限價訂單簿(LOB)來處理訂單並匹配交易。為了研究目的,擁有大規模高效的LOB動態模擬器是非常重要的。以往,LOB模擬器已經在代理模型(ABMs)、強化學習(RL)環境和生成模型中實施,處理來自歷史資料集和手工代理的訂單流。對於許多應用,需要處理多個簿,無論是用於ABMs的校準還是RL代理的訓練。我們展示了第一個GPU加速的LOB模擬器,名為JAX-LOB,旨在並行處理數千個簿,並顯著減少每條訊息的處理時間。我們的模擬器的實現基於設計選擇,旨在充分利用JAX的功能,同時不影響與LOB相關機制的真實性。
什麼是LOB?
LOB是Limit Order Book(限價單簿)的縮寫,是金融交易所用於記錄和管理證券買賣訂單的一種資料結構。在LOB中,買賣訂單按照價格和時間順序排列,以便進行撮合交易。交易員可以提交限價訂單(需指定價格和數量)或市價訂單(只需指定數量),這些訂單會被匹配或者新增到簿中。LOB的動態變化取決於訂單流的變化,包括新訂單的提交、訂單的撤銷和交易的執行。LOB在現代電子交易中起著至關重要的作用,對於交易策略的開發和評估具有重要意義。
為什麼要模擬LOB?
模擬限價單簿(LOB)具有重要意義,因為它可以幫助我們更好地理解金融市場的運作和交易行為。透過模擬LOB,我們可以研究和分析不同的交易策略、市場影響以及交易執行的效果。這對於金融公司改進服務、政府預測金融監管對金融體系穩定性的影響等方面具有實際意義。此外,LOB模擬器還可以用於訓練交易代理人,如市場做市商或交易執行代理人,以及用於生成模型等領域的研究。由於這些應用通常需要大規模的模擬和計算,因此開發GPU加速的LOB模擬器可以提高計算效率,從而為這些研究提供更好的工具和平臺。
什麼是JAX?
JAX是一個充滿潛力的高效能數值計算庫,它將可微分程式設計帶入了Python生態系統。它可以與不同型別硬體匹配的加速器框架,它利用加速的線性代數(XLA)、自動微分和自動向量化,可以輕鬆地在GPU上執行。這個框架旨在進行高效能的機器學習研究,是gymnax和PureJaxRL框架的基礎。JAX的設計使其能夠實現即時(JIT)編譯,從而在GPU上執行。JAX的特性使其非常適合用於大規模的機器學習任務,而且它的加速特性使得它非常適合用於處理LOB模擬器這樣的任務。
相對CPU的優勢:
  • JAX是一個加速器不可知的框架,可以使用GPU進行即時編譯(JIT)和加速線性代數(XLA),自動微分和自動向量化;
  • JAX旨在進行高效能機器學習研究,並且可以輕鬆地在GPU上執行;
  • JAX具有自動向量化功能,可以將程式碼轉換為可以在GPU上並行執行的形式,從而提高了計算速度;
  • 在使用JAX進行訓練時,可以避免GPU-CPU通訊瓶頸,從而提高了訓練速度;
  • 在使用JAX進行訓練時,可以利用GPU的並行性,從而提高了訓練速度。
JAX-LOB模擬器
將深度強化學習應用於交易執行和其他高頻任務的一些關鍵挑戰是金融資料的訊號噪聲比低、可能出現的對於特定訓練日的過度擬合,及真實模擬市場衝擊。彌補前兩個問題的一種簡單方法是增加可用於訓練的狀態-動作轉換數量。為了加速使用高頻資料生成LOB,我們使用JAX。
本文使用以下設計決策來應對JIT-compiled JAX程式碼的一些限制,這些設計決策旨在解決JIT-compiled JAX程式碼的一些限制,例如無法使用動態資料結構和控制流程。透過使用純函式和固定大小的陣列,可以使程式碼更容易編譯和並行化:
  • 純函式
  • 固定的陣列大小和型別
  • 可以有效編譯和並行化的控制流程
大多數CPU實現的限價訂單簿(LOB)都基於雜湊對映、佇列、雙向連結串列和排序字典,這些資料結構可以快速訪問資料並在整個訂單簿中保持排序。然而,由於JAX要求編譯時固定大小的陣列,要實現類似的結構就意味著必須預先為所有價格級別和訂單分配記憶體空間。使用陣列意味著在刪除條目時重新排序的成本遠高於使用連結串列。
因此,本文選擇了一種不使用類似樹狀結構的架構,也不要求始終保持訂單排序的方法。本文定義了兩個陣列A和B來表示訂單簿的兩側,其中A表示所有活動的賣出訂單,B表示所有活動的買入訂單。這種設計避免了使用類似樹狀結構的資料結構,也不要求始終保持訂單的排序。
基礎操作
對於LOB的基本操作有三種:新增新訂單、取消現有訂單和將現有訂單與另一側的訂單進行匹配並從訂單簿中刪除。新增訂單需要找到陣列中的空位置,並將訂單特定資料插入正確的欄位。取消訂單需要定位要取消的訂單的訂單ID,並從訂單簿中相應地移除數量。匹配訂單需要考慮現有訂單與另一側的訂單進行匹配,並隨後將其從訂單簿中移除。
  • 新增訂單需要在陣列中識別一個空位置(𝒐𝒊 = -1),並將訂單特定資料插入正確的欄位。
  • 取消訂單需要定位要取消的訂單的訂單ID(𝑂𝐼𝐷),並從訂單簿中相應地移除數量。這些操作對於管理訂單簿至關重要,對於維護交易系統的完整性和準確性至關重要。
  • 在匹配操作期間,一個被稱為𝒐𝒂的主動訂單會與訂單簿另一側的現有訂單(即掛單𝒐𝒔)進行匹配。匹配邏輯旨在透過以下操作找到主動訂單(𝑄𝑎 ∈ 𝒐𝒂)和掛單(𝑄𝑠 ∈ 𝒐𝒔)的剩餘數量:
    • 從掛單中減去主動訂單的數量,得到剩餘的掛單數量:𝑄′𝑠=𝑚𝑎𝑥 (0, 𝑄𝑠 − 𝑄𝑎 )
    • 從主動訂單中減去已匹配的掛單數量,得到剩餘的主動訂單數量:𝑄′𝑎=𝑄𝑎 − 𝑄𝑠
當兩個訂單匹配成功時,會記錄一次交易𝒕𝒋。交易記錄包括以下資訊:
  • 交易價格:𝑃𝑗 = 𝑃𝑠
  • 交易數量:𝑄 𝑗 = 𝑄𝑠 − 𝑄′𝑠
  • 主動訂單ID:𝑂𝐼𝐷𝑎,𝑗 = 𝑂𝐼𝐷𝑎 ∈ 𝒐𝒂
  • 掛單ID:𝑂𝐼𝐷𝑠,𝑗 = 𝑂𝐼𝐷𝑠 ∈ 𝒐𝒔
  • 掛單時間戳:𝑇𝑠𝑗 ,𝑇𝑛𝑠𝑗 = 𝑇𝑠𝑎,𝑇𝑛𝑠𝑎
由於XLA編譯器的限制,最多記錄N次交易記錄,儲存在固定大小的陣列T中。如果某個交易記錄為空,則𝒕𝒋 = −1。在所有操作完成後,會檢查𝐴𝑠𝑘𝑠和𝐵𝑖𝑑𝑠中的所有訂單𝒐𝒊,如果𝑄𝑖 ≤ 0,則將𝒐𝒊設定為−1。
一筆主動訂單可能會與多筆掛單匹配。匹配邏輯包含一個while迴圈,不斷嘗試將主動訂單與位於訂單簿另一側的下一個最佳掛單進行匹配。最佳掛單𝐵𝑒𝑠𝑡(𝒐𝒔)由價格-時間優先順序演算法定義,這是最常用的限價訂單簿匹配演算法。該演算法將價格和時間作為優先順序的兩個因素,優先選擇價格更優且時間更早的掛單進行匹配。如果有多個訂單共享相同價格,則選擇最早到達時間的訂單。這種匹配邏輯可以提高訂單簿的流動性,使得更多的訂單可以被匹配成交,從而提高市場效率。
匹配迴圈將繼續進行,直到訂單簿非空且滿足價格重疊的條件。具體地,如果是可成交的賣單,要求賣出價格低於等於買入價格;如果是可成交的買單,要求買入價格高於等於賣出價格。這保證了只有在價格滿足成交條件時,匹配迴圈才會繼續進行。
最後,根據上述描述,可以直觀地預期這些基本操作的計算複雜性會有所不同。為了驗證這一直覺,作者對不同最大容量𝑁的訂單簿中的基本操作進行了計時。結果顯示,隨著訂單簿容量𝑁的增加,操作所需時間也會增加,並且最慢的操作(匹配)執行時間超過最快操作(取消)的兩倍以上。這表明,在處理大量訂單時,匹配操作的計算複雜性會顯著增加,需要採取相應的最佳化措施來提高系統性能。
訊息型別
message指的是傳遞給訂單簿的訊息,用於提交、取消或刪除訂單,或者執行市價訂單。每個message包含以下資訊:
1、message型別(limit orders,cancel orders,delete orders,market orders)
2、訂單的方向(bid或ask)
3、訂單的價格(對於市價訂單,該欄位被忽略)
4、訂單的數量
5、訂單的唯一識別符號
6、時間戳
7、訂單簿的識別符號
8、訂單簿中的時間戳
這些資訊被傳遞給訂單簿,以便進行匹配和執行。透過使用message,可以實現高效的訂單簿管理和交易執行。
本文將每種訂單型別和方向的訂單視為八種單獨的情況,這樣可以為每種情況定義明確的函式。這樣做可以在接收到訊息時使用單個條件語句,而不是在匹配邏輯中使用多個分支。作者發現,這種方法在vmap下可以提高效能。
處理每種三種訊息型別的計算時間因所需的基本操作而異。與表1中的結果相比,分支語句只會略微增加處理時間,而不同訂單型別之間仍然存在顯著差異。這表明,將每種情況定義為明確的函式,並在接收到訊息時使用單個條件語句的方法有效地提高了效能,並減少了計算複雜性,特別是在處理不同型別和方向的訂單時。
使用vmap加速處理訂單資訊
"vmap" 是指 JAX 庫中的一個運算子,用於實現向量化的對映(vectorized map)。這個運算子允許使用者對函式進行向量化,以便在 GPU 或 TPU 等加速器上並行處理多個輸入。在訂單簿匹配系統中,使用 vmap 可以同時處理多個訂單簿,從而提高整體的處理效率。
具體來說,vmap 運算子將函式對映到輸入的批處理維度上,使得函式能夠以向量化的方式處理輸入。這對於需要在大規模資料上執行相同操作的情況非常有用,因為它可以利用硬體加速器的平行計算能力,從而提高整體的計算效率。
在文中提到,作者使用 vmap 運算子來實現對多個訂單簿的並行處理,以提高訂單簿匹配系統的效能。這種並行處理方式可以有效地利用 GPU 的平行計算能力,加速訂單匹配過程,從而提高整體系統的效率和效能,具體來說:
Table 4列出了在使用vmap並行處理多個訂單簿時,處理不同型別的訂單所需的時間。這些時間是在JAX-LOB系統中測量的,並與兩個CPU實現進行了比較。結果表明,JAX-LOB系統在處理每個訂單時的時間比其他兩個系統更短,尤其是在處理大量訂單時。
Table 5列出了在處理單個訂單時,不同系統所需的時間。這些時間是在處理單個訂單時測量的,並與JAX-LOB系統和兩個CPU實現進行了比較。結果表明,JAX-LOB系統在處理單個訂單時的時間比其他兩個系統更短,尤其是在處理大量訂單時。
這些表格的結果表明,JAX-LOB系統在處理訂單簿時具有更高的效率和效能,尤其是在處理大量訂單時。這對於需要高效處理大量訂單的金融交易系統非常重要。
總結
我們可以看到與CPU實現相比,使用JAX-LOB系統可以獲得至少5倍的加速效果。當使用該環境來訓練一個RL代理時,相對於CPU實現,甚至可以看到7倍的加速效果。這種並行化帶來的加速效果有望為將RL應用於需要反應性訂單簿模擬器的高頻交易和執行問題的研究做出貢獻。
參考來自
標題:AX-LOB: A GPU-Accelerated limit order book simulator to unlock large scale reinforcement learning for trading
作者:Sascha Frey、Silvia Sapora、Jakob Foerster、Anisoara Calinescu、Chris Lu、Stefan Zohren、Kang Li、Peer Nagy


相關文章