四、如何在真格平台上做到这一切
现在我们想在真格量化上实现自己的策略,需要怎么做呢?
首先,真格量化使用Python语言编写策略。我们需要对Python语言有一些初步的了解。与C++或Java语言相比,Python是一种非常方便易用的脚本式编程语言,很适合非计算机专业的用户来上手量化交易。
举个简单的例子,如果直接用C++调用CTP的API进行下单委托,您可能需要写这些代码:
在真格量化,您只需要一行Python代码:
省下的时间,您可以用来研究策略,或者做些更有意义的事情。
4.1平台IDE不止是开发环境也是运行环境
真格量化由一个简洁的网页版Python编辑器、提供海量数据的数据库和用于运行策略的性能强大的服务器构成。用户在编辑器里写好策略代码后,可以直接去回测、交易模拟盘或交易实盘。用户无需在本地数据库、本地编译环境、云服务器上的各种软件之间频繁切换,无需自己花费时间精力去记录市场数据,也不用为优化网络、内存等硬件性能而头疼。
回测与模拟、实盘三合一的设计使得代码复用性得到了显著提高。策略研究代码只需极少量的改动就可投入实盘交易。
4.2 真格量化中的Python策略编写思路
4.2.1 事件驱动的设计思路
真格量化的策略设计应遵循“事件驱动”的开发思路。当新的“事件”(比如新的价格数据或者账户状态的变化)被推送到策略程序时,程序将调用和这个事件相对应的处理函数来进行相关操作。
这和我们最常使用的顺序式编程略有不同。程序执行各个任务的先后顺序取决于是否监听到了特定事件的发生。事件驱动型程序在启动后就处在一个循环当中。这个循环就在监听各种事件。真格量化中可监听的事件及其对应的监听函数如下表:
这些事件可以分为以下几类:
举个例子:
为实现每天开盘前实盘账户的自动登录,我们可以用OnMarketQuotationInitialEx函数去监听交易所行情初始化这个事件,当事件源(也就是交易所)发送事件时(发出行情初始化信息),监听该事件的监听函数(OnMarketQuotationInitialEx)就会收到消息并作出响应(比如登录实盘账户)。
我们也应当注意,行情数据是需要订阅的(通过SubscribeQuote或SubscribeBar函数)。只有被订阅的品种的行情才会被持续推送到相应监听函数(比如OnQuote或OnBar函数)。不订阅行情就不会有行情数据来驱动相应的监听函数。
下边这个例子展示了用不同的事件去驱动不同的操作。比如用“开始事件”驱动“登录账户”函数,用“开盘事件”来驱动“订阅行情(K线)”函数,用“K线更新事件”来驱动“计算均线”函数。
使用事件驱动的设计思想,我们可以通过监听到的各种“消息”和响应函数的各种“指令”将程序的各部件连接起来。
对于事件驱动型程序,我们还可以将其中各个组成部分划分为“元素”和“操作函数”:
元素包括:
事件源
事件监听器
事件对象
操作函数包括:
监听动作函数
发送事件函数
调用监听函数的响应函数
我们在编写策略时应注意区分元素和操作函数,了解一个操作需要哪些事件的发生作为启动条件,及监听到一个事件发生后可以采取哪些动作。
4.2.2 数据订阅
不同周期的行情订阅:
在事件驱动部分,我们已经介绍了策略程序要依靠订阅行情来驱动。在进行回测时,我们可以通过选择不同的“回测频率”参数,来指定策略在相应的“频率”上进行操作(例如策略是在分钟级别交易还是在Tick级别进行回测)。
在回测中,如果“回测频率”选择“Tick”则可在tick级别进行回测(可以用OnQuote来监听tick数据)。“回测频率”选择“分钟”或“每天”则可在分钟或日线级别进行回测。
回测时使用SubscribeBar函数应注意,其BarType参数应当与“回测频率”参数对应(订阅BarType周期不应当小于界面上选择的“回测频率”,比如代码中BarType选择了“Min”,界面“回测频率”不应选择“每天”,而可以选择“分钟”或“Tick”):
用户应注意真格量化支持对多个时间级别BarType的订阅,例如同时订阅BarType.Day,BarType.Min和BarType.Min15。
在实盘交易中,订阅行情的周期与界面上的“回测频率”选择并无关联,只取决于代码中SubscribeQuote(订阅tick行情,可以用OnQuote来驱动tick级别交易)或SubscribeBar所指定的BarType。
用户应注意在实盘中,如果选择订阅tick级别以上的时间周期,比如分钟、日周期,系统将在该周期的结束时的tick去触发OnBar事件,比如交易标的为期货时,对于BarType为Day则在当天的15:00:00的tick触发OnBar。如果BarType选择为Min则在前一个交易日的21:00:00的tick触发OnBar。
对于过去一段时间的历史行情,比如2018年12月1日到2019年3月1日之间的所有日K线,用户还可以通过GetHisData函数来查询。
4.2.3 交易相关处理
我们在交易中最常处理的就是与账户有关的各种信息。
真格量化中与账户相关的信息,都可以视为“对象”。比如账户本身可以作为一个对象,可以调用其各种“方法”,比如登录、查询成交、进行风控等。
例如,账户的登录方法:
而查询到的账户的成交、持仓等信息,本身也可以作为对象,有与之对应的”属性“和”方法“。比如对于一个”委托对象“可以查询其委托价格、数量等属性,以及查询委托是否可撤等方法。
例如,通过监听委托状态变化(OnOrderChange)来查询委托的一些属性:
4.3 Python应当怎么写
对于Python初学者,可以参考“菜鸟教程”,学习基础的语法。当您掌握了Python的循环控制、数组和函数的知识,就已经可以使用真格量化的大部分功能。
对于 Python 编程有一定经验的用户,可以仔细阅读“真格量化API文档”(这里API文档的重要程度,相当于飞行手册对于飞行员的重要程度,您在真格量化中80%的问题都可以在API文档里找到答案)以及参考“Python for Finance-Analyze Big Financial Data”等专门介绍Python在金融领域应用的教程。在真格量化微信公众号(在微信搜索“真格量化”)和知乎(在知乎搜索“真格量化”)上也有不少与真格量化相关的Python编程和策略设计的技巧,能给您编写自己的量化交易策略提供灵感。
— — — — — — E N D — — — — — —
往期文章:
真格量化可访问:
https://51zhenge.com
真格量化微信公众号,长按关注:
遇到了技术问题?欢迎加入真格量化Python技术交流QQ群 726895887
网友评论