自定义任意分钟期货回测
由bqi2tg8b创建,最终由small_q 被浏览 53 用户
一、简介
在期货分钟策略研究中,常见的回测周期包括 1 分钟、5 分钟、15 分钟和 30 分钟。但实际研究中,也可能希望使用 7 分钟、10 分钟、13 分钟等自定义周期。
BigTrader 是 BigQuant 提供的量化交易引擎。设置回测频率后,引擎会按照对应的 K 线频率推进历史行情,并在相应 Bar 上调用策略中的 handle_data。
本文以焦煤期货布林带策略为例,重点说明:
- 如何设置自定义分钟回测频率;
- 如何将频率传入 BigTrader;
- 1 分钟指标数据与自定义回测频率有什么区别;
- 如何通过运行日志验证频率已经生效;
- 如何修改为 7 分钟、13 分钟等其他周期。
本文重点是自定义分钟回测机制。布林带、止损、仓位管理和移仓换月等策略逻辑仅作为完整运行示例,不展开讨论。
二、完整策略代码
下面是本文使用的完整焦煤期货策略。
https://bigquant.com/codesharev3/2c17a931-ea3b-4f84-9238-046dcbaae283
- 从
cn_future_bar1m获取期货 1 分钟行情; - 计算布林带指标;
- 设置回测频率;
- 每日确定并订阅交易合约;
- 在
handle_data中判断交易信号; - 执行开仓、平仓、反手、止损和移仓换月;
- 通过
bigtrader.run启动回测。
后文只解释其中与自定义分钟回测直接相关的部分。
三、自定义分钟回测的核心设置
整个自定义分钟回测最关键的是两个位置。
1. 定义回测频率
策略中首先设置:
frequency = '5min'
这里的 5min 是代码中便于阅读的频率形式。
如果需要测试其他周期,只需要修改这一变量,例如:
frequency = '13min'
2. 将频率传入 BigTrader
启动回测时,将频率传入:
bigtrader.run(
...
frequency=frequency.replace('min', 'm'),
...
)
其中:
5min → 5m
13min → 13m
也就是说:
设置 frequency
↓
将 min 转换为 m
↓
传入 bigtrader.run
↓
BigTrader 按对应分钟周期运行
因此,决定策略实际运行周期的是 bigtrader.run 中的 frequency 参数。
四、BigTrader 如何按照设定频率运行
BigTrader 的分钟回测可以简化理解为:
启动回测
↓
执行 initialize
↓
每日执行 before_trading_start
↓
按照设定频率推进 K 线
↓
调用 handle_data
↓
检查信号并执行交易逻辑
↓
处理下一根 K 线
其中三个主要回调函数分别负责:
| 函数 | 作用 |
|---|---|
initialize |
回测开始时执行一次,用于加载数据和设置参数 |
before_trading_start |
每个交易日盘前执行,用于完成每日准备和行情订阅 |
handle_data |
回测过程中按照 Bar 重复执行,用于检查信号和执行交易 |
完整策略代码中已经展示了这些函数的具体实现,因此这里不再逐项展开。
对于本文的自定义分钟回测,最重要的是:
frequency决定 BigTrader 以什么分钟周期推进行情,而handle_data则在对应的 Bar 上运行策略逻辑。
五、1 分钟数据和自定义分钟回测不是一回事
这是理解本文代码时最需要区分的一点。
当前策略同时使用了:
1 分钟行情数据
+
5 分钟 BigTrader 回测频率
二者承担不同任务。
1. 1 分钟行情用于计算指标
完整代码从:
cn_future_bar1m
读取中国期货 1 分钟行情。
因此,布林带等指标本身是根据 1 分钟 K 线计算的。
例如策略中的:
length = 70
表示使用最近 70 根 1 分钟 K 线计算指标。
它不会因为 BigTrader 设置为 5 分钟回测,就自动变成 70 根 5 分钟 K 线。
2. 自定义频率控制策略多久运行一次
例如设置:
frequency = '5min'
表示 BigTrader 按 5 分钟周期运行策略逻辑。
因此,当前示例实际属于:
1 分钟行情
↓
计算 1 分钟布林带
↓
BigTrader 每 5 分钟运行一次
↓
读取对应指标
↓
判断是否交易
可以概括为:
1 分钟指标数据 + 5 分钟回测频率
而不是:
5 分钟 K 线 + 5 分钟布林带
3. 修改为 13 分钟后也是同样的逻辑
如果修改:
frequency = '13min'
那么策略变为:
使用 1 分钟行情计算指标,以 13 分钟频率运行交易逻辑。
如果希望构造真正的 13 分钟布林带策略,则需要先将行情转换为 13 分钟 K 线,再基于 13 分钟数据计算指标。
这属于“指标数据频率”的问题,与本文讨论的“BigTrader 回测频率”是两个概念。
六、如何通过日志验证回测频率
仅修改参数还不够,第一次使用某个自定义周期时,建议通过日志检查 BigTrader 是否按照预期运行。
可以从两个方面验证。
1. 查看启动日志
当前策略设置:
frequency = '5min'
运行后日志中可以看到:
bigtrader.run start: market=cn_future, frequency=5m, mode=backtest
其中:
frequency=5m
说明设置的频率已经成功传入 BigTrader。
2. 查看 handle_data 的实际时间
为了观察策略实际回调时间,完整代码在 handle_data 中打印了当前回测时间。
因此 Notebook 中会连续出现类似:
2024-01-02 09:05:00
2024-01-02 09:10:00
2024-01-02 09:15:00
2024-01-02 09:20:00
2024-01-02 09:25:00
可以看到,同一连续交易区间内,相邻时间相差:
5 分钟
这与设置的:
frequency=5m
一致。
因此可以确认 5 分钟回测频率已经生效。
七、为什么日志时间不一定始终相差设定分钟数
实际期货交易并不是全天连续进行。
例如日志中可能出现:
10:15
10:35
或者:
11:30
13:35
这些时间之间明显不止 5 分钟,但不代表自定义频率失效。
原因是中间可能跨越:
- 盘中休市;
- 午间休市;
- 日盘与夜盘之间的非交易时间;
- 不同交易时段。
因此验证自定义分钟频率时,不应跨越非连续交易区间计算时间差。
正确方法是观察:
同一个连续交易时段内,相邻
handle_data回调是否符合设定的分钟间隔。
例如:
09:05
09:10
09:15
09:20
09:25
这样的连续日志才适合用于验证 5 分钟频率。
八、如何修改为其他自定义分钟周期
更换分钟周期时,通常只需要修改:
frequency = '5min'
例如改为 13 分钟:
frequency = '13min'
程序会在启动 BigTrader 时自动转换:
13min → 13m
同样的方法可以用于其他周期:
| 目标周期 | 参数设置 | 传入 BigTrader |
|---|---|---|
| 3 分钟 | '3min' |
'3m' |
| 5 分钟 | '5min' |
'5m' |
| 7 分钟 | '7min' |
'7m' |
| 10 分钟 | '10min' |
'10m' |
| 13 分钟 | '13min' |
'13m' |
| 20 分钟 | '20min' |
'20m' |
| 30 分钟 | '30min' |
'30m' |
对于 7 分钟、13 分钟等非传统分钟周期,建议第一次运行时先使用较短的回测区间,通过日志确认实际回调频率。
九、13 分钟实际运行验证
本文当前完整示例运行的是 5 分钟频率。
为了更直观展示“自定义分钟回测”,我们将:
frequency = '5min'
临时修改为:
frequency = '13min'
然后进行测试。
首先检查启动日志是否出现:
frequency=13m
随后检查同一个连续交易区间中的时间,例如:
09:10
09:23
09:36
09:49
10:02
如果相邻时间均相差 13 分钟,就说明自定义 13 分钟频率已经实际生效。
十、修改回测频率为什么会改变策略结果
回测频率不仅影响日志输出,也会影响策略实际运行。
例如同一个交易信号,如果分别采用:
5 分钟
13 分钟
策略检查到该信号的时间可能不同。
因此修改分钟周期可能改变:
- 信号检查时间;
- 下单时间;
- 撮合时间;
- 交易次数;
- 持仓时间;
- 成交价格;
- 最终收益;
- 回撤和其他绩效指标。
所以:
回测频率本身也是策略设计的一部分。
不同分钟周期不能只修改参数后默认结果等价,而应该分别进行完整回测比较。
十一、推荐的测试流程
第一次测试某个自定义周期时,可以按照下面的流程:
设置自定义频率
↓
例如 frequency = '13min'
↓
转换为 13m
↓
传入 bigtrader.run
↓
使用几个交易日进行测试
↓
检查启动日志 frequency=13m
↓
检查 handle_data 连续回调时间
↓
确认频率正确
↓
扩大正式回测区间
这样可以快速确认频率设置是否符合预期,避免直接运行较长历史区间后再排查问题。
十二、常见问题
1. 只修改 frequency 就可以改变回测周期吗?
如果只是改变 BigTrader 的策略运行周期,核心就是修改 frequency。
例如:
frequency = '7min'
BigTrader 将按照对应的 7 分钟频率运行。
但指标计算频率不会因此自动改变。
2. 修改成 13 分钟后,布林带也变成 13 分钟了吗?
不会。
当前布林带仍然基于 cn_future_bar1m 的 1 分钟行情计算。
因此:
frequency = '13min'
表示:
1 分钟布林带指标 + 13 分钟策略运行频率
而不是 13 分钟布林带。
3. 为什么不能直接看任意两个日志时间判断频率?
因为期货存在非连续交易区间。
应该比较同一个连续交易时段内的相邻时间,而不是跨午休、盘中休市或日夜盘比较。
4. 修改分钟周期后需要重新回测吗?
需要。
不同频率会改变信号检查和交易执行时点,因此可能产生不同的交易记录和绩效结果。
5. 回测频率是不是越短越好?
不是。
较短周期通常意味着:
- 更频繁的信号检查;
- 更多短期价格噪声;
- 潜在的更多交易;
- 更高的手续费和滑点影响;
- 更高的回测计算量。
较长周期运行频率较低,但也可能出现信号延迟。
因此应根据具体策略选择合适的分钟周期。
十三、总结
BigTrader 自定义分钟回测的核心流程可以概括为:
设置 frequency
↓
例如 13min
↓
转换为 13m
↓
传入 bigtrader.run
↓
BigTrader 按对应频率推进
↓
handle_data 按 Bar 执行
↓
通过日志检查实际运行频率
实际使用时最重要的是区分:
指标数据频率
≠
BigTrader 回测频率
当前示例属于:
1 分钟行情计算指标
+
N 分钟 BigTrader 回测
例如:
1分钟指标 + 5分钟回测
1分钟指标 + 7分钟回测
1分钟指标 + 13分钟回测
如果只是研究不同策略运行周期,可以直接修改 frequency。
如果希望指标本身也按照 5 分钟、13 分钟等周期计算,则还需要进一步对原始分钟行情进行重采样。
因此,自定义分钟回测的关键并不复杂:
设置正确的
frequency,传入 BigTrader,并通过连续交易区间的实际回调日志验证。
\