【从零开始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策略运行机制

在这里插入图片描述

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

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
CTA(Commodity Trading Advisor)策略是一种基于技术分析和基本面分析的交易策略,主要应用于商品市场,包括期货、外汇、股票等。CTA策略通常包括以下几个方面: 1. 趋势跟踪:利用技术分析方法,识别市场的趋势方向和力度,并根据趋势的强度和持续时间来决定交易方向和持仓时间。 2. 均值回归:利用基本面分析和技术分析方法,识别市场价格偏离其均值的情况,并根据价格回归到均值的概率来决定交易方向和持仓时间。 3. 波动率策略:利用技术分析方法和一些波动率指标,如ATR(平均真实波动率)和Bollinger Bands(布林带),来识别市场的波动率水平,并根据波动率的水平来决定交易方向和持仓时间。 以下是一个简单的CTA策略代码示例: ``` import numpy as np import pandas as pd def trend_following_strategy(data, n): # 计算收盘价的n日移动平均线 data['MA'] = data['Close'].rolling(window=n).mean() # 计算收盘价的n日标准差 data['STD'] = data['Close'].rolling(window=n).std() # 计算上轨线和下轨线 data['Upper'] = data['MA'] + 2 * data['STD'] data['Lower'] = data['MA'] - 2 * data['STD'] # 判断上涨趋势和下跌趋势 data['Trend'] = np.where(data['Close'] > data['MA'], 1, -1) # 判断做多和做空信号 data['Signal'] = np.where(data['Close'] > data['Upper'], -1, np.where(data['Close'] < data['Lower'], 1, data['Trend'])) # 计算持仓仓位 data['Position'] = data['Signal'].shift(1) # 计算收益率 data['Return'] = data['Position'] * data['Close'].pct_change() # 计算累计收益率 data['Cumulative_Return'] = (1 + data['Return']).cumprod() return data ``` 以上代码实现了一个简单的趋势跟踪策略,通过计算收盘价的n日移动平均线和n日标准差,来确定上轨线和下轨线,判断市场的上涨趋势和下跌趋势,以及做多和做空信号。最后计算收益率和累计收益率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔落凡尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值