四、如何在真格平台上做到这一切
现在我们想在真格量化上实现自己的策略,需要怎么做呢?
首先,真格量化使用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”则可以通过SubscribeQuote获得历史的tick行情。”时间周期“选择”分钟“则可通过SubscribeBar函数获得1~240分钟这些不同分钟周期的历史K线行情。”时间周期“选择”每天“则可以通过SubscribeBar函数订阅”天“、”星期“、”月“、”季度“、”年“这些更长周期的历史K线行情。
在实盘交易中,如果”时间周期“选择”Tick“则可以通过SubscribeQuote获得最新的tick行情。”时间周期“选择”分钟“则可通过SubscribeBar函数获得1~240分钟这些不同分钟周期的最新的K线行情。”时间周期“选择”每天“则可以通过SubscribeBar函数订阅”天“、”星期“、”月“、”季度“、”年“这些更长周期的最新K线行情。
使用SubscribeBar函数应注意,其BarType参数应当与“时间周期”参数对应:
例如”时间周期“选择”每天“,SubscribeBar函数的BarType参数可以根据需要写成BarType.Week,BarType.Month, BarType.Day等。”时间周期“选择”分钟“,SubscribeBar函数的BarType参数可以根据需要写成BarType.Min3,BarType.Min15,BarType.Min等。
而对于过去一段时间的历史行情,比如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编程和策略设计的技巧,能给您编写自己的量化交易策略提供灵感。
原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/195005.html