今天主要是理论部分,主要是学习文档为主,估计要看几天
后面还期权波动,价差,风控之类的,估计得到周末用windows电脑再搞一波实盘了。
教程基本分为两部分:
一部分是vnpy介绍:
功能介绍
安装指南
基本使用
交易接口
数据库配置
第二部分是vnpy模块代码使用: 对应了代码中vnpy/app 中的各种模块
[CTA策略模块](https://www.vnpy.com/docs/cn/cta_strategy.html)
。。。。可以直接看教程排列的模块
今天直接学第二部分第一个模块
主要参考CTA策略
代码参考位置
vnpy/app/cta_strategy
包含
base
template 策略模版,基本策略都是继承自这个类
strategies 包含了vnpy提供的一些策略
backesting 做回测用的
converter 针对上期所的转换
engine 定义实盘引擎
策略开发
基于template进行开发,可以定义在自己项目里,也可以定义在vnpy库里,策略文件用_下划线命名方式,策略类用驼峰式命名,规范命名可以让代码看起来更清晰。
跳过数据部分后面再说
参数设置
文档里举例基于已有的BollChannelStrategy策略改造
boll_window = 18
boll_dev = 3.4
这些定义都是策略参数,可以根据品种的特征进行调整
类的初始化
继承了模版,调用super函数进行参数设置
BarGenerator k线生成模块,把tick数据合成1分钟或更大周期的k线,并且传入策略执行函数
ArrayManager k线时间管理模块,根据k线生成技术指标
策略的初始化、启动、停止
总共有3个固定函数 on_init on_start on_stop
表示策略初始化,开始和停止
on_init调用函数load_bar(10),代表策略初始化需要载入10个交易日的历史数据
Tick数据获取,文档里叫数据回报不太好理解,就叫做数据获取吧
on_tick函数
每拿到tick数据会调用on_tick,如果策略是基于1分钟或更长周期,需要调用self.bg.update_tick(tick)聚合成k线数据,推到on_bar函数
K线数据获取(回报)
on_bar(self, bar: BarData) 收到1分钟k线,调用self.bg.update_bar(bar)可以聚合成15分钟k线推送到on_15min_bar函数
15分钟k线数据获取(回报)
这函数是自己定义的,在BarGenerator中初始化,然后策略也在这里写
分为三部分
1、self.cancel_all() 取消上一个15分钟没有成交的单子
2、调用时间序列管理模块,生成指标
3、根据指标进行下单(buy/sell),同时设置离场点(short/cover)
最后调用put_event()传递出CTA买卖信号
委托、成交、停止单 回报
可以直接pass,具体逻辑交给回测/实盘负责
以上是策略开发部分,下面就是如何回测,看看策略是否好用
在backtesting.py中定义了回测引擎
加载策略 add_strategy
加载历史数据 load_data
1、根据数据不同可以分为k线和Tick模式
2、select().where()方法有条件的选出数据,可以根据:vt_symbol、 回测开始日期、回测结束日期、K线周期
3、order_by(DbBarData.datetime)表示需要按照时间顺序载入数据
4、数据以迭代的方式最终存入self.history_data
撮合成交 cross_limit_order
载入策略和历史数据后,根据新来的数据计算,若符合发出具体的委托(buy/sell/short/cover),并且在下一根k线成交。
根据委托类型分为两种撮合:限价单和停止单撮合交易尽量仿真交易。暂时就简略看下。
计算策略盈亏情况 calculate_pnl
基于收盘价、当日持仓量、合约规模、滑点、手续费率等计算总盈亏与净盈亏。有个计算公式可以参考下
计算策略统计指标 calculate_statistics
基于逐日盯市盈亏情况来计算衍生指标,如最大回撤、年化收益、盈亏比、夏普比率等。
统计绘图 show_chart 使用matplotlib绘制
1、资金曲线图 2、资金回撤图 3、每日盈亏图 4、每日盈亏分布图
单策略回测实例
1、导入回测引擎和CTA策略
2、设置回测参数
3、载入数据和策略
4、统计盈亏情况
--到此需要数据了,稍后搞数据
投资组合回测
多个策略回测,每个策略都有一个BacktestingEngine对象
创建run_backtesting函数,初始化每个策略的engine
分别进行单策略回测,得到各自的DataFrame,除空值后即得到投资组合的DataFrame
show_portafolio(),也是BacktestingEngine对象,计算夏普比率之类的统计指标,可以显示单策略效果也能展示组合回测效果
回测基本学完了,准备不用客户端,本地python跑个回测
需要搞数据
官方推荐使用RQData就去搞一个,这个是米筐的
官网 https://www.ricequant.com/welcome/ 需要注册
好像看了下也需要客户端才能用这个,算了先看完再说
加载数据
菜单栏点击“配置”,进入全局配置页面输入RQData账号密码;或者直接配置json文件,即在用户目录下.vntrader文件夹找到vt_setting.json
初始化RQData客户端 init_rqdata
:从vt_setting.json中读取RQData的账户、密码到rq_client.init()函数进行初始化
RQData载入实盘 query_bar_from_rq
输入vt_symbol后,首先会转换成符合RQData格式的rq_symbol,通过get_price()函数下载数据,并且插入到数据库中。
学完了策略和回测,但是数据部分还是有点糟 mark下后面填坑
参数优化
回测完发现策略表现不好,但是大致方向是对的需要调整参数就需要参数优化。
参数优化主要有三部分
1、参数设置 OptimizationSetting类
设置参数优化区间
设置要优化的字段
随机生成参数组合,把参数组合打包
这个例子有点草率,没有说清楚怎么用,后面写完优化之后会补上自己写的代码
2、参数对组合回测
调用回测引擎
输入回测设置
输入参数对组合到策略中
回测
返回回测统计结果
3、多进程优化 为了加快回测速度
使用进程池 multiprocessing.Pool,每个进程调用apply_async( )运行参数对组合回测,回测结果存到results,对results的内容通过目标优化字段标准进行排序,输出结果。
参数优化部分略显简单后面写完代码理解后再补充
最后是实盘运行
创建策略 add_strategy
可以通过客户端创建策略实例,一键初始化,启动和停止
创建实例的时候需要填写如图的实例名称、合约品种、参数设置,合约名称 vt_symbol
代码里调用 add_strategy,实现功能
1、检查策略是否重名
2、添加策略配置信息(strategy_name, vt_symbol, setting)到strategies字典中
3、添加该策略要订阅的合约信息到symbol_strategy_map
4、策略配置信息保存json
5、图形化界面更新状态
初始化策略 _init_strategy
1、调用on_init(),并载入历史数据
2、恢复上次退出之前的策略状态
3、读取.vntrader/cta_strategy_data.json的策略信息
4、调用subcribe()订阅指定的行情信息
5、策略初始化状态变成ture,显示在图形界面
启动策略
1、查看策略初始化状态,启动状态,避免重复启动
2、调用策略类的on_start()函数启动策略
3、策略启动状态变成ture,显示在图形界面
停止策略
1、查看策略停止状态
2、调用on_stop()停止策略
3、更新策略启动状态为false
4、撤单
5、策略参数,最新的技术指标,以及持仓数量保存到.vntrader/cta_strategy_data.json
6、界面更新策略状态
编辑策略
1、重新配置策略字典setting
2、更新参数字典到策略
3、界面更新
移除策略
1、检查策略状态,只有停止后才能移除
2、从json文件中移除策略配置文件
3、从symbol_strategy_map字典中移除监控的合约
4、从strategy_orderid_map移除活动委托记录
5、从strategies字典移除该策略的相关配置信息。
锁仓操作
通过填写lock字段来让策略完成锁仓操作,即禁止平今,通过反向开仓来代替。
cta策略模板template中,可以看到如下具体委托函数都有lock字段,并且默认为False
设置lock=True后,cta实盘引擎send_order()函数发生响应,并且调用其最根本的委托函数send_server_order()去处理锁仓委托转换。首先是创建原始委托original_req,然后调用converter文件里面OffsetConverter类的convert_order_request来进行相关转换。
在convert_order_request_lock()函数中,先计算今仓的量和昨可用量;然后进行判断:若有今仓,只能开仓(锁仓);无今仓时候,若平仓量小于等于昨可用,全部平昨,反之,先平昨,剩下的反向开仓。
实盘部分基本就是基于客户端和代码交互做的简单介绍,感觉对框架理解有点用,但是实战策略意义不大。最后的锁仓操作理解不深,后面再慢慢体会!
基本的流程已经学完了,出了数据以外其他都理解差不多,数据明天再弄,先搞定非客户端数据的使用,估计要自己倒数据库,还有数据接口,明天再对回测做个补充
学习完吐个槽,vnpy安装确实有点坑,晚上windows下载完安装各种报错,还把Anaconda环境整的不行,自己的量化也跑不通了,终于知道创建虚拟运行环境的重要性!虽然vnpy坑比较多但是现在可替代的也不多,后面考虑搞backtrader,先入坑vnpy,光学习的话还是有很多借鉴的。