发布于vn.py社区公众号【vnpy-community】
原文作者:用Python的交易员 | 发布时间:2020-07-20
上一篇文末的抽奖福利中
获奖的朋友是:
Shirley S
请在48小时内通过公众号留言联系领取奖品~
讲到中国金融市场的量化交易发展历史,绕不开的一个主题就是CTA策略。CTA这个词本身是Commodity Trading Advisor的缩写,在定义上是欧美一种交易期货衍生品为主的投资顾问,或者也可以理解为一种对冲基金的类型。
但在国内的CTA这个词,更多指的是一种以趋势跟踪(Trend Following)为主的量化交易策略,交易品种也同样是期货。因为其门槛较低(相对于多因子、期权波动率等策略),CTA策略大概2010年前后就开始在国内市场上流行起来。
虽然没有做过特别正式的统计,但CtaStrategy无疑一直是vn.py平台内用户量最大的量化应用模块。所以在这第二篇文章中,就来讲讲和CtaStrategy相关的两个项目:CTP API和MultiCharts。
CTP API
类型:交易接口
国家:中国
语言:C++
启发:数据定义
CTP是上期技术公司推出的一套期货交易柜台系统,目前大概70-80%的期货公司都已经上线,其整体架构如下图所示:
用今天2020年的眼光来看,CTP柜台在交易方面的技术优势可能已经不那么明显,但是它的交易接口CTP API却走得远得多,甚至在一定程度上成为了国内金融市场的量化交易接口设计标准,类似FIX协议在欧美的地位。
究其原因,个人观点可以总结为代码精简和功能完善两个方面。
首先,不管行情还是交易,接口中都只包含两个大类:
API类
- 提供主动函数,用于发送请求到服务器
SPI类
- 提供回调函数,用于接收服务器的回报
没有麻烦的数据打包器、解包器,也没有消息客户端、主推订阅者,更没有一大堆的配置选项(授权文件、加密签名、缓冲区大小......),只有简简单单的两个类,不管哪家期货公司几乎都是完全一致的配置,做到了真正的标准化接入。
其次,在业务数据的定义上,不像恒生T2SDK等消息收发类接口需要查看Excel文档,才能知道代码要怎么写(还特别容易掉坑),CTP API则是采用了Struct结构体的定义形式,开发者只需看着.h头文件中的内容就能快速完成代码开发。其中最核心的业务数据结构,甚至两只手都能数的过来:
主动请求
- 登录请求
- 下单请求
- 撤单请求
被动回报
- 合约信息
- 行情信息
- 委托信息
- 成交信息
- 持仓信息
- 资金信息
vn.py的底层接口设计,整体上借鉴了CTP API的风格。通过vnpy.trader.object定义了所有的标准数据结构,如ContractData、TickData、OrderRequest等,通过vnpy.trader.gateway定义了标准对接基类BaseGateway,从而实现将所有不同类型的接口(C++、Python、REST、FIX等)统一对接到vn.py系统上层的量化策略应用。
MultiCharts
类型:商业软件
国家:美国
语言:C#
启发:CTA策略
MultiCharts(缩写MC)是一款主要针对CTA类策略的量化交易平台,其创始人Dennis Globa曾经也是TradeStation(缩写TS,另一款起源于1991年的量化交易平台)的忠实用户。但因为觉得TS的功能有所不足(数据源限制、没有组合回测等),所以在2005年决定自立门户推出了MC,并且在策略开发语言上选择和TS保持兼容,使用经典的EasyLanguage语言。
EasyLanguage语言的特点,用一句话概括叫做:用普通英语来写量化策略。什么意思呢,看一行代码:
buy 2 contracts this bar close;
几乎不需要去学什么编程语法,你也能看明白这是要在当前K线收盘点买入2手合约。
简单易用的EasyLanguage让用户能够很快把策略代码给实现出来,同时MC也提供了许多强大的历史回测和参数优化功能:
逐日盯市的回测曲线
200个多个回测统计指标
参数优化结果的3D绘制
准确的历史数据回测,是CTA策略开发过程中最为重要的环节。所以vn.py的CtaStrategy模块在历史数据回测上,采用了和MC一致的计算逻辑,列举一些关键点:
委托类型
- 限价单(常规交易)
- 停止单(突破交易)
成交规则
- T时刻下单,只能在T+1时刻后成交
- 支持K线内部撮合成交,而非只能以收盘价成交
- 策略只能下单和撤单,无法控制委托成交与否
- 委托成交价格,由回测引擎基于撮合规则计算
同时也结合Python语言的优势做了额外改进:
- 调用下单函数后,会立即返回本地委托号,用于实现细粒度委托挂撤单管理(回测+实盘)
- 提供on_tick/on_order/on_trade等回调函数,允许用户获取交易底层数据,而不仅仅是K线和持仓
- CTA策略以Python类的形式存在,采用面向对象的编程模式,可以实现复杂嵌套的策略逻辑(例如海龟的开仓过滤)
同样,有什么想问的问题或者分享的内容,欢迎在文章下方留言。本期我们将会随机抽取一位留言者赠送《vn.py全实战进阶 - 期权零基础入门》课程的5折优惠券一张。