杜小甫
摘 要為了運(yùn)行期貨交易策略,同時(shí)又能實(shí)現(xiàn)自主的交易行為,本文討論了一種組合型架構(gòu)的期貨程序化交易系統(tǒng)。該系統(tǒng)實(shí)現(xiàn)了策略端和交易端的獨(dú)立,策略端負(fù)責(zé)接收行情數(shù)據(jù)并產(chǎn)生交易信號(hào),交易端完成交易行為并進(jìn)行風(fēng)險(xiǎn)控制。策略端采用“交易師”作為第三方通用平臺(tái),交易端采用C++編程,并使用QDP作為底層API接口。目前該系統(tǒng)已經(jīng)開(kāi)發(fā)完成,實(shí)際效果良好。
【關(guān)鍵詞】期貨 程序化交易 交易策略 交易安全
1 基本結(jié)構(gòu)
2010年滬深股指數(shù)期貨合約在中金所的上市,標(biāo)志著我國(guó)的程序化交易的開(kāi)端。近年來(lái),程序化交易在我國(guó)日趨成熟,尤其是在期貨市場(chǎng)。當(dāng)前存在的各種程序化交易系統(tǒng),整體可分為通用型和專用型兩大類,本文討論了另外一種全新的組合型系統(tǒng)架構(gòu)。
通用型交易系統(tǒng)是指由專業(yè)軟件公司開(kāi)發(fā)的程序化交易系統(tǒng),一般提供專用的策略編寫(xiě)語(yǔ)言,讓用戶編寫(xiě)交易策略,交由系統(tǒng)來(lái)完成交易行為。目前在國(guó)內(nèi)市場(chǎng)比較流行的有文華財(cái)經(jīng)的贏智、開(kāi)拓者的Tradeblazer、新博庭的King Trader交易師等。專用型系統(tǒng)指的是根據(jù)用戶的特殊策略需求,利用編程語(yǔ)言獨(dú)立開(kāi)發(fā)的系統(tǒng)。兩類系統(tǒng)各有優(yōu)缺點(diǎn),和適用范圍。
本文討論了一種組合型期貨程序化交易系統(tǒng),該平臺(tái)結(jié)合了上述兩類系統(tǒng)的優(yōu)點(diǎn),應(yīng)用范圍更加廣泛。系統(tǒng)整體分為三大模塊:策略端、交易端和通信模塊。策略端基于第三方通用系統(tǒng)開(kāi)發(fā),負(fù)責(zé)從第三方通用平臺(tái)獲取行情數(shù)據(jù),并執(zhí)行策略,產(chǎn)生交易信號(hào)。交易端接收到交易信號(hào)后完成交易行為,并進(jìn)行交易中的風(fēng)險(xiǎn)控制。數(shù)據(jù)端和交易端之間有獨(dú)立的通信模塊,負(fù)責(zé)完成兩者之間的數(shù)據(jù)通信。系統(tǒng)整體架構(gòu)如圖1所示。
之所以采用這種組合架構(gòu),是經(jīng)過(guò)精心設(shè)計(jì)的。一方面,策略端可以借助于第三方通用平臺(tái)完成很多工作,降低了整體的開(kāi)發(fā)工作量。另一方面,通過(guò)獨(dú)立開(kāi)發(fā)的交易端,使我們的交易行為完全獨(dú)立,更加提高了交易的安全性。而且這種組合式的架構(gòu)具有很強(qiáng)的擴(kuò)展性,在策略端可以選擇不同的第三方平臺(tái),交易端又可以選擇不同的底層API接口。
系統(tǒng)中采用King Trader作為第三方數(shù)據(jù)源,首先因?yàn)樵撥浖峁?qiáng)大的策略腳本語(yǔ)言“金語(yǔ)言”,以及對(duì)應(yīng)的開(kāi)發(fā)環(huán)境“金魔方”。我們可以利用金語(yǔ)言完成策略的編寫(xiě)和測(cè)試工作,并利用金魔方完成歷史數(shù)據(jù)的回測(cè)。最終編寫(xiě)真實(shí)策略,利用其 “金魔方”平臺(tái)進(jìn)行策略的運(yùn)行和交易。當(dāng)然,金語(yǔ)言進(jìn)行策略編寫(xiě)的能力有限,另外考慮到安全性,我們并不在金魔方上直接進(jìn)行交易,而是將產(chǎn)生的交易信號(hào)提交給獨(dú)立的交易端。
使用King Trader的另外一個(gè)原因是他對(duì)dll控件的支持性較好,這就給我們提供了利用dll開(kāi)發(fā)通信模塊的可能性。King Trader提供MYMACLOSE和my_ma2兩個(gè)dll回調(diào)函數(shù)接口。我們可以在dll中完成數(shù)據(jù)通信功能的編寫(xiě)。
在交易端,我們采用了量投科技有限公司提供的QDP作為底層的API接口。首先,QDP提供完備的行情數(shù)據(jù)接口和交易接口,并默認(rèn)支持C++語(yǔ)音。這給交易系統(tǒng)的開(kāi)發(fā)帶來(lái)極大的便利。其次,QDP具有很多其他優(yōu)點(diǎn),例如低延遲、交易所內(nèi)部直連、開(kāi)放接口等等。使用QDP不但能滿足當(dāng)前系統(tǒng)的需求,也為今后開(kāi)發(fā)完全獨(dú)立的交易平臺(tái)打下基礎(chǔ)。
2 策略端模塊
金語(yǔ)言在金魔方系統(tǒng)中編寫(xiě)、編譯,開(kāi)發(fā)出的可執(zhí)行的小程序稱為“指標(biāo)”。指標(biāo)能顯示在金魔方圖表上或用于選股、預(yù)警。智能策略指標(biāo)編寫(xiě)之后,可以在金魔方中測(cè)評(píng)。最后,智能策略可以通過(guò)金魔方實(shí)盤(pán)運(yùn)行,并做出交易動(dòng)作。
金魔方系統(tǒng)是廣州博庭計(jì)算機(jī)科技有限公司開(kāi)發(fā)的一款量化投資平臺(tái)軟件。具有以下主要功能模塊:
(1)行情數(shù)據(jù)接收和展示、技術(shù)分析。
(2)策略編寫(xiě)。
(3)策略測(cè)評(píng)。
(4)模擬交易與自動(dòng)交易。
我們系統(tǒng)中策略的編寫(xiě)直接采用金語(yǔ)言,并在期貨品種的K線圖上運(yùn)行。策略端主要功能包括策略編寫(xiě)、策略評(píng)測(cè)和策略執(zhí)行。首先利用金語(yǔ)言將我們的策略編寫(xiě)成指標(biāo)的形式。然后在歷史數(shù)據(jù)中運(yùn)行我們的策略,對(duì)他進(jìn)行檢驗(yàn),觀察平均盈利率,最大回測(cè)率等數(shù)據(jù)。在評(píng)測(cè)過(guò)程中可以不斷的調(diào)整參數(shù),達(dá)到優(yōu)化的目的。但是要注意,參數(shù)不可能最優(yōu)化,因?yàn)槟鞘遣豢赡艿模绕湟⒁馕磥?lái)函數(shù)的問(wèn)題。最后選擇合適的期貨合約,在其K線圖上運(yùn)行評(píng)測(cè)好的策略,實(shí)時(shí)考慮當(dāng)前的行情數(shù)據(jù),產(chǎn)生各種交易信號(hào)。具體包括開(kāi)倉(cāng)信號(hào)、平倉(cāng)信號(hào)、止損信號(hào)等等。然后將交易信號(hào)進(jìn)行數(shù)據(jù)打包,通過(guò)通信模塊傳遞給交易端程序。
3 交易端模塊
本系統(tǒng)中交易端模塊由我們獨(dú)立開(kāi)發(fā),采用C++語(yǔ)言,并選擇QDP作為底層API接口。
QDP是量投科技公司開(kāi)發(fā)的一套底層柜臺(tái)商交易接口,它同時(shí)提供行情數(shù)據(jù)接口和交易接口。QDP的功能很強(qiáng)大,可以直接完成期貨交易中的各種操作,在最新版本中也支持股票的交易。
QDP為行情數(shù)據(jù)接口和交易接口各自提供了兩個(gè)封裝好的類,分別命名為API類和SPI類。其中API類封裝了一系列函數(shù),允許用戶在代碼中調(diào)用,以完成不同的操作。例如調(diào)用ReqOrderInsert 方法可以完成報(bào)單的錄入操作,調(diào)用ReqOrderAction方法可以完成撤單操作等。而在SPI類中則封裝了一系列回調(diào)函數(shù),這些函數(shù)不允許用戶代碼調(diào)用,而是被QDP的服務(wù)器自動(dòng)調(diào)用,以完成對(duì)用戶不同操作請(qǐng)求的響應(yīng)。例如, OnRspOrderInsert 方法被QDP服務(wù)器回調(diào),用來(lái)響應(yīng)用戶的ReqOrderInsert報(bào)單操作,OnRspOrderAction方法被QDP服務(wù)器回調(diào),用來(lái)響應(yīng)用戶的ReqOrderAction撤單操作等。QDP允許用戶繼承SPI類,在子類中重寫(xiě)上述回調(diào)函數(shù)。以便加入用戶的代碼,從而完成用戶特定的需求。
QDP系統(tǒng)的交易操作具有很大優(yōu)點(diǎn),最大的好處的延時(shí)非常短。QDP的服務(wù)器機(jī)房直接安置在交易所很近的地方,直線距離不超過(guò)500米,并通過(guò)光纖直接連接交易所前置機(jī)。這樣的安排,讓QDP的交易操作比其他柜臺(tái)商快一個(gè)數(shù)量級(jí),一次報(bào)單操作耗時(shí)在300微秒左右,網(wǎng)絡(luò)往返時(shí)間在600微秒左右。
在一次交易行為中,存在客戶端、QDP服務(wù)器和交易所前置機(jī)三個(gè)參與者。客戶端就是交易人員的個(gè)人電腦,其上可以安裝各種交易軟件??蛻舳送ㄟ^(guò)互聯(lián)網(wǎng)連接QDP服務(wù)器,QDP服務(wù)器內(nèi)封裝了不同的交易席位,每個(gè)客戶端總是固定分配到某個(gè)席位的。用戶提交的各種交易請(qǐng)求,都交給QDP服務(wù)器來(lái)處理。QDP服務(wù)器的物理位置和交易所的機(jī)房非常接近,一般不超過(guò)500米,通過(guò)局域網(wǎng)光纖直連交易所前置機(jī)。交易所總的服務(wù)器對(duì)我們一般用戶而言,是不可見(jiàn)的,我們能連接到的只是交易所提供的前置機(jī)。
我們開(kāi)發(fā)的交易端程序可以部署在某臺(tái)客戶端上,當(dāng)然這樣互聯(lián)網(wǎng)通信的網(wǎng)絡(luò)延時(shí)較大,速度也不穩(wěn)定。我們一般會(huì)在QDP服務(wù)器上申請(qǐng)獨(dú)立席位,該席位為我們單獨(dú)使用,不再與其他客戶端共享。使用獨(dú)立席位的另一個(gè)好處是速度更快。我們的交易端程序直接部署在席位上,和QDP服務(wù)器基本沒(méi)有任何網(wǎng)絡(luò)延時(shí),和交易所前置的網(wǎng)絡(luò)延時(shí)也就在300微秒左右。另外,我們還可以通過(guò)其他方法進(jìn)一步提高速度,比如可以綁定某臺(tái)固定的交易所前置機(jī),而不是由QDP服務(wù)器隨機(jī)分配。
下面分別討論一下交易端模塊的幾個(gè)重要子模塊。
交易管理子模塊是交易端的核心模塊,其主要功能是根據(jù)從策略端傳過(guò)來(lái)的交易信號(hào)進(jìn)行交易行為,具體包括:報(bào)單錄入、報(bào)單撤銷、報(bào)單查詢等操作。該模塊是整個(gè)系統(tǒng)中真正進(jìn)行交易行為的模塊,要求具有很高的抗風(fēng)險(xiǎn)性能。另外很多策略的性能好壞與交易動(dòng)作的執(zhí)行效率密切相關(guān),尤其是高頻策略,所以本模塊的具體執(zhí)行算法很大程序決定了策略的盈利性能。該模塊也要完成與交易相關(guān)的一些其他操作,例如倉(cāng)位管理、資金管理等。
風(fēng)險(xiǎn)管理是任何程序化交易系統(tǒng)必不可少的重要功能,可以說(shuō),所有的交易系統(tǒng)風(fēng)險(xiǎn)控制是底線。任何一種策略,無(wú)論盈利能力多高,回撤率高的話,也很有可能造成一次虧損就會(huì)讓一年的盈利化為泡影,所以風(fēng)險(xiǎn)管控非常重要。風(fēng)險(xiǎn)管控整體可以分為兩大類,第一類是交易所層面的限制,例如每秒最多允許的報(bào)單數(shù),每個(gè)品種最多允許的撤單數(shù)等等。一旦違背這些規(guī)則,輕則禁止交易,重則停業(yè)整頓,所以萬(wàn)不可大意。第二類重要的風(fēng)險(xiǎn)則來(lái)之于不同的策略本身。例如對(duì)于日內(nèi)策略,一般在停盤(pán)前一段時(shí)間(例如5分鐘)禁止進(jìn)行開(kāi)倉(cāng)操作,或進(jìn)行強(qiáng)制的平倉(cāng)、鎖倉(cāng)操作等等。以上風(fēng)險(xiǎn)控制功能都在交易端代碼中完成。
日志管理也是必不可少的一環(huán)。交易行為具有連續(xù)性,非常有必要在交易結(jié)束后進(jìn)行檢討,日志因此非常重要。我們交易過(guò)程中所有重要的信息都可以記錄到日志中,當(dāng)然可以考慮適當(dāng)?shù)膭澐治募?。例如行情?shù)據(jù)可以放在行情日志中,交易行為可以放在交易日志中等等。另外在某些情況下,要對(duì)日志進(jìn)行特殊的處理,例如高頻交易。有些高頻交易對(duì)交易的時(shí)效性要求非常高,甚至達(dá)到微秒級(jí)別。而日志記錄不可避免的涉及到磁盤(pán)文件的讀寫(xiě),這些操作比較費(fèi)時(shí)。因此在高頻交易中,我們可以采用異步日志的方式。在交易過(guò)程中,進(jìn)行內(nèi)存讀寫(xiě),將日志內(nèi)容寫(xiě)入單獨(dú)的內(nèi)存區(qū)域;交易結(jié)束或者暫停期間,再將內(nèi)存中日志寫(xiě)入磁盤(pán)。這樣可以一定程序降低日志操作的時(shí)間消耗。
4 通信模塊
本系統(tǒng)的通信模塊采用C++語(yǔ)言編寫(xiě),基于Socket套接字技術(shù)實(shí)現(xiàn)。之所以采用這種技術(shù),是考慮到交易端有時(shí)會(huì)部署在本地計(jì)算機(jī)上,有時(shí)又會(huì)部署在遠(yuǎn)程席位上。而策略端基本上總是部署在本地計(jì)算機(jī)上的,因此策略端和交易端有時(shí)需要通過(guò)網(wǎng)絡(luò)進(jìn)行連接通信。Socket套接字本身是一種網(wǎng)絡(luò)通信技術(shù),可以很方便的實(shí)現(xiàn)遠(yuǎn)程通信。另外當(dāng)交易端部署在本地時(shí),可以將socket地址設(shè)置為127.0.0.1,而不需要對(duì)程序做大的修改。
5 總結(jié)
本文討論了一種組合型架構(gòu)的期貨程序化交易系統(tǒng),該系統(tǒng)中策略執(zhí)行和交易行為彼此獨(dú)立。該平臺(tái)最大的優(yōu)點(diǎn)是具有很強(qiáng)的靈活性。策略端可以選擇不同的第三方軟件,甚至可以同時(shí)選擇不同軟件作為備份。交易端利用C++開(kāi)發(fā),可以完成任意用戶獨(dú)特的策略需求。第二個(gè)重要優(yōu)勢(shì)則是具有很強(qiáng)的安全性,這對(duì)于資金量大的交易行為而言非常重要。所有交易行為在獨(dú)立的交易端中進(jìn)行,不會(huì)與行情軟件發(fā)生關(guān)系,不會(huì)被第三方獲取。行情數(shù)據(jù)可以同時(shí)連接多個(gè)接口,如果數(shù)據(jù)出錯(cuò),會(huì)有天然的備份。這些都帶來(lái)了極大的安全性。
當(dāng)然,本系統(tǒng)也有一定的局限性,這些都有待后續(xù)工作中改善。例如數(shù)據(jù)獲取也可以用QDP編程實(shí)現(xiàn),這樣可以進(jìn)一步提高系統(tǒng)的安全性。
參考文獻(xiàn)
[1]熊熊,袁海亮,張維,張永杰.程序化交易及其風(fēng)險(xiǎn)分析[J].電子科技大學(xué)學(xué)報(bào)(社科版)Jun.2011,Vol.13,No.3 32-39
[2]廣州博庭計(jì)算機(jī)科技有限公司,花生網(wǎng):http://www.hs633.com/pro/gl.php
[3]量投科技,QDP量投快速柜臺(tái):https://www.quantdo.com.cn/pages/qdpDetail.html
作者單位
廈門(mén)大學(xué)嘉庚學(xué)院信息科學(xué)與技術(shù)學(xué)院 福建省漳州市 363105