自定义任意分钟期货回测

由bqi2tg8b创建,最终由small_q 被浏览 53 用户

一、简介

在期货分钟策略研究中,常见的回测周期包括 1 分钟、5 分钟、15 分钟和 30 分钟。但实际研究中,也可能希望使用 7 分钟、10 分钟、13 分钟等自定义周期。

BigTrader 是 BigQuant 提供的量化交易引擎。设置回测频率后,引擎会按照对应的 K 线频率推进历史行情,并在相应 Bar 上调用策略中的 handle_data

本文以焦煤期货布林带策略为例,重点说明:

  1. 如何设置自定义分钟回测频率;
  2. 如何将频率传入 BigTrader;
  3. 1 分钟指标数据与自定义回测频率有什么区别;
  4. 如何通过运行日志验证频率已经生效;
  5. 如何修改为 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,并通过连续交易区间的实际回调日志验证。

\

评论
  • 请问这个策略的详细文档在哪可以查看?
  • undefined
{link}