🚀 AI 一键生成 qmt 策略代码

QMT 灵活回测:如何用代码设置策略的回测时间范围?

qmt | 发布时间: 2025/12/12
以下内容由 EasyQuant 生成。

问题描述

如何在代码里直接指定策略回测的开始和结束日期?

解决方案

在 QMT 量化交易平台中,您可以通过在 init(ContextInfo) 函数中赋值 ContextInfo.startContextInfo.end 变量来直接指定回测的起止日期。

实现方法

在策略代码的初始化函数 init 中添加如下代码即可:

#coding:gbk

def init(ContextInfo):
    # 设置回测开始时间,格式为 'YYYY-MM-DD HH:MM:SS'
    ContextInfo.start = '2022-01-01 09:30:00'
    
    # 设置回测结束时间,格式为 'YYYY-MM-DD HH:MM:SS'
    ContextInfo.end = '2022-12-31 15:00:00'
    
    # 设置回测基准(可选)
    ContextInfo.benchmark = '000300.SH'
    
    # 设定股票池等其他初始化操作
    ContextInfo.set_universe(['600000.SH'])

def handlebar(ContextInfo):
    # 策略核心逻辑
    pass

注意事项

  1. 优先级规则:如果在代码中设置了 ContextInfo.startContextInfo.end代码中的设置优先级高于策略编辑器界面“回测参数”面板中的设置。这意味着系统会忽略界面上填写的日期,强制使用代码中指定的时间段进行回测。
  2. 时间格式:时间字符串的标准格式为 'YYYY-MM-DD HH:MM:SS'(例如 '2023-01-01 09:30:00')。
  3. 生效范围:此设置仅在回测模式下生效。在实盘或模拟盘运行模式下,这两个参数会被忽略,策略将依据实时行情运行。
  4. 位置要求:必须在 init 函数中进行设置,且建议在 init 的前几行设置,确保在策略加载初期即生效。
  5. 数据有效性:如果设置的 ContextInfo.end 小于或等于 ContextInfo.start,回测计算范围将为空,导致回测无法正常进行。

Q&A

Q: 如果我在代码里写了日期,但界面上也设置了不同的日期,QMT 会以哪个为准?
A: QMT 会以代码里设置的日期为准。代码中的 ContextInfo.startContextInfo.end 具有更高的优先级,会覆盖界面上的回测参数设置。

Q: 这个设置会影响实盘交易吗?
A: 不会。ContextInfo.startContextInfo.end 仅用于定义历史回测的时间区间。实盘模式下,策略是跟随实时行情数据驱动运行的,这两个参数无效。

Q: 时间格式必须包含时分秒吗?
A: 建议包含时分秒以确保精确性,标准格式为 'YYYY-MM-DD HH:MM:SS'。如果只写日期(如 '2023-01-01'),系统可能无法正确解析或默认补全为 0 点,建议严格遵守标准格式。