【从零开始vnpy量化投资】二. CTA策略模板与运行机制

【从零开始vnpy量化投资】二. CTA策略模板与运行机制

概述

本篇主要目标为理解vnpy的组件构成和cta策略模板的运行机制,便于在编写策略时能够避免因理解偏差造成的交易异常。

vnpy组件构成

vnpy主要使用python语言编写,我们首先打开客户端的安装目录,以笔者为例,我将vnpy安装在了D:\soft\vnpy_client 目录下(后续所有D:\soft\vnpy_client路径都代表客户端安装目录,请自行替换为本地安装目录)。vnpy会默认附带安装一个python3的环境,并将vnpy的代码安装到D:\soft\vnpy_client\Lib\site-packages目录下。
在这里插入图片描述
在这里插入图片描述

各常用组件的用途

vnpy包:

vnpy核心代码,主要包含各组件的定义,位置为D:\soft\vnpy_client\Lib\site-packages\vnpy

  • trader.constant.py: 各种数据属性的枚举,如交易所枚举SHFE和多空枚举LONG/SHORT等
  • trader.database.py: 数据存储类的抽象接口
  • trader.datafeed.py: 第三方数据源的接口(我们在上一篇文章中使用的rqdata即为此接口的一种实现)
  • trader.engine.py: vnpy主引擎入口,使用编码模式启动vnpy时需要通过mainEngine类进行操作
  • trader.optimize.py: 参数优化工具
    在这里插入图片描述

vnpy_ctastrategy包:

CTA策略包,位置为D:\soft\vnpy_client\Lib\site-packages\vnpy_ctastrategy

  • engine.py: CTA策略引擎,传入MainEngine后可支持cta策略的运行
  • backtesting.py: CTA回测引擎,使用此类可进行策略回测
  • template.py: CTA策略模板,单合约交易策略的父类

vnpy_mysql包

database类的某种实现,用于处理k线和tick数据的储存,使用开源关系型数据库mysql实现,后续我们会使用这个包的功能对vnpy数据储存进行改造和扩展。位置为D:\soft\vnpy_client\Lib\site-packages\vnpy_mysql。

vnpy_portfoliostrategy包

组合投资策略实现,组合策略的有点为可以同时订阅多个期货合约,从而实现更加复杂的期货管理策略,相应的,组合策略的开发难度也较CTA策略更高,需要投入更多精力。位置为D:\soft\vnpy_client\Lib\site-packages\vnpy_portfoliostrategy

全局配置与策略配置

vnpy虽附带安装了一个sqlite数据库用于k线数据储存,但软件本身的配置和策略的参数配置是使用文件系统储存的,默认位置为C:\Users\xxx\.vntrader,如在启动时指定其他目录为运行目录,则配置在对应目录的.vntrader目录下。
在这里插入图片描述

  • vt_setting.json文件: 全局配置文件,其中主要用到的内容为datafeed和database的配置,可使用记事本等软件直接编辑,或通过vnpy客户端的菜单栏“配置”进行修改。

  • database.db: k线数据默认储存位置,vnpy默认database实现为sqlite,后期我们会将实现替换为mysql,此文件尽量不要手动修改。

  • cta_strategy_setting.json: cta策略配置文件,具体格式如下。可手动编辑或直接通过vnpy客户端生成,初期建议使用客户端生成,避免手动编辑的json格式错误导致策略无法初始化。
    在这里插入图片描述

  • cta_strategy_data.json: cta策略的数据文件,储存策略运行时需要记录的变量

  • portfolio_strategy_setting.json: 组合策略配置文件,除合约信息为多个外,格式基本同cta策略配置

  • portfolio_strategy_data.json: 组合策略数据文件

以上介绍了我们后期会频繁使用的一些组件,其他包大都为某个组件的具体实现,有兴趣的同学可以自行阅读源码并深入了解组件用途。

使用客户端初始化策略配置

