本文作者:袁煜华,中粮祈德丰首席期权量化及架构师。
四家期货交易所的技术子公司各自开发了一套交易接口,码农矿工这些程序猿都想知道哪个好(用)。在参加了所有四家交易所的期权仿真测试之后,我们的结论是用各个交易所自己的技术子公司开发的系统是最好的选择,上期所产品用CTP,中金所产品用飞马,大商所产品用飞创,郑商所产品用易盛。不过我们在实测一个交易所的时候,也就是CTP加另一套系统,原因是CTP是唯一确认同时支持四家期货交易所期权做市商报价的系统,其他三套系统是否全支持我们并不清楚也没有测试过。
我们从API的角度看看哪家最强。
先看看各个系统在发一笔报价,撤一笔报价,和成交时分别收到的回调函数的数量。综合来看,飞创和易盛相对高效,CTP冗余回报最多。综合起来最精简的接口应该是发一笔报价2条回报,撤一笔报价2条回报,成交时1条回报。飞创在撤的时候多了1条,易盛在成交的时候多了1条,飞马用了正好多了一倍数量的回报,而CTP一半以上的回报其实可以被精简掉。
| 报价 | 撤报价 | 成交 |
CTP | 4条OnRtnOrder 2条OnRtnQuote | 2条OnRtnQuote 2条OnRtnOrder | 1条OnRtnOrder 1条OnRtnTrade |
飞马 | 1条OnRspQuoteInsert 2条OnRtnOrder 1条OnRtnQuote | 1条OnRspQuoteAction 2条OnRtnOrder 1条OnRtnQuote | 1条OnRtnOrder 1条OnRtnTrade |
飞创 | 1条OnRspQuoteInsert 1条OnRtnQuoteInsert | 1条OnRspQuoteCancel 2条OnRtnQuoteCancel | 1条OnRtnQuoteMatchedInfo |
易盛 | 2条OnRtnOrder | 2条OnRtnOrder | 1条OnRtnOrder 1条OnRtnFill |
再看看各家在收到回报时如何查找报单,换言之如何确定唯一报单号。
| 确定唯一报单 |
CTP | FrontID+SessionID+OrderRef(字符串) 或ExchangeID+OrderSysID(字符串) |
飞马 | UserID+UserOrderLocalID(字符串) 或ExchangeID+OrderSysID(字符串) |
飞创 | sessionID+localOrderID(整型) 或spdOrderID(整型) |
易盛 | SessionID(整型) 或ServerFlag+OrderNo(字符串) |
CTP和飞马属于同一类,使用了效率比较低的字符串,处理字符串耗时可以是处理整型耗时的数倍。而且字符串要求递增,相信不少CTP和飞马的程序猿掉进过这个坑,strcmp(“10”,“9”) 结果是小于0的,然后你就得到一个“重复的报单”的错误,但是找了半天也没发现到底是哪个号重复了。
另外,CTP的OnRtnTrade回报里只有OrderRef,没有FrontID和SessionID,因此只能依靠ExchangeID和OrderSysID来确定唯一报单,此时OrderRef纯属多余。
飞马也有自己独特的问题,理论上飞马确定唯一报单的方法应该是UserID+UserOrderLocalID,但是实际上所有回报里的UserID都是登录的UserID,目前只能将这两个合并成一个UserOrderLocalID或者使用用户自定义字段,据说飞马后续版本会修复这一问题。
飞创全部使用整型,同时每个回报都有sessionID,localOrderID和spdOrderID,完全保持一致,因此效率最高。
易盛混用了整型和字符串,每个回报都有ServerFlag+OrderNo保持一致性,效率居中。
最后我们来看看四家里最高效的飞创和国外交易所相比还有哪些差距。下面以NASDAQ的SQF接口为例。
http://www./content/technicalsupport/specifications/TradingProducts/sqfnom2.0.pdf
我们发现SQF的接口要简洁得多。另外SQF支持批量报价,而国内交易所不支持,因此关于这一点我们不比较。我们只看针对单笔报价大家通用的一些内容。
首先,SQF报和撤都是1笔请求对应1笔回应,成交只有1笔回报。考虑到SQF是直连交易所,而国内必须经过柜台系统,因此我们觉得可以接受每个请求都有一个达到柜台时的“已接受待报交易所”的状态,即报和撤都是1笔请求对应2笔回报,成交仍只有1笔回报。遗憾的是四家系统里没有一家做到这一点,虽然飞创和易盛已经相当接近。
其次,SQF提供一个8字节的字段MessageID供用户确定唯一报单,并且在所有回报中统一使用此字段。SQF并未规定这一字段必须是整型或字符型,虽然实际上大部分用户会使用64位整型。64位整型可以存储很大的数字,用户可以根据实际需要使用比较复杂的自定义内部编码(并不一定需要保证是严格递增的)。四家中唯一类似的是飞创,但是它的报单编号也并没有做到完全由用户自定义,仍然需要在登录时获取一个初始编号。
第三,SQF的回应相当简单,只通知某个MessageID的请求是否成功了,并不把请求的具体内容(例如买卖的价格和数量)再推送一边,而国内四家系统无一例外全部再推送一遍。
最后,SQF在表示时间戳和期权合约时都使用了整型,而国内四家系统都没能做到这点,易盛更是按照期权的标的、到期日和行权价拆开了合约名称,因此在必须使用全名称时用户还要自行拼接,增加了额外的处理时间。
总结一下,从期权做市商的角度来看,四家系统按效率从高至低排列分别是飞创、易盛、飞马、CTP。即使是相对最高效的飞创,和国外交易所的简洁接口相比,仍然有一定差距。