念念不忘,必有回响 - 为速度而生的开源量化交易系统来了

作者是知乎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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容