一种组合型架构的期货程序化交易系统
2017-06-03杜小甫
杜小甫
摘 要为了运行期货交易策略,同时又能实现自主的交易行为,本文讨论了一种组合型架构的期货程序化交易系统。该系统实现了策略端和交易端的独立,策略端负责接收行情数据并产生交易信号,交易端完成交易行为并进行风险控制。策略端采用“交易师”作为第三方通用平台,交易端采用C++编程,并使用QDP作为底层API接口。目前该系统已经开发完成,实际效果良好。
【关键词】期货 程序化交易 交易策略 交易安全
1 基本结构
2010年沪深股指数期货合约在中金所的上市,标志着我国的程序化交易的开端。近年来,程序化交易在我国日趋成熟,尤其是在期货市场。当前存在的各种程序化交易系统,整体可分为通用型和专用型两大类,本文讨论了另外一种全新的组合型系统架构。
通用型交易系统是指由专业软件公司开发的程序化交易系统,一般提供专用的策略编写语言,让用户编写交易策略,交由系统来完成交易行为。目前在国内市场比较流行的有文华财经的赢智、开拓者的Tradeblazer、新博庭的King Trader交易师等。专用型系统指的是根据用户的特殊策略需求,利用编程语言独立开发的系统。两类系统各有优缺点,和适用范围。
本文讨论了一种组合型期货程序化交易系统,该平台结合了上述两类系统的优点,应用范围更加广泛。系统整体分为三大模块:策略端、交易端和通信模块。策略端基于第三方通用系统开发,负责从第三方通用平台获取行情数據,并执行策略,产生交易信号。交易端接收到交易信号后完成交易行为,并进行交易中的风险控制。数据端和交易端之间有独立的通信模块,负责完成两者之间的数据通信。系统整体架构如图1所示。
之所以采用这种组合架构,是经过精心设计的。一方面,策略端可以借助于第三方通用平台完成很多工作,降低了整体的开发工作量。另一方面,通过独立开发的交易端,使我们的交易行为完全独立,更加提高了交易的安全性。而且这种组合式的架构具有很强的扩展性,在策略端可以选择不同的第三方平台,交易端又可以选择不同的底层API接口。
系统中采用King Trader作为第三方数据源,首先因为该软件提供强大的策略脚本语言“金语言”,以及对应的开发环境“金魔方”。我们可以利用金语言完成策略的编写和测试工作,并利用金魔方完成历史数据的回测。最终编写真实策略,利用其 “金魔方”平台进行策略的运行和交易。当然,金语言进行策略编写的能力有限,另外考虑到安全性,我们并不在金魔方上直接进行交易,而是将产生的交易信号提交给独立的交易端。
使用King Trader的另外一个原因是他对dll控件的支持性较好,这就给我们提供了利用dll开发通信模块的可能性。King Trader提供MYMACLOSE和my_ma2两个dll回调函数接口。我们可以在dll中完成数据通信功能的编写。
在交易端,我们采用了量投科技有限公司提供的QDP作为底层的API接口。首先,QDP提供完备的行情数据接口和交易接口,并默认支持C++语音。这给交易系统的开发带来极大的便利。其次,QDP具有很多其他优点,例如低延迟、交易所内部直连、开放接口等等。使用QDP不但能满足当前系统的需求,也为今后开发完全独立的交易平台打下基础。
2 策略端模块
金语言在金魔方系统中编写、编译,开发出的可执行的小程序称为“指标”。指标能显示在金魔方图表上或用于选股、预警。智能策略指标编写之后,可以在金魔方中测评。最后,智能策略可以通过金魔方实盘运行,并做出交易动作。
金魔方系统是广州博庭计算机科技有限公司开发的一款量化投资平台软件。具有以下主要功能模块:
(1)行情数据接收和展示、技术分析。
(2)策略编写。
(3)策略测评。
(4)模拟交易与自动交易。
我们系统中策略的编写直接采用金语言,并在期货品种的K线图上运行。策略端主要功能包括策略编写、策略评测和策略执行。首先利用金语言将我们的策略编写成指标的形式。然后在历史数据中运行我们的策略,对他进行检验,观察平均盈利率,最大回测率等数据。在评测过程中可以不断的调整参数,达到优化的目的。但是要注意,参数不可能最优化,因为那是不可能的,尤其要注意未来函数的问题。最后选择合适的期货合约,在其K线图上运行评测好的策略,实时考虑当前的行情数据,产生各种交易信号。具体包括开仓信号、平仓信号、止损信号等等。然后将交易信号进行数据打包,通过通信模块传递给交易端程序。
3 交易端模块
本系统中交易端模块由我们独立开发,采用C++语言,并选择QDP作为底层API接口。
QDP是量投科技公司开发的一套底层柜台商交易接口,它同时提供行情数据接口和交易接口。QDP的功能很强大,可以直接完成期货交易中的各种操作,在最新版本中也支持股票的交易。
QDP为行情数据接口和交易接口各自提供了两个封装好的类,分别命名为API类和SPI类。其中API类封装了一系列函数,允许用户在代码中调用,以完成不同的操作。例如调用ReqOrderInsert 方法可以完成报单的录入操作,调用ReqOrderAction方法可以完成撤单操作等。而在SPI类中则封装了一系列回调函数,这些函数不允许用户代码调用,而是被QDP的服务器自动调用,以完成对用户不同操作请求的响应。例如, OnRspOrderInsert 方法被QDP服务器回调,用来响应用户的ReqOrderInsert报单操作,OnRspOrderAction方法被QDP服务器回调,用来响应用户的ReqOrderAction撤单操作等。QDP允许用户继承SPI类,在子类中重写上述回调函数。以便加入用户的代码,从而完成用户特定的需求。
QDP系统的交易操作具有很大优点,最大的好处的延时非常短。QDP的服务器机房直接安置在交易所很近的地方,直线距离不超过500米,并通过光纤直接连接交易所前置机。这样的安排,让QDP的交易操作比其他柜台商快一个数量级,一次报单操作耗时在300微秒左右,网络往返时间在600微秒左右。
在一次交易行为中,存在客户端、QDP服务器和交易所前置机三个参与者。客户端就是交易人员的个人电脑,其上可以安装各种交易软件。客户端通过互联网连接QDP服务器,QDP服务器内封装了不同的交易席位,每个客户端总是固定分配到某个席位的。用户提交的各种交易请求,都交给QDP服务器来处理。QDP服务器的物理位置和交易所的机房非常接近,一般不超过500米,通过局域网光纤直连交易所前置机。交易所总的服务器对我们一般用户而言,是不可见的,我们能连接到的只是交易所提供的前置机。
我们开发的交易端程序可以部署在某台客户端上,当然这样互联网通信的网络延时较大,速度也不稳定。我们一般会在QDP服务器上申请独立席位,该席位为我们单独使用,不再与其他客户端共享。使用独立席位的另一个好处是速度更快。我们的交易端程序直接部署在席位上,和QDP服务器基本没有任何网络延时,和交易所前置的网络延时也就在300微秒左右。另外,我们还可以通过其他方法进一步提高速度,比如可以绑定某台固定的交易所前置机,而不是由QDP服务器随机分配。
下面分别讨论一下交易端模块的几个重要子模块。
交易管理子模块是交易端的核心模块,其主要功能是根据从策略端传过来的交易信号进行交易行为,具体包括:报单录入、报单撤销、报单查询等操作。该模块是整个系统中真正进行交易行为的模块,要求具有很高的抗风险性能。另外很多策略的性能好坏与交易动作的执行效率密切相关,尤其是高频策略,所以本模块的具体执行算法很大程序决定了策略的盈利性能。该模块也要完成与交易相关的一些其他操作,例如仓位管理、资金管理等。
风险管理是任何程序化交易系统必不可少的重要功能,可以说,所有的交易系统风险控制是底线。任何一种策略,无论盈利能力多高,回撤率高的话,也很有可能造成一次亏损就会让一年的盈利化为泡影,所以风险管控非常重要。风险管控整体可以分为两大类,第一类是交易所层面的限制,例如每秒最多允许的报单数,每个品种最多允许的撤单数等等。一旦违背这些规则,轻则禁止交易,重则停业整顿,所以万不可大意。第二类重要的风险则来之于不同的策略本身。例如对于日内策略,一般在停盘前一段时间(例如5分钟)禁止进行开仓操作,或进行强制的平仓、锁仓操作等等。以上风险控制功能都在交易端代码中完成。
日志管理也是必不可少的一环。交易行为具有连续性,非常有必要在交易结束后进行检讨,日志因此非常重要。我们交易过程中所有重要的信息都可以记录到日志中,当然可以考虑适当的划分文件。例如行情数据可以放在行情日志中,交易行为可以放在交易日志中等等。另外在某些情况下,要对日志进行特殊的处理,例如高频交易。有些高频交易对交易的时效性要求非常高,甚至达到微秒级别。而日志记录不可避免的涉及到磁盘文件的读写,这些操作比较费时。因此在高频交易中,我们可以采用异步日志的方式。在交易过程中,进行内存读写,将日志内容写入单独的内存区域;交易结束或者暂停期间,再将内存中日志写入磁盘。这样可以一定程序降低日志操作的時间消耗。
4 通信模块
本系统的通信模块采用C++语言编写,基于Socket套接字技术实现。之所以采用这种技术,是考虑到交易端有时会部署在本地计算机上,有时又会部署在远程席位上。而策略端基本上总是部署在本地计算机上的,因此策略端和交易端有时需要通过网络进行连接通信。Socket套接字本身是一种网络通信技术,可以很方便的实现远程通信。另外当交易端部署在本地时,可以将socket地址设置为127.0.0.1,而不需要对程序做大的修改。
5 总结
本文讨论了一种组合型架构的期货程序化交易系统,该系统中策略执行和交易行为彼此独立。该平台最大的优点是具有很强的灵活性。策略端可以选择不同的第三方软件,甚至可以同时选择不同软件作为备份。交易端利用C++开发,可以完成任意用户独特的策略需求。第二个重要优势则是具有很强的安全性,这对于资金量大的交易行为而言非常重要。所有交易行为在独立的交易端中进行,不会与行情软件发生关系,不会被第三方获取。行情数据可以同时连接多个接口,如果数据出错,会有天然的备份。这些都带来了极大的安全性。
当然,本系统也有一定的局限性,这些都有待后续工作中改善。例如数据获取也可以用QDP编程实现,这样可以进一步提高系统的安全性。
参考文献
[1]熊熊,袁海亮,张维,张永杰.程序化交易及其风险分析[J].电子科技大学学报(社科版)Jun.2011,Vol.13,No.3 32-39
[2]广州博庭计算机科技有限公司,花生网:http://www.hs633.com/pro/gl.php
[3]量投科技,QDP量投快速柜台:https://www.quantdo.com.cn/pages/qdpDetail.html
作者单位
厦门大学嘉庚学院信息科学与技术学院 福建省漳州市 363105