🚀 AI 一键生成 qmt 策略代码

QMT API 教程:使用 get_his_contract_list 获取并处理已退市的过期合约

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

问题描述

做期货回测时,如何获取已经交割退市的历史合约代码列表?

解决方案

在 QMT 平台进行期货回测时,获取已经交割退市的历史合约代码列表主要使用 ContextInfo.get_his_contract_list 接口。

以下是详细的操作步骤和代码示例。

1. 核心接口说明

  • 函数名称ContextInfo.get_his_contract_list(market)
  • 功能:获取指定市场的过期合约列表。
  • 参数market (string),市场代码,例如 'IF' (中金所), 'SF' (上期所), 'DF' (大商所), 'ZF' (郑商所), 'INE' (能源中心)。
  • 返回值list,包含过期合约代码的列表。

2. 关键前置步骤:补充数据

注意:该接口依赖于本地的基础数据。在使用代码获取之前,必须在 QMT 客户端手动下载过期合约列表,否则返回结果可能为空。

操作路径

  1. 打开 QMT 客户端。
  2. 点击菜单栏的 【数据管理】(或【系统】->【数据管理】)。
  3. 选择 【补充数据】 选项卡。
  4. 找到 【过期合约列表】 或类似的选项,勾选对应的期货市场。
  5. 点击 【开始补充】【下载】

3. 代码实现示例

以下代码展示了如何在 init 函数中获取不同期货市场的历史过期合约列表。

# -*- coding: gbk -*-

def init(ContextInfo):
    """
    获取期货过期合约列表示例
    """
    
    # 1. 获取中金所 (IF) 的过期合约列表
    # 包括股指期货(IF, IC, IH, IM) 和 国债期货(TF, T, TS) 等
    cffex_expired = ContextInfo.get_his_contract_list('IF')
    print("中金所过期合约数量: ", len(cffex_expired))
    # 打印前5个作为示例
    if len(cffex_expired) > 0:
        print("中金所部分过期合约: ", cffex_expired[:5])
        
    # 2. 获取上期所 (SF) 的过期合约列表
    # 包括螺纹钢(rb), 铜(cu) 等
    shfe_expired = ContextInfo.get_his_contract_list('SF')
    print("上期所过期合约数量: ", len(shfe_expired))
    
    # 3. 获取大商所 (DF) 的过期合约列表
    # 包括铁矿石(i), 豆粕(m) 等
    dce_expired = ContextInfo.get_his_contract_list('DF')
    print("大商所过期合约数量: ", len(dce_expired))
    
    # 4. 获取郑商所 (ZF) 的过期合约列表
    # 包括PTA(TA), 棉花(CF) 等
    czce_expired = ContextInfo.get_his_contract_list('ZF')
    print("郑商所过期合约数量: ", len(czce_expired))

    # 5. 获取能源中心 (INE) 的过期合约列表
    # 包括原油(sc) 等
    ine_expired = ContextInfo.get_his_contract_list('INE')
    print("能源中心过期合约数量: ", len(ine_expired))

def handlebar(ContextInfo):
    # 该策略仅演示获取列表,无需在 handlebar 中执行逻辑
    pass

4. 常用期货市场代码对照表

在使用 get_his_contract_list 时,请使用以下市场代码(Market Code):

交易所名称 市场代码 包含品种示例
中金所 (China Financial Futures Exchange) IF 沪深300(IF), 中证500(IC), 国债(T/TF)
上期所 (Shanghai Futures Exchange) SF 螺纹(rb), 铜(cu), 黄金(au)
大商所 (Dalian Commodity Exchange) DF 铁矿(i), 豆粕(m), 玉米(c)
郑商所 (Zhengzhou Commodity Exchange) ZF PTA(TA), 甲醇(MA), 苹果(AP)
能源中心 (Shanghai International Energy Exchange) INE 原油(sc), 20号胶(nr)

Q&A

Q: 为什么运行 ContextInfo.get_his_contract_list('IF') 返回的是空列表 []
A: 这通常是因为本地缺少过期合约的基础数据。请在 QMT 客户端的“数据管理”界面中,找到“过期合约列表”并进行下载补充。下载完成后重新运行策略即可获取数据。

Q: 获取到的过期合约列表包含当前正在交易的主力合约吗?
A: 不包含。get_his_contract_list 仅返回已经到期交割并退市的合约代码。如果需要获取当前正在交易的合约,通常需要结合 ContextInfo.get_instrumentdetail 或通过行情订阅接口来获取。

Q: 如何获取某个特定品种(如沪深300 IF)的所有历史合约,而不是整个市场的?
A: get_his_contract_list 返回的是整个市场的列表。你需要获取列表后进行过滤。例如,遍历返回的列表,判断合约代码是否以 "IF" 开头(例如 IF2206.IF)。

Q: 获取历史合约列表后,如何获取这些合约的历史K线数据?
A: 获取到合约代码(如 IF2001.IF)后,可以使用 ContextInfo.get_market_data_ex 接口,传入该合约代码、周期和起止时间来下载和读取该合约的历史行情数据。注意同样需要先在数据管理中下载对应的历史K线数据。