第2天 vn.py CTA策略优化、回测与实盘(一)

今天主要是理论部分,主要是学习文档为主,估计要看几天
后面还期权波动,价差,风控之类的,估计得到周末用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,光学习的话还是有很多借鉴的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容