问题描述
东北证券版。已经下载了全年的 5 分钟 K 线数据,datadir 目录已有 28G 内容。但是回测的时候就是没有数据,
ContextInfo.get_market_data_ex(
fields=['close','volume'],
stock_code=ContextInfo.trade_code_list,
period='1d', # 日线数据
start_time=start_date,
end_time=end_date,
dividend_type='front')
返回的 close 全是相同的,volume 恒定为 0。奇怪的是,不同 start_date,返回的 close 值不同(似乎又有数据)
把股票代码拿出来,手动单个加入补充列表然后下载过去一年的 1m、5mK 线,显示下载成功。但是回测还是原样。怎么回事呀
解决方案
出现这个问题,最核心的原因是:您下载的数据周期与代码中请求的数据周期不匹配。
问题分析
根据您的描述,您在客户端下载了 1分钟(1m) 和 5分钟(5m) 的K线数据。但是,在您的代码中,调用 ContextInfo.get_market_data_ex 时,参数设置的是 period='1d'(日线数据)。
在 QMT 平台中,不同周期的数据是独立存储的。系统不会在回测时自动将您下载的 5 分钟 K 线合成为日线数据。如果您没有专门下载日线数据,当代码请求 1d 数据时,本地数据库中找不到对应的日 K 线序列。
为什么会出现 close 全相同,volume 为 0?
当本地缺失请求周期的 K 线数据时,QMT 的底层机制可能会为了防止报错,使用该股票在本地能找到的某个基准价格(例如停牌前的最后收盘价或某个快照价格)进行向前/向后填充(Fill)。因为没有实际的交易发生,所以 volume 恒定为 0。而当您改变 start_date 时,系统获取到的基准填充价格可能发生了变化,导致您看到 close 值不同,但这并不是真实的 K 线序列。
解决方案
要解决这个问题,请按照以下步骤操作:
1. 补充日线(1d)数据
既然您的代码中需要使用 period='1d',您必须在 QMT 终端中下载日线数据。
- 打开 QMT 终端,进入 数据管理 -> 补充数据。
- 选择您需要的市场和股票代码。
- 在数据周期选项中,务必勾选“日线”。
- 设置好时间范围(覆盖您的回测区间),点击下载。
2. 检查时间参数格式
确保传入 ContextInfo.get_market_data_ex 的 start_time 和 end_time 格式正确。对于日线,标准格式应为字符串 'YYYYMMDD',例如 '20230101'。
3. 确保回测区间在数据范围内
在策略编辑器的“回测参数”中,检查设置的“开始时间”和“结束时间”,确保这个时间段完全包含在您刚刚下载的日线数据时间范围内。
4. 如果确实需要使用 5 分钟数据
如果您原本的策略逻辑是基于 5 分钟数据的,请将代码中的 period 参数修改为 '5m':
ContextInfo.get_market_data_ex(
fields=['close','volume'],
stock_code=ContextInfo.trade_code_list,
period='5m', # 修改为 5m
start_time=start_date,
end_time=end_date,
dividend_type='front'
)
总结: QMT 的 get_market_data_ex 接口是“所求即所得”,请求什么周期就必须提前下载好对应周期的数据。补充好日线数据后,您的回测就能正常获取到真实的 close 和 volume 了。