在介紹高頻交易系統(tǒng)之前披泪,首先科普一下量化交易,或者叫程序化交易的基本概念部服。
量化交易在英文中的稱呼是Quantitative transaction哟忍,即“(精確)定量的交易”。其內(nèi)在含義便是根據(jù)市場(chǎng)當(dāng)下的量?jī)r(jià)情況瑟押,基于嚴(yán)謹(jǐn)?shù)慕灰撞呗圆蠼荩?jì)算出合適的出入場(chǎng)價(jià)格和量。
但是人的大腦并不能做出如此實(shí)時(shí)復(fù)雜的計(jì)算,所以量化交易具體事通過(guò)程序化交易的技術(shù)手段來(lái)實(shí)現(xiàn)的嫩舟。
接下來(lái)我們來(lái)聊一下:
量化交易系統(tǒng)現(xiàn)狀
我們?yōu)槭裁匆燧喿?/i>
讀完本文氢烘,讀者可了解目前業(yè)內(nèi)一些交易系統(tǒng)的情況,明白我們?yōu)槭裁匆罱ㄗ约旱慕灰紫到y(tǒng)家厌。
量化交易系統(tǒng)現(xiàn)狀
根據(jù)筆者了解到的情況播玖,目前業(yè)內(nèi)量化公募或者私募實(shí)現(xiàn)自己的交易策略有兩種方法:
軟件廠商售賣的產(chǎn)品化交易系統(tǒng)
投資機(jī)構(gòu)的自研系統(tǒng)
軟件廠商提供的交易系統(tǒng)產(chǎn)品
筆者用過(guò)一些類似的產(chǎn)品,比如?文華財(cái)經(jīng)饭于、?MultiCharts蜀踏、?Tradeblazer等,這些系統(tǒng)筆者都用過(guò)掰吕,基本上來(lái)說(shuō)可以滿足大部分量化投資者的需求果覆。
這些產(chǎn)品為了考慮到所有的專業(yè)和非專業(yè)人士的需求,往往會(huì)有較為傻瓜化的操作方式殖熟。 使用者不需要了解很多計(jì)算機(jī)的知識(shí)局待,只需要學(xué)會(huì)使用簡(jiǎn)單的編程語(yǔ)言(多為Python)再加上一些點(diǎn)按和選擇操作,就可以實(shí)現(xiàn)大部分自己的策略菱属。有些產(chǎn)品甚至不需要編寫(xiě)策略代碼钳榨,可以直接使用一種特定格式的計(jì)算公式進(jìn)行組合,就能構(gòu)造出自己的策略纽门。
但是重绷,為什么比較專業(yè)的團(tuán)隊(duì)還是不喜歡用這些產(chǎn)品呢?因?yàn)檫@些產(chǎn)品功能雖然豐富膜毁,但是對(duì)于一些資深團(tuán)隊(duì)來(lái)說(shuō)不夠?qū)I(yè):
系統(tǒng)效率低下
因?yàn)檫@些產(chǎn)品大都是定制一門現(xiàn)有語(yǔ)言作為自己的策略實(shí)現(xiàn)語(yǔ)言昭卓,例如我的上家所開(kāi)發(fā)的產(chǎn)品,是對(duì)Python進(jìn)行了定制后作為策略開(kāi)發(fā)的語(yǔ)言瘟滨。 python語(yǔ)言由于其本身的特點(diǎn)候醒,并不支持多線程技術(shù),所以整個(gè)策略幾乎以一種同步(Synchronous)的方式在執(zhí)行杂瘸,無(wú)法高效利用異步(Asynchronous)的方式達(dá)到對(duì)網(wǎng)絡(luò)倒淫、磁盤IO等信息的最快速處理。學(xué)過(guò)計(jì)算機(jī)的同學(xué)知道败玉,Synchronous的執(zhí)行模式會(huì)導(dǎo)致程序阻塞并且在阻塞期間無(wú)法進(jìn)行其他的運(yùn)算敌土。可以想象运翼,當(dāng)一個(gè)最佳報(bào)價(jià)Tick來(lái)了的時(shí)候你的程序還阻塞在向磁盤寫(xiě)日志的過(guò)程中不能自拔返干,從而錯(cuò)過(guò)了一個(gè)最佳入場(chǎng)機(jī)會(huì),是不是會(huì)很郁悶血淌。
系統(tǒng)可開(kāi)發(fā)性弱
這樣的系統(tǒng)無(wú)法提供較高的性能矩欠,適合做CTA這類型不需要頻繁下單财剖,不需要進(jìn)行準(zhǔn)確入場(chǎng)的策略。
系統(tǒng)穩(wěn)定性弱
另外這些系統(tǒng)為了實(shí)現(xiàn)用戶友好癌淮,往往選擇了支持圖形界面的windows系統(tǒng)躺坟。而windows系統(tǒng)本身的穩(wěn)定性就較低,這也會(huì)給交易帶來(lái)一部分額外的風(fēng)險(xiǎn)乳蓄。
此外咪橙,這些系統(tǒng)往往將實(shí)驗(yàn)、交易兩部分功能集成為一個(gè)統(tǒng)一的軟件虚倒,導(dǎo)致很多時(shí)候策略就運(yùn)行在客戶機(jī)系統(tǒng)上美侦,這樣則增加了交易的風(fēng)險(xiǎn)。
投資機(jī)構(gòu)的自研系統(tǒng)
具有一定軟件開(kāi)發(fā)實(shí)力的機(jī)構(gòu)裹刮,擁有自己的策略實(shí)現(xiàn)方式音榜。由于不受交易系統(tǒng)設(shè)計(jì)的限制庞瘸,這樣幾乎可以100%的實(shí)現(xiàn)策略邏輯捧弃,實(shí)現(xiàn)對(duì)下單撤單更精確的控制。
筆者見(jiàn)過(guò)最多的就是一個(gè)程序就是一個(gè)策略擦囊,如果運(yùn)行多個(gè)策略违霞,需要啟動(dòng)多個(gè)程序。
但是瞬场,這就會(huì)引發(fā)一些問(wèn)題:
策略與系統(tǒng)耦合度很高
如果一個(gè)策略想在另外一個(gè)交易商接口上運(yùn)行就很麻煩买鸽。例如之前的策略是針對(duì)CTP的,如果新賬戶使用的是Femas飛馬接口贯被,就需要重新實(shí)現(xiàn)一次眼五,這樣同一策略在不同平臺(tái)上的一致性就很難保證。
沒(méi)有足夠的策略抽象
策略開(kāi)發(fā)者在開(kāi)發(fā)策略的時(shí)候除了要考慮策略本身的邏輯彤灶,還要關(guān)注交易底層的細(xì)節(jié)看幼。這樣就無(wú)法全身心投入策略邏輯設(shè)計(jì)。 此外幌陕,一個(gè)程序一個(gè)策略的方式诵姜,也不方便進(jìn)行統(tǒng)一策略管理。有些賬號(hào)的登陸時(shí)有限制的搏熄,例如CTP賬號(hào)同時(shí)只能登陸N次棚唆,那也就限制了在這個(gè)賬戶上面最多能運(yùn)行N個(gè)策略。
我們?yōu)槭裁匆燧喿?/h1>專業(yè)的策略開(kāi)發(fā)框架
使用C++作為策略開(kāi)發(fā)語(yǔ)言心例,內(nèi)存占用低宵凌,運(yùn)行速度快。另外止后,可使用大量第三方庫(kù)摆寄,如有名的QuantLIb。
“天下武功,唯快不破”
靈活配置交易目標(biāo)微饥。
“我的這個(gè)策略需要同時(shí)輸入期貨的3個(gè)合約逗扒、期權(quán)的兩個(gè)合約以及一只股票的tick數(shù)據(jù),而且要同時(shí)對(duì)一個(gè)股票賬戶與一個(gè)期權(quán)賬戶下單欠橘,能做到嗎矩肩?能!”
對(duì)交易邏輯進(jìn)行高層次抽象肃续,將策略開(kāi)發(fā)者從交易接口的底層細(xì)節(jié)中解脫出來(lái)黍檩。
“CTP接口的CThostFtdcDepthMarketDataField是啥?飛馬接口的OnRspUserLogin又是啥始锚?我其實(shí)一點(diǎn)都不需要關(guān)心刽酱。”
可自定義C++變量的“探針”瞧捌,通過(guò)“探針”可以在盤中實(shí)時(shí)可視化任何變量的走勢(shì)棵里。
“bidprice/askprice 這兩個(gè)指標(biāo)放在一個(gè)圖里,分別用紅色和藍(lán)色姐呐。volume放在另外一個(gè)圖里殿怜,用黃色柱狀圖表示,在交易的時(shí)候我需要實(shí)時(shí)的看到這兩個(gè)圖的數(shù)據(jù)變化曙砂!”
策略可以將當(dāng)前運(yùn)行狀態(tài)保存到磁盤头谜,方便進(jìn)行系統(tǒng)遷移。
“系統(tǒng)需要重啟你下鸠澈,我先把當(dāng)前線上的運(yùn)行的所有策略保存一下柱告。重啟完畢后我再恢復(fù)~”
策略可以自定義“人工干預(yù)動(dòng)作”,在線上策略運(yùn)行過(guò)程中,可人工向策略發(fā)送一些預(yù)定義的信號(hào)笑陈。
“突然發(fā)布的新聞對(duì)螺紋鋼走勢(shì)產(chǎn)生了嚴(yán)重影響际度,人工發(fā)一個(gè)信號(hào)讓策略強(qiáng)行平倉(cāng)吧⌒滦猓”
同一交易服務(wù)器上的不同策略之間可以互相通信甲脏。
“這10個(gè)策略組成的策略組最多持倉(cāng)30手,組內(nèi)每個(gè)策略在開(kāi)倉(cāng)前先判斷一下其他策略的持倉(cāng)情況妹笆】榍耄”
優(yōu)雅的框架,定義了大量的宏拳缠,是的策略的代碼簡(jiǎn)潔易懂墩新。
“在寫(xiě)代碼方面,我有潔癖窟坐『Tǎ”
下面就是一個(gè)最簡(jiǎn)單的策略绵疲,這個(gè)策略什么都不做,但是展示了系統(tǒng)的大部分功能:
看到上面的策略模版臣疑,讀者們可能要問(wèn):STRATEGY_TEMPLATE_DECLARE盔憨、
BEGIN_SERIALIZATION、PARAMETER_DOUBLE讯沈、BEGIN_GRAPH類似的這些是什么東東郁岩,為什么我學(xué)C++的時(shí)候從來(lái)沒(méi)有看到過(guò)?
別著急缺狠,這些其實(shí)都是為了策略的代碼更加簡(jiǎn)潔而預(yù)先設(shè)定好的一些宏定義问慎。在后面的文章中我會(huì)展開(kāi)詳細(xì)講一些這些宏的設(shè)計(jì)。
其中OnTick是當(dāng)行情數(shù)據(jù)來(lái)了的時(shí)候策略需要做的事情挤茄,OnTrade是報(bào)單成交的時(shí)候需要做的事情如叼,而OnOrder會(huì)通知一些撤單相關(guān)的信息。策略開(kāi)發(fā)者并不需要關(guān)心 策略到底是跑在CTP平臺(tái)還是飛馬或者盈透平臺(tái)穷劈,是不是so easy~~
專業(yè)的交易系統(tǒng)
研發(fā)環(huán)境笼恰、交易環(huán)境、監(jiān)控環(huán)境分離囚衔。
“剛才我不小心踢掉電源了挖腰!不要著急雕沿,策略都在遠(yuǎn)程的服務(wù)器上安全地運(yùn)行练湿。”
資源占用小审轮,運(yùn)行穩(wěn)定肥哎。
“我這個(gè)策略要連續(xù)不間斷跑一年,而且要無(wú)人值守疾渣!”
擴(kuò)展性強(qiáng)篡诽,可對(duì)接大部分的交易&&行情接口。目前已經(jīng)支持CTP榴捡、
飛馬杈女、盈透、大連飛創(chuàng)等接口吊圾。
“咱們這個(gè)新產(chǎn)品需要用xxx接口去交易达椰。沒(méi)問(wèn)題,寫(xiě)個(gè)插件就行项乒ⅲ”
友好的策略監(jiān)控。
“把這10個(gè)策略的監(jiān)控圖調(diào)出來(lái)檀何,平鋪顯示蝇裤!”
實(shí)時(shí)日志顯示廷支。
“每一筆交易的日志我都要立馬看到!”
下面運(yùn)行在本地的監(jiān)控系統(tǒng)一些截圖:
這些是熱軋卷板和螺紋鋼的套利栓辜,同一個(gè)策略恋拍,不同的運(yùn)行參數(shù)進(jìn)行不同周期的套利∨核Γ可以看到一共有幾十個(gè)策略在運(yùn)行芝囤。
專業(yè)的策略研發(fā)系統(tǒng)
數(shù)據(jù)可視化。
多種盈虧自動(dòng)計(jì)算辛萍。
下圖是對(duì)一個(gè)策略的歷史數(shù)據(jù)測(cè)試結(jié)果:
在接下來(lái)的一系列文章中悯姊,我將帶領(lǐng)大家一步一步實(shí)現(xiàn)這個(gè)交易系統(tǒng)。
文章內(nèi)容請(qǐng)移步到我的博客?http://www.huyifeng.net/? 歡迎一起交流討論贩毕。
這里先附上Github地址