问题描述
解决方案
在 QMT 平台中对已编写好的 Python 策略进行历史数据回测,主要分为数据准备、参数设置和执行回测三个步骤。
以下是详细的操作流程:
1. 补充历史数据(至关重要)
QMT 的回测依赖本地数据,因此在回测前必须下载所需的数据。
- 操作入口:点击客户端顶部的**【数据管理】**。
- 操作步骤:
- 选择您策略涉及的市场(如沪深A股)和品种。
- 选择需要回测的周期(如日线、1分钟线等)。
- 设置下载的时间段(应覆盖您的回测区间)。
- 点击下载,等待数据补充完成。
2. 设置回测参数
您可以通过策略编辑器界面或代码两种方式设置回测参数。
方式 A:通过策略编辑器界面设置
在策略编辑器右侧面板中,找到**【回测参数】**标签页进行设置:
- 时间区间:设置回测的开始时间和结束时间。
- 基准:设置参考基准(如沪深300指数)。
- 资金:设置初始资金(如 1,000,000)。
- 费率与滑点:设置手续费(按比例或固定值)、印花税及滑点(模拟冲击成本)。
- 基本信息:在【基本信息】标签页中,确认默认周期和默认品种(这将决定回测的主图驱动行情)。
方式 B:通过代码设置(推荐)
在策略的 init(ContextInfo) 函数中直接写入参数,代码中的设置优先级高于界面设置。
def init(ContextInfo):
# 1. 设定回测起止时间
ContextInfo.start = '2020-01-01 00:00:00'
ContextInfo.end = '2021-12-31 15:00:00'
# 2. 设定基准 (例如沪深300)
ContextInfo.benchmark = '000300.SH'
# 3. 设定初始资金
ContextInfo.capital = 1000000
# 4. 设定手续费 (例如万分之三)
# 参数顺序: [买入印花税, 卖出印花税, 开仓手续费, 平仓手续费, 平今手续费, 最低佣金]
# 如果只传一个浮点数,则代表开平仓手续费相同,其余为0
ContextInfo.set_commission(0, [0.001, 0.001, 0.0003, 0.0003, 0, 5])
# 5. 设定滑点 (例如 1跳)
# 参数1: 滑点类型 (0:跳数, 1:固定值, 2:比例)
ContextInfo.set_slippage(0, 1)
# 6. 设定股票池
ContextInfo.set_universe(['600000.SH', '000001.SZ'])
3. 执行回测与查看结果
- 启动回测:在策略编辑器顶部工具栏,点击**【回测】**按钮(注意不要点击“运行”,运行是用于实时行情或模拟盘)。
- 查看绩效:
- 回测完成后,界面会跳转到回测结果页。
- 绩效指标:查看年化收益率、夏普比率、最大回撤、Alpha/Beta 等指标。
- 可视化图表:主图会显示策略净值曲线与基准曲线的对比,以及买卖点标记。
- 详细分析:
- 交易明细:查看每一笔成交的时间、价格和数量。
- 持仓分析:查看每日持仓市值和仓位变化。
- 日志输出:如果在代码中使用了
print()或ContextInfo.paint(),可以在日志面板或副图中查看调试信息。
常见问题提示
- 无交易记录:如果回测结果为空,请检查是否已下载对应时间段和周期的历史数据,或者检查
ContextInfo.set_universe是否设置了有效的股票池。 - 撮合机制:回测模式下,默认在信号产生的下一根 K 线的第一个 tick(或开盘价)撮合成交。如果需要在当根 K 线成交,需在
passorder函数中设置quickTrade=1(但这可能引入未来函数,需谨慎使用)。