🚀 AI 一键生成 qmt 策略代码

为什么QMT中get_trading_dates函数只能获取最近一年的日期?

qmt | 发布时间: 2026/5/25
以下内容由 EasyQuant 生成。

问题描述

为什么获取日期get_trading_dates函数好像改成了只能取最近一年的日期

我是老版券商的添加,项目手动添加的lib

解决方案

在 QMT 平台中使用 ContextInfo.get_trading_dates 函数时,如果发现只能获取到最近一年的日期,通常并不是函数本身的机制被修改了,而是与本地历史数据的不完整参数设置有关。特别是对于使用老版本券商端或手动提取 lib 库独立运行的用户,这种情况非常常见。

以下是导致该问题的原因分析及解决方案:

1. 核心原因:本地历史数据缺失

get_trading_dates(stockcode, start_date, end_date, count, period) 函数在底层是依赖于本地的 K 线数据来推算交易日的。如果你的 QMT 客户端本地只下载了该品种最近一年的日线数据,那么该函数就只能返回这一年内的交易日列表。

老版本/手动 lib 的特殊性
如果你是脱离了 QMT 终端界面,手动引用 lib 库运行,程序可能无法自动触发历史数据的按需下载(新版 QMT 在某些模式下会自动补全数据,但老版或独立环境通常不会)。

✅ 解决方法
必须在 QMT 客户端中手动补充历史数据。

  1. 打开 QMT 客户端界面。
  2. 找到菜单栏的 【数据管理】 -> 【补充数据】
  3. 选择你需要获取日期的品种(如 000001.SH000300.SH),勾选 日线(1d) 周期。
  4. 将时间范围设置得更长(例如从 2010 年至今),点击下载补充。
  5. 数据补充完毕后,再次运行你的 Python 脚本,即可获取完整的历史交易日。

2. 参数传递逻辑问题

请检查你调用 get_trading_dates 时传入的参数。根据 QMT API 文档,该函数的参数逻辑如下:

  • start_date:开始时间(如 '20170101')。
  • end_date:结束时间(如 '20200101')。
  • count:K 线个数。注意:当 start_date 不为空时,count 参数是不生效的。当 start_date 为空时,系统会从 end_date 往前取 count 个交易日。

如果你没有传 start_date,而是依赖 count,请确保 count 的值足够大(例如 count=2000),否则默认可能只取了较少的天数。

✅ 正确的代码示例

def handlebar(ContextInfo):
    # 方式一:明确指定开始和结束时间(推荐)
    dates_by_range = ContextInfo.get_trading_dates('000300.SH', '20150101', '20230101', 1, '1d')
    print(f"按时间范围获取的天数: {len(dates_by_range)}")

    # 方式二:指定结束时间和往前推的 count 天数(start_date 必须为空字符串)
    dates_by_count = ContextInfo.get_trading_dates('000300.SH', '', '20230101', 1000, '1d')
    print(f"按 count 获取的天数: {len(dates_by_count)}")

3. 替代方案:使用指数作为基准

如果你只是想获取 A 股全局的交易日历,而不关心某个特定个股的停牌情况,建议始终使用大盘指数(如上证指数 000001.SH 或沪深300 000300.SH)作为 stockcode 参数传入。因为个股可能存在长期停牌,导致返回的交易日历不连续,而大盘指数的日期是最完整的。

总结

对于手动添加 lib 的老版本用户,90% 以上的概率是因为本地 Data 目录下缺乏早期的 K 线数据文件。请务必先登录 QMT 终端,利用【数据管理】工具把对应指数的日线数据下载全,问题即可迎刃而解。