PART6.Automated Trading
14.Event-Driven Trading Engine Implementation-事件驅動的交易引擎實現
本章提供了一個用Python編寫的完全自包含的事件驅動的回測系統的實現。特別的是,這一章的寫作是為了擴展那些在其他算法交易文本和論文中通常被忽略的細節。接下來的代碼將允許您模擬關於預測、動量和均值回歸領域在股票、外彙和期貨市場的高頻策略。
然而,大量的細節帶來了複雜性。這裡提供的回溯測試系統需要許多組件,每個組件本身都是綜合實體。因此,第一步是概述什麼是事件驅動的軟件,然後描述回測的組件以及整個系統是如何配合在一起的。
事件驅動軟件
在深入研究這樣一個回測軟件的開發之前,我們需要理解事件驅動系統的概念。視頻遊戲為事件驅動的軟件提供了一個自然的用例,並提供了一個簡單的示例供您探索。一個視頻遊戲有多個組件,在高幀率的實時設置中相互交互。這是通過在一個稱為事件循環或遊戲循環的“無限”循環中運行整個計算集來處理的。
在遊戲循環的每一次循環中,都會調用一個函數來接收最新的事件,這些事件將由遊戲中相應的先前動作生成。根據事件的性質(可能包括按鍵或鼠標單擊),將執行一些後續操作,這些操作將終止循環或生成一些其他事件。這個過程將繼續下去。
下面是一些偽代碼的例子:
while True : # 永远运行循环new_event = get_new_event () # 获取最新事件# 基于事件类型,执行一个动作if new_event . type == "LEFT_MOUSE_CLICK" : open_menu () elif new_event . type == "ESCAPE_KEY_PRESS" : quit_game () elif new_event . type == "UP_KEY_PRESS" : move_player_north () # ... 以及更多的事件redraw_screen () # 更新屏幕以提供动画tick ( 50 ) # 等待50毫秒
代碼不斷地檢查新事件,然後根據這些事件執行操作。特別是它允許實時響應處理的假象,因為代碼不斷被循環,事件被檢查。隨後更加清晰,這正是我們所需要的,以便進行高頻交易模擬。
為什麼要使用事件驅動的回測軟件? -事件驅動系統比起矢量化方法有很多優勢:
● 代碼重用——通過設計,一個事件驅動的回測軟件既可以用於歷史的回溯測試,也可以用於最小程度的組件切換的實時交易。這對於矢量化的回測軟件來說是不正確的,因為所有的數據必須同時可用來進行統計分析。
● 前向偏差——事件驅動的回測軟件不存在前向偏差,因為市場數據接收被視為必須被執行的“事件”。因此,可以用市場數據“點滴供給”事件驅動的回測軟件,複製訂單管理和投資組合系統的行為方式。
● 現實主義——事件驅動的後台測試人員允許對訂單的執行和交易成本的產生進行重要的定制。由於可以構造自定義的經紀商處理程序,因此處理基本市場和限價訂單以及市場開放(MOO)和市場關閉(MOC)非常簡單。
儘管事件驅動系統具有許多優點,但與更簡單的矢量化系統相比,它們有兩個主要缺點。首先,它們的實現和測試要復雜得多。有更多的“移動部件”導致更大的機會引入錯誤。為了緩和這種適當的軟件測試方法,可以使用測試驅動開發。
其次,與矢量化系統相比,它們執行速度更慢。在進行數學計算時,無法使用最佳向量化操作。
組件對象
要將事件驅動方法應用到回溯測試系統中,需要定義我們的組件(或對象)來處理特定的任務:
● 事件-事件是事件驅動系統的基本類單元。它包含一個類型(如“MARKET”、“SIGNAL”、“ORDER”或“FILL”),該類型決定如何在事件循環中處理它。
● 事件隊列——事件隊列是內存中的Python隊列對象,它存儲由軟件的其餘部分生成的所有事件子類對象。
● 數據處理器——數據處理器是一個抽象基類(ABC),它提供了一個處理歷史或實時市場數據的接口。這提供了很大的靈活性,因為策略和投資組合模塊因此可以在兩種方法之間重用。數據處理器會根據系統的每一次心跳生成一個新的市場事件(見下面)。
● 策略——策略也是一個抽象基類(ABC),它提供了獲取市場數據並生成相應信號事件的接口,這些信號事件最終將被投資組合對象使用。信號事件包含一個股票代碼、一個方向(長或短)和一個時間戳。
● 投資組合—這是一個類層次結構,用於處理與策略的當前和後續位置相關的訂單管理。它還對整個投資組合進行風險管理,包括行業敞口和頭寸規模。在更複雜的實現中,這可以委託給風險管理類。投資組合從隊列中獲取信號事件並生成添加到隊列中的訂單事件。
● 執行處理器—執行處理器模擬到經紀業務的連接。處理程序的工作是從隊列中獲取訂單事件並執行它們,可以通過模擬方法,也可以通過到真實經紀商的實際連接。一旦訂單被執行,處理程序就會創建填充事件,它描述實際交易的內容,包括費用、佣金和滑動(如果建模)。
● 回測—所有這些組件都封裝在一個事件循環中,該事件循環正確處理所有事件類型,並將它們路由到適當的組件。
儘管組件數量眾多,但這是一個相當基本的交易引擎模型。還有很大的擴展空間,特別是在如何使用投資組合方面。此外,不同的交易成本模型也可以抽像到它們自己的類層次結構中。
更多內容請關注公眾號【火象】~