🚀 AI 一键生成 qmt 策略代码

QMT 时间序列处理:如何使用 get_trading_dates 获取指定周期的交易日历?

qmt | 发布时间: 2025/12/9
以下内容由 EasyQuant 生成。

问题描述

如何获取过去一个月内某个股票的所有交易日日期列表?

解决方案

在 QMT 中,获取某个股票在特定时间段内的所有交易日日期,可以使用 ContextInfo.get_trading_dates 函数。

核心函数说明

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

  • stockcode: 股票代码(如 '600000.SH')。
  • start_date: 开始日期字符串(格式 'YYYYMMDD')。
  • end_date: 结束日期字符串(格式 'YYYYMMDD')。
  • count: K线个数。注意:当设置了 start_date 时,此参数会被忽略,但调用时仍需传入一个整数(如 1)作为占位符。
  • period: 周期,获取日线交易日列表应填 '1d'

代码实现

以下是一个完整的策略示例代码,它会在策略初始化时计算过去 30 天的日期范围,并打印出该范围内该股票的所有实际交易日。

# -*- coding: gbk -*-
import datetime

def init(ContextInfo):
    # 1. 设置要查询的股票代码
    stock_code = '600000.SH'
    
    # 2. 计算过去一个月的起止日期
    # 获取当前时间
    now = datetime.datetime.now()
    # 结束时间设为今天 (格式: YYYYMMDD)
    end_date = now.strftime('%Y%m%d')
    # 开始时间设为30天前
    start_date = (now - datetime.timedelta(days=30)).strftime('%Y%m%d')
    
    # 3. 调用API获取交易日列表
    # 参数说明: 
    # stockcode: 股票代码
    # start_date: 开始日期
    # end_date: 结束日期
    # count: 1 (因为指定了start_date,这个参数不起作用,但必须填一个整数)
    # period: '1d' (日线周期)
    trading_dates = ContextInfo.get_trading_dates(stock_code, start_date, end_date, 1, '1d')
    
    # 4. 打印结果
    print("=" * 30)
    print("查询标的: {}".format(stock_code))
    print("查询范围: {} 至 {}".format(start_date, end_date))
    print("交易日数量: {}".format(len(trading_dates)))
    print("交易日列表: ")
    print(trading_dates)
    print("=" * 30)

def handlebar(ContextInfo):
    # 本示例仅在init中演示获取数据,handlebar中无需操作
    pass

注意事项

  1. 数据格式:返回的 trading_dates 是一个包含字符串的列表(例如 ['20231010', '20231011', ...])。
  2. 停牌处理:该函数返回的是该标的在交易所存在的 K 线时间。如果股票在某天停牌且没有生成 K 线数据(取决于数据源的处理方式),该日期可能不会出现在列表中。通常情况下,get_trading_dates 返回的是交易所的交易日历。
  3. 周期参数period 参数必须设置为 '1d' 才会返回 'YYYYMMDD' 格式的日期。如果设置为分钟周期(如 '1m'),返回的将是包含时间的字符串(如 '20231010093100')。

Q&A

Q: 如果我只想获取最近的 N 个交易日,而不是按日期范围获取,该怎么写?
A: 可以将 start_date 设置为空字符串 '',然后通过 count 参数指定数量。例如获取最近 20 个交易日:ContextInfo.get_trading_dates('600000.SH', '', '20231027', 20, '1d')

Q: get_trading_dates 返回的列表是排序的吗?
A: 是的,返回的列表是按照时间从早到晚升序排列的。

Q: 为什么代码第一行要加 # -*- coding: gbk -*-
A: QMT 的 Python 编辑器和底层环境默认使用 GBK 编码。添加此声明可以防止在代码中使用中文字符(如注释或打印信息)时出现乱码或报错。