点击“功能”>“CTA策略”,选择好需要初始化的策略点击“添加策略”,弹出策略配置窗口后,根据需要配置策略名称、策略标的合约和自定义参数。最后点击“添加”,即可看到策略已创建成功。
在这里插入图片描述
在这里插入图片描述

同时,C:\Users\xxx.vntrader目录下的cta_strategy_setting.json文件中会出现此策略的配置。
在这里插入图片描述

源码解读:

下面我们将开始讲解vnpy的运行机制,了解策略运行的整个生命周期,便于后期针对不同目标修改对应的环节。
官方源码地址:https://gitee.com/vnpy
CTA策略模板:https://gitee.com/vnpy/vnpy_ctastrategy/blob/main/vnpy_ctastrategy/template.py
cta模板类为策略模板父类,自定义策略通过继承此类并重写部分方法来实现策略业务。
这里我们需要注意一下代码的16、17行和24行。
在这里插入图片描述

parameters

parameters为策略的自定义参数,如双均线策略中的自定义参数为快速均线周期fast_window和慢速均线周期slow_window。
在这里插入图片描述

当settings中配置了这两个值时,通过45行update_setting方法,可在策略初始化时将对应配置注入策略对象的对应变量中。
在这里插入图片描述

variables

定义了策略需要记录的运行时变量,如双均线策略的fast_ma0为快速均线的最后一个值。当调用CTAEngine的update_strategy_setting方法时,会将策略对象的对应变量存入data.json策略数据文件。
以已经创建好的策略为例,第一行为配置的参数parameters,第二行为运行时需要展示和记录的变量variables加几个内置变量inited、trading、pos。
在这里插入图片描述

几个需要重写的主要方法及用途:

@virtual
def on_init(self) -> None:
"""
Callback when strategy is inited.
在mainEngine调用init_all_strategies时会触发
"""
pass
@virtual
def on_start(self) -> None:
"""
Callback when strategy is started.
在mainEngine调用start_all_strategies时会触发
"""
pass
@virtual
def on_stop(self) -> None:
"""
Callback when strategy is stopped.
在mainEngine调用close时会触发
"""
pass
@virtual
def on_tick(self, tick: TickData) -> None:
"""
Callback of new tick data update.
接收到tick数据时触发,在使用分钟级k线处理业务的情况下,一般使用默认实现,将每分钟的tick数据合并为k线数据后使用on_bar方法处理策略逻辑
"""
pass
@virtual
def on_bar(self, bar: BarData) -> None:
"""
Callback of new bar data update.
业务逻辑主入口,无论是回调还是实盘,都可以使用此方法实现策略逻辑
"""
pass
@virtual
def on_trade(self, trade: TradeData) -> None:
"""
Callback of new trade data update.
交易成功时触发,可用于记录交易数据,并计算资金盈亏
"""
pass
@virtual
def on_order(self, order: OrderData) -> None:
"""
Callback of new order data update.
发送交易请求后收到订单状态变化时触发,一般仅用于日志输出,方便定位和排查问题即可
"""
pass

CTA策略模板基础内容大概已介绍完毕,如有兴趣可继续阅读官方提供的策略示例进行对比学习。https://gitee.com/vnpy/vnpy_ctastrategy/tree/main/vnpy_ctastrategy/strategies

官方无UI启动示例:

https://gitee.com/vnpy/vnpy/blob/master/examples/no_ui/run.py
在这里插入图片描述

以上即为官方提供的纯编码方式启动CTA策略的示例代码的主体内容,主要是演示如何配置MainEngine,并完成策略的初始化和启动。

CTA策略运行机制

在这里插入图片描述

以上就是策略运行的整个生命周期各组件的执行步骤,粉色部分与策略相关,尤其是涉及各个回调方法的地方,后期是策略开发需要重点关注的部分。
同时我们也需要关注黄色配置文件和数据文件加载或储存的场景,确保系统出现异常时能保证两个配置文件的内容为正确结果,否则容易出现策略使用错误的历史数据运行,在错误的时机进行交易。

猜你喜欢

转载自blog.csdn.net/u011687355/article/details/130022464