學習目標
- 事件驅動的交易系統構建:介紹交易系統平台的基本架構與實現。包括事件驅動軟件概述、交易系統的組成部分編程,事件驅動的交易執行。
- 交易策略實現:移動平均跨越策略、S&P500預測交易、均值回復的股權配對交易、
- 策略優化:參數優化、模型選擇、策略優化
概述
自動化交易的優缺點
算法交易,一般被定義為使用自動化的系統來進行交易,其用一種預先設定的方式運行,通常沒有人為的干預。“沒有人為干預”這一點是非常重要的。算法策略是在交易開始之前進行設計的,在交易的時候沒有任何的人工干預。與常規交易相比,算法交易的優勢體現在:
- 歷史驗證:這是設計算法交易程序實現交易的最大優勢就是它的交易業績可以由歷史數據來進行驗證,人們往往期望這種歷史業績可以代表將來。歷史數據驗證的過程稱為回測,回測使得策略的統計特性被決定,提供了關於策略是否可以獲利的重要信息。
- 有效性:算法交易在多數時候比主觀的方法更為有效,完全自動化的交易系統不經常需要人們去監測市場的價格行為或者是消息。這使得投資者可以有時間開發更多的交易策略,來實現獲利。對於風險管理來說,算法交易實施系統化的交易策略,可以動態的對杠桿以及風險因子進行調整,有效的對實時市場的動態做出反應。這在主觀交易中是不容易實現的,因為交易者通常不能連續的計算風險,而必須在觀測市場鎮南關有所間斷
- 沒有扭曲性投入:所謂扭曲性投入指的是對頭寸進行的調整。主觀交易的時候因為恐懼和貪婪可能導致過多的扭曲交易,系統化交易中這種情況比較少,提升了策略的業績。只是在出現某些大的變化的時候,需要對參數進行調整。
- 可比較:系統化交易提供了歷史和目前業績的統計信息,可以方便的計算價值的增長,風險,交易頻率等指標,這樣方便我們去比較業績。這與在主觀交易中只能根據P&L來比較業績是有差別的,那里可能存在回撤的風險。
- 高頻交易:高頻交易需要較高的效率,必須自動化的進行,有很多高頻交易的交易頻率是超過了人們的反應成都。這樣的策略只能用算法交易進行處理。
自動化交易的缺點:
- 資本的需求:算法交易需要大量的投入,支持算法交易的佣金通常較高,雖然目前已經有了一定的改變。另外,獲取日內交易的數據通常也是不便宜的。每月大約在300至500美元之間。而且還需要穩定的互聯網連接和速度較快的電腦。
- 編程和科學技術:雖然有一些現成的系統化交易平台,例如Quantopian,QuantConnect以及TradeStation可以幫助我們減輕編程的壓力,但是有的並不支持實時交易。這樣通常還是需要系統化交易者具有一定的編程和科學建模技術。在本課程的學習中,我們將介紹一些不同的交易策略,如果你掌握有一些數值建模的技術,那么對於建模部分的介紹會發現比較容易理解。大部分的技術在Python中都可以直接實現,節省了大量的開發時間,我們要做的就是將數據分析與執行庫結合在一起來構建算法交易系統。
為什么使用python進行自動化交易
為什么使用Python?Python是一種高級語言,設計用來提升開發的速度,它包含大量的庫來進行各種科學計算。它也是資產管理機構和投資銀行通常選用的語言。使用Python進行算法交易有以下幾個好處:
- 學習:相對於其他語言,比如C++, Python是比驕傲容易學習的。基本的Python操作幾周就可以掌握。
- 庫:Python擁有大量的用於計算的庫,減少了實現的時間和出現BUG的機會。特別的,你可以使用NumPy(向量操作),Scipy(最優化),pandas(時間序列分析),statsmodel(統計建模),scikit-learn(機器學習),Ipython(交互式開發)以及matplotlib(可視化)。
- 開發的速度:Python在速度方面有優勢,通常寫Python代碼類似於偽代碼,類似於Ipython的交互式工具也可以在不犧牲穩健性的前提下獲得較高的開發速度。
- 執行的速度:雖然不像C++那樣快,Python還是提供了優化執行速度的模塊,例如Cython等,通過使代碼變得復雜一點,可以提升執行的速度。
- 交易的執行:較大的券商都有Python插件,例如Interactive Brokers(Ibypy),Python還可以很容易在必要的時候使用FIX協議。
- 成本/授權,Python是免費,開源的和跨平台的。
事件驅動的交易引擎實現
事件驅動軟件
在我們開發回測模塊的時候,我們需要理解事件驅動系統的概念。視頻游戲提供了事件驅動軟件的一個很好例子。一個視頻游戲有多個組成部分,在實時彼此之間有所交互。這是通過運行無限的循環,稱為事件循環和游戲循環來實現的。在每一個游戲循環中,函數被調用,接收最近的事件,這個事件是由某些之前的游戲行為產生的。基於事件的不同,可能是單擊鼠標或者是鍵盤,然后會采取相應的行為,或者終止循環,或者生成某些更新的事件。這個過程會繼續。
事件驅動的系統提供了如下的好處:
- 代碼的重用:事件驅動的回測程序,在設計上可以被用於歷史回測以及實際交易,只需要簡單的進行轉換。而對於向量化的回測程序而言,所有的數據必須一次性獲得來進行統計分析。
- 向前偏差:事件驅動的回測程序不會產生向前偏差,因為收到的市場數據被看作為事件,而作為后期行為的基礎。這樣可以使用市場數據來填充事件驅動回測,復制了訂單管理和資產組合系統的行為。
- 現實性:事件驅動回測程序允許對交易如何執行以及交易成本進行個性化,直接可以處理基本的市價和限價訂單,以及市場基於開盤(MOO)以及市場基於收盤(MOC),因為我們可以構建一個個性化的交易處理程序。
雖然事件驅動的交易系統有很多好處,但是也有缺點,主要是在構造方面比較復雜,檢驗也是。有一些改變的部分會產生BUG,這樣就需要使用測試驅動的開發。另外它運行也要慢一些,因為沒有利用到向量化的好處
事件驅動交易軟件的組成
- 事件:事件是事件驅動系統的基礎類。它包含一個類型(例如“MARKET”,“SIGNAL”,“ORDER”或”FILL”),確定在事件循環中需要處理的方式。
事件隊列:事件隊列是Python內存中的隊列對象,存儲所有的由系統的其他部分生成的事件子類對象。 - DataHandler:DataHandler是一個抽象類,代表了歷史和實際市場數據的一個接口。這提供了很強的靈活性,因為Startegy和Portfoli模塊都可以進行重用,DataHandler會產生一個新的MarketEvent,基於系統的每一次心跳。
- Strategy:策略類也是一個ABC,代表使用市場數據生成對應的SignalEvents的接口,最終由Portfolio類來使用。SignalEvent包括一個標的代碼,一個方向(LONG或者SHORT),以及一個時間戳。
- Portfolio:這是一個類的層次結構,處理訂單管理以及策略中的目前和后續的頭寸。它還進行資產組合的風險管理,包括行業暴露和頭寸的大小。在一個更為專業的實現中,這可能會被代理給RiskMangagement類。Portfolio類接收Queue中的SignalEvents,生成OrderEvents加入到序列中。
- ExecutionHandler:ExcecutionHandler模擬一個到券商的連接。它的工作室從Queue中取出OrderEvents,然后執行,或者通過一個模擬的方法,或者是通過實際執行。一旦訂單被執行,處理器生成FillEvents,描述交易的細節,包括費用,佣金,以及價格影響等。
- 回測:所有這些成本都被包裝到事件循環中,處理所有的事件類型並路由到合適的組成成分
Events類
....
