作者是知乎https://www.zhihu.com/people/dongkeren/posts董可人
Github连接https://github.com/taurusai/kungfu
的英文功夫Taurus.ai。团队专为量化交易者设计的低延迟交易执行系统功夫想要解决两个核心问题:
交易数据实时存储 - 为了追求交易速度,很多情况下交易者不得不放弃存储功能以换取更高的执行速度,这给盘后分析带来很大困难,使分析缺乏必要的数据支持。
交易延迟分析及优化 - 交易者缺乏测量交易延迟的标准化工具,关于延迟的统计数据往往只能凭感觉估算,在缺乏可靠的数据采集手段的情况下,优化工作变得更加艰难。
针对这两个问题,功夫在系统架构上做了特别的设计,目前系统分成以下三个模块:
易筋经(yijinjing) - 专为金融交易设计的时间序列内存数据库,提供纳秒级时间精度,可落地交易相关的全部数据。
咏春(wingchun) - 策略执行引擎,提供C ++及Python(2.7)开发接口,利用易筋经特性,咏簧还提供一系列交易数据分析工具。
长拳(longfist) - 交易数据标准化定义及转换器,支持灵活对接不同交易柜台。
功夫在系统设计上支持任意柜台的对接(涵盖中国所有股票,期货市场),目前功夫开源版仅提供CTP和XTP柜台对接的实现。如果需要接入更多柜台请通过Taurus.ai官网联系我们。开发者也可根据长拳标准自行开发新的柜台接口。
使用初次柯林斯观看我们的视频教程。
python策略开发请参考python策略开发快速入门,python策略api文档
C ++策略开发请参考C ++策略开发快速入门,C ++策略api文档
常见问题请参考问答。
想要在自己的机器上直接运行功夫(不用搬运工)参考可以环境准备
介绍更多请关注知乎专栏硅商冲击。
运行策略运行策略
功夫提供C ++及Python(2.7)策略开发接口,相关样例演程程序可在以下代码路径找到:
$ cd kungfu/wingchun/strategy/cpp_demo$ cd kungfu/wingchun/strategy/py_demo
功夫默认安装在名为bruce的用户下,策略程序应以bruce身份运行以确保得到正确的文件读取权限(sudo -u bruce)。以py_demo / band_demo_strategy.py为例,使用以下方式运行策略,需要注意-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编译后生成可执行文件,运行策略不是通过wingchun命令而是直接执行:
$ ./kungfu_strategy_demo
策略运行期间及结束后,可以使用wingchun命令查看策略运行状态:
$ wingchun help pos$ wingchun help report
系统运行期间,可使用如下命令查看系统后台信息,其中包括了系统所有进程的PID,启动和换日时间等信息:
示例中 '的Pid' 项表示现在 '分页' 内存数据服务正在运行, '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'
系统日志存放在/ shared / kungfu / log目录下。
日志文件日志内容功能
page_engine.log内存数据库日志记录内存数据库及其他功能使用内存数据库的情况
engine_md.log行情服务项日志记录行情服务启动和运行情况
engine_trade.log交易服务项日志记录交易服务启动和执行情况
战略/ xxx.log策略运行日志记录策略的运行情况
wingchun / xxx.log行情和交易服务的分接口详细日志分接口记录了行情和交易服务的详细日志
系统提供了内存数据库查看和导出工具:
内存数据库查看工具帮助
$ 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 /相应接口目录下数据库文件中
统计分析工具帮助:
$ 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|+-----------+---+-----------------+--------------+----------+---------+----------+----------+
延迟统计:
$ 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|+------+-------------------+--------------+--------------+--------------+--------------+-------+-------+
注:以上样例主要展示功能性,延迟具体数字在开发机上得到,不具备参考性关于如何得到更优的延迟数字,稍后会添加相关文档说明。
交易系统支持持仓导出为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的潜在越界问题
编译选项优化为O3
0.0.3:
增强wingchun report中的延迟统计工具,新增调用API前的系统内耗时(API之前的TTT)
0.0.4:
增加FeeHandler模块,增加策略中的Pnl实时计算支持
0.0.5:
增加对股票交易柜台xtp的支持
在系统docker中增加了numa(xtp的依赖),不希望更新docker的用户可以通过yum install numactl来手动安装
开发文档即将上线,请关注Taurus.ai官网.QQ交流群312745666,入群问题答案:taurus.ai