问题描述
解决方案
在 QMT 量化交易平台中,您可以通过在 init(ContextInfo) 函数中赋值 ContextInfo.start 和 ContextInfo.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
注意事项
- 优先级规则:如果在代码中设置了
ContextInfo.start和ContextInfo.end,代码中的设置优先级高于策略编辑器界面“回测参数”面板中的设置。这意味着系统会忽略界面上填写的日期,强制使用代码中指定的时间段进行回测。 - 时间格式:时间字符串的标准格式为
'YYYY-MM-DD HH:MM:SS'(例如'2023-01-01 09:30:00')。 - 生效范围:此设置仅在回测模式下生效。在实盘或模拟盘运行模式下,这两个参数会被忽略,策略将依据实时行情运行。
- 位置要求:必须在
init函数中进行设置,且建议在init的前几行设置,确保在策略加载初期即生效。 - 数据有效性:如果设置的
ContextInfo.end小于或等于ContextInfo.start,回测计算范围将为空,导致回测无法正常进行。
Q&A
Q: 如果我在代码里写了日期,但界面上也设置了不同的日期,QMT 会以哪个为准?
A: QMT 会以代码里设置的日期为准。代码中的 ContextInfo.start 和 ContextInfo.end 具有更高的优先级,会覆盖界面上的回测参数设置。
Q: 这个设置会影响实盘交易吗?
A: 不会。ContextInfo.start 和 ContextInfo.end 仅用于定义历史回测的时间区间。实盘模式下,策略是跟随实时行情数据驱动运行的,这两个参数无效。
Q: 时间格式必须包含时分秒吗?
A: 建议包含时分秒以确保精确性,标准格式为 'YYYY-MM-DD HH:MM:SS'。如果只写日期(如 '2023-01-01'),系统可能无法正确解析或默认补全为 0 点,建议严格遵守标准格式。