cta_backtesting/backtesting_demo.ipynb
脚本用于执行cta策略回测,具体采用策略在vnpy_ctastrategy文件夹下,我用到的是双均线策略double_ma_strategy.py文件下的doublemaStrategy
首先调用了datetime模块,用于处理日期和时间
从vnpy_ctastrategy.backtesting模块中导入BacktestingEngine类,这个类是回测的核心,负责模拟交易和计算结果
从vnpy_ctastrategy.strategies.double_ma_strategy模块中导入doublemaStrategy类,这是双移动平均线策略的实现
代码运行
1. 初始化回测引擎backtestingengine()赋值给engine
2. 设置回测参数
合约代码vt_symbol:IF.CFFEX
时间范围:2024年12月26日至2025年3月3日
数据粒度interval:1分钟K线
手续费率:0.3/10000,滑点:0.2,合约乘数:1
初始资金:1,000,000
3. 添加策略类doublemaStrategy,第二个参数是一个空字典{}可以设置参数,没有就默认
4. 加载历史数据并运行回测
5. 计算回测结果及统计指标返回一个dataframe
6. 显示回测图表并输出当前合约信息
脚本运行后,导入类和模块,异步运行代码
代码分析double_ma_strategy.py
实现基于双均线交叉的CTA策略,通过均线金叉/死叉生成交易信号,完成自动买卖操作
从vnpy_ctastrategy模块中导入
ctatemplate策略模板类,提供了策略框架
stoporder止损单类
tickdata、bardata、tradedata、orderdata行情数据、分钟线数据、成交数据和订单数据的类
bargenerator生成分钟线数据的类
arraymanager管理数组数据的类
通过bargenerator将Tick数据合成1分钟K线
arraymanager维护K线序列,计算技术指标
加载至少10根历史K线load_bar(10),确保均线计算有足够数据
on_bar应该是策略的核心
每根新K线生成时
取消所有未完成订单cancel_all()
更新ArrayManager数据,检查数据是否初始化完成
计算快速均线和慢速均线的当前值与前值然后判断交叉根据均线的交叉勤快进行交易
ctatemplate
文件位置vnpy_ctastrategy
策略生命周期管理、订单接口、日志记录等基础功能
bargenerator
文件位置vnpy_ctastrategy
将tick数据聚合为K线,触发on_bar回调
arraymanager
文件位置vnpy_ctastrategy
管理时间序列数据,支持sma等指标计算
作用
on_init 策略初始化时的回调函数
on_start策略启动时的回调函数
on_stop策略停止时的回调函数
on_tick收到新的 tick 数据时的回调函数
on_bar收到新的分钟线数据时的回调函数
on_order收到新的订单数据时的回调函数
on_trade收到新的成交数据时的回调函数
on_stop_order收到新的止损单数据时的回调函数
ctatemplate基类
dmoublemastrategy继承的ctatemplate
作为交易策略的模板,提供了基本的框架和工具
trading策略是否在交易中
update_setting(setting)更新策略的参数
get_class_parameters()获取策略类的默认参数
get_parameters()获取策略的参数字典
get_variables()获取策略的变量字典
get_data()获取策略的数据字典
on_tick(tick)、on_bar(bar)、on_trade(trade)、on_order(order)、on_stop_order(stop_order)数据和订单更新的回调方法
buy()、sell()、short()、cover():发送买卖订单的方法
send_order()发送订单的核心方法
cancel_order(vt_orderid)取消订单
cancel_all()取消所有订单
write_log(msg)记录日志信息
get_engine_type()获取引擎类型
get_pricetick()获取合约的最小价格变动单位
get_size()获取合约的乘数
load_bar()、load_tick()加载历史数据
put_event()发送策略事件
send_email(msg)发送电子邮
sync_data()同步策略数据
tick_add价格偏移量
last_tick最后收到的 Tick 数据
last_bar最后收到的分钟线数据
target_pos目标仓位
on_tick(tick)、on_bar(bar)数据更新的回调方法
on_order(order)订单更新的回调方法
check_order_finished()检查订单是否完成
set_target_pos(target_pos)设置目标仓位
trade()执行交易逻辑
cancel_old_order()取消旧订单
send_new_order()发送新订单
Tick数据通过on_tick()接收,触发BarGenerator合成K线
通过on_bar()处理,执行策略逻辑如均线计算、信号生成
load_bar()加载历史K线数据,触发on_bar()逐根回放
load_tick()加载历史Tick数据,触发on_tick()逐笔回放
BarGenerator
在on_tick()中更新,合成K线后触发on_bar()
1初始化策略
创建CtaTemplate或其子类的实例
调用__init__方法,初始化策略的属性和参数
调用update_setting(setting)方法,更新策略的参数
2加载数据
调用load_bar(days, interval, callback, use_database)或load_tick(days)方法,加载历史数据
数据加载完成后,调用on_bar(bar)或on_tick(tick)方法,更新策略的状态
3策略启动
调用on_start()方法,启动策略
策略进入交易状态,开始处理数据和订单
4数据处理
当新的数据分钟线或 Tick 数据到达时,调用on_bar(bar)或on_tick(tick)方法
在这些方法中,策略会根据数据更新状态,并生成交易信号
5信号生成与订单处理
根据生成的信号,调用buy()、sell()、short()或cover()方法发送订单
订单发送后,调用on_order(order)方法处理订单状态
如果订单成交,调用on_trade(trade)方法处理成交信息,更新持仓
6策略停止
调用on_stop()方法,停止策略
策略退出交易状态,清理资源
7数据同步与事件通知
调用put_event()方法,发送策略事件,通知ui更新
调用sync_data()方法,同步策略数据到磁盘
ctatemplate 在实盘的时候底层调用什么下单,在回测时候调用什么下单
底层调用cta_engine.send_order()方法通过Gateway连接交易所接口实际委托单通过交易API发送到交易所
回测调用BacktestingEngine基于pricetick和slippage计算成交价按时间优先原则匹配订单 自动处理手续费rate参数
send_order方法会调用send_stop_order或send_limit_order
接实盘的时候交易所来行情更新,怎么把新更新的数据推送给策略,或者策略怎么知道数据更新了,怎么获取最新价格
交易所-Gateway-EventBus-CtaEngine-策略实例
1Gateway收到行情后生成TickData/BarData事件
2CtaEngine通过register_event捕获事件
3触发策略的on_tick()或on_bar()回调
4策略通过参数直接获取最新价格tick.last_price bar.close_price
ctatemplate 在接回测的时候,怎么通过历史数据回放,然后通过回放的数据计算盈亏
从数据库加载历史数据start和end时间过滤按时间顺序逐根推送数据到策略策略产生信号后生成虚拟订单
ctatemplate 底层具体接哪个数据库,由什么控制的
默认数据库SQLite,支持MongoDB MySQL/PostgreSQL
修改这个里面vt_setting.json
由这个控制
fromvnpy.trader.databaseimport database_manager
database_manager.init("mongodb://localhost:27017")
按这个存储
K线数据dbbardata
Tick数据表dbtickdata
通过Interval字段区分
__init__.py初始化和配置cta策略
。。。