作者是知乎https://www.zhihu.com/people/dongkeren/posts董可人
Github連接https://github.com/taurusai/kungfu
的英文功夫Taurus.ai楚昭。團隊專為量化交易者設計的低延遲交易執(zhí)行系統(tǒng)功夫想要解決兩個核心問題:
交易數據實時存儲 - 為了追求交易速度伸刃,很多情況下交易者不得不放棄存儲功能以換取更高的執(zhí)行速度拴驮,這給盤后分析帶來很大困難庸汗,使分析缺乏必要的數據支持惑灵。
交易延遲分析及優(yōu)化 - 交易者缺乏測量交易延遲的標準化工具山上,關于延遲的統(tǒng)計數據往往只能憑感覺估算,在缺乏可靠的數據采集手段的情況下英支,優(yōu)化工作變得更加艱難佩憾。
針對這兩個問題,功夫在系統(tǒng)架構上做了特別的設計潭辈,目前系統(tǒng)分成以下三個模塊:
易筋經(yijinjing) - 專為金融交易設計的時間序列內存數據庫鸯屿,提供納秒級時間精度,可落地交易相關的全部數據把敢。
詠春(wingchun) - 策略執(zhí)行引擎寄摆,提供C ++及Python(2.7)開發(fā)接口,利用易筋經特性修赞,詠簧還提供一系列交易數據分析工具婶恼。
長拳(longfist) - 交易數據標準化定義及轉換器,支持靈活對接不同交易柜臺柏副。
功夫在系統(tǒng)設計上支持任意柜臺的對接(涵蓋中國所有股票勾邦,期貨市場),目前功夫開源版僅提供CTP和XTP柜臺對接的實現(xiàn)割择。如果需要接入更多柜臺請通過Taurus.ai官網聯(lián)系我們眷篇。開發(fā)者也可根據長拳標準自行開發(fā)新的柜臺接口。
使用初次柯林斯觀看我們的視頻教程荔泳。
python策略開發(fā)請參考python策略開發(fā)快速入門蕉饼,python策略api文檔
C ++策略開發(fā)請參考C ++策略開發(fā)快速入門,C ++策略api文檔
常見問題請參考問答玛歌。
想要在自己的機器上直接運行功夫(不用搬運工)參考可以環(huán)境準備
介紹更多請關注知乎專欄硅商沖擊昧港。
運行策略運行策略
功夫提供C ++及Python(2.7)策略開發(fā)接口,相關樣例演程程序可在以下代碼路徑找到:
$ cd kungfu/wingchun/strategy/cpp_demo$ cd kungfu/wingchun/strategy/py_demo
功夫默認安裝在名為bruce的用戶下支子,策略程序應以bruce身份運行以確保得到正確的文件讀取權限(sudo -u bruce)创肥。以py_demo / band_demo_strategy.py為例,使用以下方式運行策略,需要注意-n參數指定的策略名稱叹侄,是交易系統(tǒng)內對該策略的唯一標識巩搏,所有相關的交易記錄都通過該標識關聯(lián):
$ sudo -u bruce wingchun strategy -n band_demo -p /your/path/band_demo_strategy.py
C ++版本的策略Demo默認不編譯,如需編譯可參考如下步驟:
$ mkdir cpp_build$ cd cpp_build$ cmake ../../wingchun/strategy/cpp_demo$ make
C ++ Demo編譯后生成可執(zhí)行文件圈膏,運行策略不是通過wingchun命令而是直接執(zhí)行:
$ ./kungfu_strategy_demo
策略運行期間及結束后塔猾,可以使用wingchun命令查看策略運行狀態(tài):
$ wingchun help pos$ wingchun help report
系統(tǒng)運行期間,可使用如下命令查看系統(tǒng)后臺信息稽坤,其中包括了系統(tǒng)所有進程的PID丈甸,啟動和換日時間等信息:
示例中 '的Pid' 項表示現(xiàn)在 '分頁' 內存數據服務正在運行, 'MD' 行情服務正在運行尿褪, 'TD' 交易服務正在運行睦擂,還有一個策略名為 'demo_test' 的策略正在運行。
$ yjj status{'Client': {'MDEngineCTP': {'hash_code': 1788426942,'is_strategy': False,'is_writing': True,'pid': 15493,'registerTime': 1512726147926855797,'rid_start': -1,'trade_engine_vec': [],'users': [4]},'Pid': {15423: ['paged'],15493: ['MDEngineCTP_R', 'MDEngineCTP', 'RAW_MDEngineCTP'],15494: ['TDEngineCTP_SR','TDEngineCTP','SEND_TDEngineCTP','RAW_TDEngineCTP'],16664: ['demo_test', 'demo_test_R']},'Task': ('running',10000,{'KfController': {'engine_ends': ['2017-12-09 16:30:00'],'engine_starts': ['2017-12-09 09:15:00'],'switch_day': '2017-12-09 17:00:00'},'PidCheck': {},'TempPage': {}}),'Time': '2017-12-08 17:52:58'
系統(tǒng)日志存放在/ shared / kungfu / log目錄下杖玲。
日志文件日志內容功能
page_engine.log內存數據庫日志記錄內存數據庫及其他功能使用內存數據庫的情況
engine_md.log行情服務項日志記錄行情服務啟動和運行情況
engine_trade.log交易服務項日志記錄交易服務啟動和執(zhí)行情況
戰(zhàn)略/ xxx.log策略運行日志記錄策略的運行情況
wingchun / xxx.log行情和交易服務的分接口詳細日志分接口記錄了行情和交易服務的詳細日志
系統(tǒng)提供了內存數據庫查看和導出工具:
內存數據庫查看工具幫助
$ yjj journal -hOptions:-h [ --help ]? ? ? ? ? ? ? ? ? ? ? ? Help screen-n [ --name ] arg? ? ? ? ? ? ? ? ? ? Journal Name-p [ --page ]? ? ? ? ? ? ? ? ? ? ? ? Just Page Header-v [ --verify ]? ? ? ? ? ? ? ? ? ? ? Verify hash code-k [ --keep ]? ? ? ? ? ? ? ? ? ? ? ? keep listening-t [ --time ]? ? ? ? ? ? ? ? ? ? ? ? time visualized-d [ --detail ]? ? ? ? ? ? ? ? ? ? ? data details-c [ --current ]? ? ? ? ? ? ? ? ? ? ? start from current-l [ --length ] arg (=20)? ? ? ? ? ? Char num of frame data to print-m [ --msgtype ] arg? ? ? ? ? ? ? ? ? Message type printed, -eg: -m 10,11-r [ --rmsgtype ] arg? ? ? ? ? ? ? ? Message type not printed, -eg: -r 10,11-s [ --start_time ] arg (=20000101-13:30:00)start time (%Y%m%d-%H:%M:%S)-e [ --end_time ] arg (=20200101-00:00:00)end time (%Y%m%d-%H:%M:%S)
查看內存數據庫中指定信息:
$ yjj journal -n TD_CTP -s 20171114-14:40:00 -e 20171114-14:45:00 -d -t -m 206StartTime:? ? ? 20171114-14:40:00EndTime:? ? ? ? 20171114-14:45:00Folder: /shared/kungfu/journal/TD/CTP/ShortName:? ? ? TD_CTPMsgType to Print: 206[0] (st)1 (so)1 (na)1510641601378381049 (en)0 (vn)20171114-14:40:01 (fl)302 (dl)264 (hl)38 (hs)4109164010 (mt)206 (lf)1 (id)8000122 (er)0 (cn)9999078622BrokerID: (c11) 9999UserID: (c16) 078622InvestorID: (c19) 078622BusinessUnit: (c21)InstrumentID: (c31) rb1801OrderRef: (c21) 124ExchangeID: (c11) SHFETradeID: (c21)? ? ? 125394OrderSysID: (c31)? ? ? 196229ParticipantID: (c11) 9999ClientID: (c21) 9999078602Price:? (d) 3946Volume:? (i) 1TradingDay: (c13) 20171114TradeTime: (c13) 14:40:00Direction:? (t) SellOffsetFlag:? (t) OpenHedgeFlag:? (t) Speculation
內存數據庫導出工具幫助:
$ yjj dump -husage: journal_dumper [-h] [-n NAME] [-m MSG_TYPE] [-o OUTPUT] [-v] [-p] [-s START] [-e END]optional arguments:-h, --help? ? ? ? ? ? show this help message and exit-n NAME, --name NAME? journal name-m MSG_TYPE, --msg_type MSG_TYPEmsg type to dump-o OUTPUT, --output OUTPUToutput file name-v, --visualize? ? ? visualize the time-p, --print_out? ? ? print to console while dumping-s START, --start STARTstart time (&Y&m&d-&H:&M:&S)-e END, --end END? ? end time (&Y&m&d-&H:&M:&S)
導出內存數據庫中指定信息:
$ yjj dump -n MD_CTP -s 20171114-09:30:00 -e 20171114-16:00:00 -m 101 -o md_20171114.csv$ head -n 3 md_20171114.csvTradingDay(c13),InstrumentID(c31),ExchangeID(c9),ExchangeInstID(c64),LastPrice(d),PreSettlementPrice(d),PreClosePrice(d),PreOpenInterest(d),OpenPrice(d),HighestPrice(d),LowestPrice(d),Volume(i),Turnover(d),OpenInterest(d),ClosePrice(d),SettlementPrice(d),UpperLimitPrice(d),LowerLimitPrice(d),PreDelta(d),CurrDelta(d),UpdateTime(c13),UpdateMillisec(i),BidPrice1(d),BidVolume1(i),AskPrice1(d),AskVolume1(i),BidPrice2(d),BidVolume2(i),AskPrice2(d),AskVolume2(i),BidPrice3(d),BidVolume3(i),AskPrice3(d),AskVolume3(i),BidPrice4(d),BidVolume4(i),AskPrice4(d),AskVolume4(i),BidPrice5(d),BidVolume5(i),AskPrice5(d),AskVolume5(i),h_nano(l),h_msg_type(i),h_request_id(i),h_source(i),h_is_last(i),h_error_id(i),j_name(s)20171114,rb1801,,,3941.0,3860.0,3894.0,1794552.0,3900.0,3950.0,3873.0,821770,32084979660.0,1697634.0,1.79769313486e+308,1.79769313486e+308,4130.0,3589.0,1.79769313486e+308,1.79769313486e+308,14:19:08,500,3941.0,24,3942.0,340,1.79769313486e+308,0,1.79769313486e+308,0,1.79769313486e+308,0,1.79769313486e+308,0,1.79769313486e+308,0,1.79769313486e+308,0,1.79769313486e+308,0,1.79769313486e+308,0,1510640349349309138,101,-1,1,1,0,MD_CTP20171114,rb1801,,,3941.0,3860.0,3894.0,1794552.0,3900.0,3950.0,3873.0,821772,32085058480.0,1697634.0,1.79769313486e+308,1.79769313486e+308,4130.0,3589.0,1.79769313486e+308,1.79769313486e+308,14:19:09,0,3941.0,23,3942.0,341,1.79769313486e+308,0,1.79769313486e+308,0,1.79769313486e+308,0,1.79769313486e+308,0,1.79769313486e+308,0,1.79769313486e+308,0,1.79769313486e+308,0,1.79769313486e+308,0,1510640349845391063,101,-1,1,1,0,MD_CTP
示例中-m參數為信息分類標記顿仇,常用的信息分類如下表,全部信息分類可查看源代碼/longfist/longfist/LFConstants.h
名稱值含義
MSG_TYPE_LF_MD101蜱行情數據摆马,在雜志/ MD目錄下相應接口目錄下數據庫文件中
MSG_TYPE_LF_BAR_MD110酒吧行情數據臼闻,在雜志/ MD目錄下相應接口目錄下數據庫文件中
MSG_TYPE_LF_QRY_POS201查詢持倉請求數據,在雜志/策略/相應策略數據庫文件中
MSG_TYPE_LF_RSP_POS202查詢持倉返回數據囤采,在雜志/ TD /相應接口目錄下數據庫文件中
MSG_TYPE_LF_ORDER204下單請求數據述呐,在雜志/策略/相應策略數據庫文件中
MSG_TYPE_LF_RTN_ORDER205下單回報數據,在雜志/ TD /相應接口目錄下數據庫文件中
MSG_TYPE_LF_RTN_TRADE206成交回報數據蕉毯,在雜志/ TD /相應接口目錄下數據庫文件中
MSG_TYPE_LF_ORDER_ACTION207撤單請求數據乓搬,在雜志/策略/相應策略數據庫文件中
MSG_TYPE_LF_RSP_ACCOUNT209撤單回報數據,在雜志/ TD /相應接口目錄下數據庫文件中
統(tǒng)計分析工具幫助:
$ wingchun report -hOptions:-h [ --help ]? ? ? ? ? ? ? ? ? ? ? ? Help screen-n [ --name ] arg? ? ? ? ? ? ? ? ? ? strategy name-l [ --list ]? ? ? ? ? ? ? ? ? ? ? ? list all sessions with index-o [ --order ]? ? ? ? ? ? ? ? ? ? ? ? show orders-t [ --trade ]? ? ? ? ? ? ? ? ? ? ? ? show trades-a [ --aggregate ]? ? ? ? ? ? ? ? ? ? show aggregated latency stat-d [ --detail ]? ? ? ? ? ? ? ? ? ? ? list order detail nanos-i [ --index ] arg (=-1)? ? ? ? ? ? ? session index-s [ --start_time ] arg (=20000101-13:30:00)start time (%Y%m%d-%H:%M:%S)-e [ --end_time ] arg (=20200101-00:00:00)end time (%Y%m%d-%H:%M:%S)
委托記錄:
$ wingchun report -n band_demo -o+-----------------------------------------------------------------------------------------------------------------+|? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Kungfu order latency report? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |+-----------+-----------------+--------------+--------------+----------+----------+----------+--------------+-----+| order_id? | rcv_time? ? ? ? | TTT-b(ns)? ? | TTT-a(ns)? ? | ticker? | price? ? | volume? | offset? ? ? | dir |+-----------+-----------------+--------------+--------------+----------+----------+----------+--------------+-----+|? ? 8000001|20171204-11:01:27|? ? ? ? ? 5779|? ? ? ? 43404|? ? rb1801|? ? 3967.0|? ? ? ? 1|? ? ? ? ? Open|? Buy|+-----------+-----------------+--------------+--------------+----------+----------+----------+--------------+-----+|? ? 8000002|20171204-11:01:28|? ? ? ? ? 5297|? ? ? ? 51800|? ? rb1801|? ? 3967.0|? ? ? ? 1|? ? ? ? ? Open|? Buy|+-----------+-----------------+--------------+--------------+----------+----------+----------+--------------+-----+|? ? 8000003|20171204-11:01:29|? ? ? ? ? 4965|? ? ? ? 45227|? ? rb1801|? ? 3967.0|? ? ? ? 1|? ? ? ? ? Open|? Buy|+-----------+-----------------+--------------+--------------+----------+----------+----------+--------------+-----+|? ? 8000004|20171204-11:01:31|? ? ? ? ? 6469|? ? ? ? 51424|? ? rb1801|? ? 3967.0|? ? ? ? 1|? ? ? ? ? Open|? Buy|+-----------+-----------------+--------------+--------------+----------+----------+----------+--------------+-----+|? ? 8000005|20171204-11:01:31|? ? ? ? ? 7800|? ? ? ? 52847|? ? rb1801|? ? 3967.0|? ? ? ? 1|? ? ? ? ? Open|? Buy|+-----------+-----------------+--------------+--------------+----------+----------+----------+--------------+-----+
成交記錄:
$ wingchun report -n band_demo -t+-------------------------------------------------------------------------------------------+|? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Kungfu trade latency report? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |+-----------+---+-----------------+--------------+----------+---------+----------+----------+| order_id? |idx| rcv_time? ? ? ? | OTR(ns)? ? ? | ticker? | t_time? | t_price? | t_volume |+-----------+---+-----------------+--------------+----------+---------+----------+----------+|? ? 8000000|? 1|20171114-14:28:03|? ? ? 64549194|? ? rb1801| 14:28:03|? ? 3938.0|? ? ? ? 1|+-----------+---+-----------------+--------------+----------+---------+----------+----------+|? ? 8000000|? 2|20171114-14:41:32|? 808582415662|? ? rb1801| 14:41:31|? ? 3946.0|? ? ? ? 1|+-----------+---+-----------------+--------------+----------+---------+----------+----------+|? ? 8000001|? 1|20171114-14:28:08|? ? ? 66985968|? ? rb1801| 14:28:07|? ? 3939.0|? ? ? ? 1|+-----------+---+-----------------+--------------+----------+---------+----------+----------+|? ? 8000001|? 2|20171114-14:42:11|? 843622609364|? ? rb1801| 14:42:11|? ? 3948.0|? ? ? ? 1|+-----------+---+-----------------+--------------+----------+---------+----------+----------+
延遲統(tǒng)計:
$ wingchun report -n band_demo -a+------------------------------------------------------------------------------------------------------+|? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Kungfu latency statistics? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |+------+-------------------+--------------+--------------+--------------+--------------+-------+-------+| type | description? ? ? | mean(ns)? ? | std(ns)? ? ? | min(ns)? ? ? | max(ns)? ? ? | valid | total |+------+-------------------+--------------+--------------+--------------+--------------+-------+-------+| TTT? | (tick-to-trade)? |? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |+------+-------------------+--------------+--------------+--------------+--------------+-------+-------+|? ? ? | before API? ? ? ? |? ? ? ? ? 4323|? 3.88215e+03|? ? ? ? ? 2361|? ? ? ? 52612|? 1000|? 1000|+------+-------------------+--------------+--------------+--------------+--------------+-------+-------+|? ? ? | after API? ? ? ? |? ? ? ? 50880|? 1.61630e+05|? ? ? ? 35586|? ? ? 5064745|? 1000|? 1000|+------+-------------------+--------------+--------------+--------------+--------------+-------+-------+| STR? | strategy calc? ? |? ? ? ? ? 1164|? 2.43951e+03|? ? ? ? ? 401|? ? ? ? 47234|? 1000|? 1000|+------+-------------------+--------------+--------------+--------------+--------------+-------+-------+| OTR? | (order-to-return) |? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |+------+-------------------+--------------+--------------+--------------+--------------+-------+-------+|? ? ? | rsp order insert? |? ? ? ? ? ? 0|? 0.00000e+00|? ? ? ? ? ? 0|? ? ? ? ? ? 0|? ? ? 0|? 1000|+------+-------------------+--------------+--------------+--------------+--------------+-------+-------+|? ? ? | first rtn order? |? ? ? 39174735|? 1.97535e+07|? ? ? 30131196|? ? 210217560|? 1000|? 1000|+------+-------------------+--------------+--------------+--------------+--------------+-------+-------+|? ? ? | first rtn trade? |? ? ? ? ? ? 0|? 0.00000e+00|? ? ? ? ? ? 0|? ? ? ? ? ? 0|? ? ? 0|? 1000|+------+-------------------+--------------+--------------+--------------+--------------+-------+-------+|? ? ? | all rtn trade? ? |? ? ? ? ? ? 0|? 0.00000e+00|? ? ? ? ? ? 0|? ? ? ? ? ? 0|? ? ? 0|? 1000|+------+-------------------+--------------+--------------+--------------+--------------+-------+-------+
注:以上樣例主要展示功能性代虾,延遲具體數字在開發(fā)機上得到进肯,不具備參考性關于如何得到更優(yōu)的延遲數字,稍后會添加相關文檔說明棉磨。
交易系統(tǒng)支持持倉導出為csv文件以及csv文件設置為持倉江掩。
查看持倉設置工具幫助:
$ wingchun pos -hOptions:-h [ --help ]? ? ? ? Help screen-t [ --type ] arg? ? type ("set"/"get")-s [ --source ] arg? source index (eg CTP=1)-n [ --name ] arg? ? strategy name-o [ --output ]? ? ? output to file-r [ --raw ]? ? ? ? ? print raw data-d [ --detail ]? ? ? print user info details-l [ --list ]? ? ? ? list all files-j [ --json ] arg? ? json_file-c [ --csv ] arg? ? ? csv_file format:ticker, net_tot, net_yd, long_tot, long_yd, short_tot,short_yd
導出持倉和使用CSV文件設置持倉:
$ wingchun pos -t get -n band_demo -s 1 -o -c band_demo.csv=========== (name) band_demo (source)14 =========nano:1514453987908204897 (20171228-17:39:47)ok:Yes-------rb1805(net)0,0(long)6,6(short)6,6(net_c)0,0(long_c)0,0(short_c)0,0-------printed to csv file: band_demo.csv-------$ wingchun pos -t set -n band_demo -s 1 -c band_demo.csvset pos from csv file: band_demo.csv
0.0.1:初始化版本
0.0.2:
修正了PosHandler的一個更新情況的潛在風險
修正沒有close的文句句
修正了memcpy的潛在越界問題
編譯選項優(yōu)化為O3
0.0.3:
增強wingchun report中的延遲統(tǒng)計工具,新增調用API前的系統(tǒng)內耗時(API之前的TTT)
0.0.4:
增加FeeHandler模??塊乘瓤,增加策略中的Pnl實時計算支持
0.0.5:
增加對股票交易柜臺xtp的支持
在系統(tǒng)docker中增加了numa(xtp的依賴)环形,不希望更新docker的用戶可以通過yum install numactl來手動安裝
開發(fā)文檔即將上線,請關注Taurus.ai官網.QQ交流群312745666馅扣,入群問題答案:taurus.ai