🚀 AI 一键生成 qmt 策略代码

如何使用 QMT 的 get_his_index_data API 获取指数历史上的所有成分股?

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

问题描述

怎么查询一个指数在过去某一天时的所有成分股列表?

解决方案

在 QMT (Quantitative Trading Platform) 中,查询指数在过去某一天(历史时刻)的成分股列表,主要使用 ContextInfo.get_sector 函数,并配合毫秒级时间戳参数来实现。

核心函数说明

ContextInfo.get_sector(sector, realtime)

  • sector: 字符串,指数代码,例如 '000300.SH' (沪深300)。
  • realtime: 整数,毫秒级时间戳。如果不填,默认获取当前最新成分股;如果填写历史时间戳,则获取该时刻的成分股。

代码实现

以下是一个完整的 Python 策略代码示例,展示了如何将日期字符串转换为时间戳,并查询指定日期的沪深300成分股。

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

def init(ContextInfo):
    # 1. 设置要查询的指数代码(例如:沪深300)
    index_code = '000300.SH'
    
    # 2. 设置要查询的历史日期(格式:YYYYMMDD)
    target_date_str = '20210104'
    
    # 3. 将日期字符串转换为毫秒级时间戳
    # 先转换为 datetime 对象
    dt_obj = datetime.datetime.strptime(target_date_str, "%Y%m%d")
    # 转换为秒级时间戳,再乘以 1000 变为毫秒
    timetag = int(time.mktime(dt_obj.timetuple()) * 1000)
    
    # 4. 调用 get_sector 获取历史成分股
    # 注意:第二个参数传入计算好的 timetag
    component_list = ContextInfo.get_sector(index_code, timetag)
    
    # 5. 输出结果
    print(f"查询日期: {target_date_str}")
    print(f"指数代码: {index_code}")
    print(f"成分股数量: {len(component_list)}")
    print(f"成分股列表 (前10个): {component_list[:10]}")

def handlebar(ContextInfo):
    pass

注意事项

  1. 数据下载:为了确保能查询到历史成分股,请确保在 QMT 客户端的【数据管理】中下载了对应指数的历史行情数据基础信息数据
  2. 时间戳格式:QMT 的 API 普遍使用毫秒(13位数字)作为时间戳单位,而 Python 标准库 time.time() 返回的是秒(10位数字),因此务必乘以 1000。
  3. 板块 vs 指数
    • 如果是查询标准的指数(如上证50、沪深300),使用 ContextInfo.get_sector
    • 如果是查询左侧板块列表中的概念板块或行业板块(如“我的自选”、“CSRC采矿业”),通常使用 ContextInfo.get_stock_list_in_sector(sectorname, realtime),用法类似,也支持时间戳参数。

Q&A

Q: 如果我只输入指数代码而不输入时间参数,会发生什么?
A: 如果省略 realtime 参数,ContextInfo.get_sector 将默认返回该指数当前最新的成分股列表,而不是历史列表。

Q: get_sector 返回的股票代码是什么格式?
A: 返回的是一个列表(List),包含字符串格式的股票代码,形式为 code.market,例如 ['600000.SH', '000001.SZ', ...]

Q: 如何查询某个行业(如“银行”)在历史上的成分股?
A: 对于行业板块,建议使用 ContextInfo.get_stock_list_in_sector(sectorname, realtime)。例如 ContextInfo.get_stock_list_in_sector('申万银行', timetag)

Q: 为什么我查询出来的列表是空的?
A: 可能有两个原因:一是该日期是非交易日或该指数在该日期尚未发布;二是本地缺少该指数的历史基础数据,请尝试在客户端补充下载数据。