🚀 AI 一键生成 qmt 策略代码
立即体验

QMT平台 get_trading_dates 函数:count数量定位与start_date区间获取深度对比

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

问题描述

QMT 行情管理:get_trading_dates 数量定位与日期区间获取的应用对比
使用 get_trading_dates 时,count 参数和 start_date 区间定位有何区别?

解决方案

QMT行情管理:get_trading_dates 数量定位与日期区间获取的应用对比

在QMT量化策略开发中,ContextInfo.get_trading_dates 是一个非常核心的行情管理函数,用于获取指定个股、合约或指数的K线(交易日)时间戳列表。在实际应用中,开发者通常会面临两种定位需求:获取最近N根K线的时间(数量定位)或获取某时间段内的所有K线时间(区间定位)。

本文将深度对比 count 参数与 start_date 参数在 get_trading_dates 中的运行机制、优先级及应用场景。


1. 函数原型与参数释义

首先,我们来看 get_trading_dates 的标准调用格式:

ContextInfo.get_trading_dates(stockcode, start_date, end_date, count, period)

核心参数解析:

  • stockcode: 证券代码(如 '600000.SH'),缺省时默认为当前主图代码。
  • start_date: 区间起始时间(格式如 '20170101')。若不为空,则激活“区间定位”模式
  • end_date: 区间结束时间,缺省时默认为当前 bar 的时间。
  • count: 整数,表示获取的K线数量。若激活“数量定位”模式,将从 end_date 往前获取 count 个K线时间
  • period: K线周期(如 '1d' 代表日线,'1m' 代表1分钟线等)。

2. count 数量定位 vs start_date 区间定位 核心区别

这两者的本质区别在于定位维度参数优先级

对比维度 count 数量定位 start_date 区间定位
定位逻辑 end_date 往前倒推固定数量的K线。 获取 start_dateend_date 闭区间内的所有K线。
参数优先级 。当 start_date 不为空时,count 参数将被忽略 。只要设置了有效的 start_date,系统即切换为区间模式。
返回长度 长度恒等于 count(除非历史数据不足)。 长度动态变化,取决于该时间段内的实际交易日数量。
典型场景 计算技术指标(如获取最近20日均线所需的时间戳)。 历史财务分析、特定历史区间回测、跨品种对齐。

3. 代码示例与应用对比

场景一:使用 count 获取最近 5 个交易日的日线时间戳

当我们需要计算短期指标(如5日均价),只需要获取当前时间往前的5个交易日,此时应将 start_date 设为空字符串 ''

# coding:gbk
def handlebar(ContextInfo):
    # 获取当前主图品种,从当前bar往前数5个交易日的列表
    trading_dates = ContextInfo.get_trading_dates(ContextInfo.stockcode, '', '', 5, '1d')
    print(f"最近5个交易日: {trading_dates}")
    # 输出示例: ['20231023', '20231024', '20231025', '20231026', '20231027']

场景二:使用 start_date 获取特定日期区间内的所有交易日

当我们需要统计某一特定历史阶段(如2023年第一季度)的交易日时,必须指定 start_date。此时无论 count 填什么,都会被系统忽略:

# coding:gbk
def handlebar(ContextInfo):
    # 获取2023年1月1日至2023年3月31日之间的所有日线交易日
    # 此时 count 填 1 也会被忽略,实际返回该区间内全部约60个交易日
    trading_dates = ContextInfo.get_trading_dates('600000.SH', '20230101', '20230331', 1, '1d')
    print(f"2023年Q1交易日总数: {len(trading_dates)}")

4. 开发者避坑指南与最佳实践

  1. 避免参数冲突:很多初学者会同时填写 start_datecount,试图获取“某天开始往后的N个交易日”。这是错误的。QMT的底层逻辑是:一旦 start_date 有值,count 立即失效。如果想获取“某天开始往后的N个交易日”,应先用区间定位获取较长列表,再在 Python 中使用切片 [:N] 截取。
  2. 非日线周期的返回格式:当 period'1d'(日线)时,返回的日期格式为 ['YYYYMMDD', ...];而当 period 为分钟线(如 '1m', '5m')时,返回的格式为 ['YYYYMMDDHHMMSS', ...]。在做时间格式解析时需特别注意。
  3. 配合数据补充:无论是数量定位还是区间定位,获取结果都依赖于本地历史数据。在使用 get_trading_dates 前,请务必通过 QMT 客户端的 “数据管理” 功能补充对应品种和周期的历史行情数据,否则可能返回空列表。