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

QMT 平台下载历史期货过期合约与主连数据指南

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

问题描述

下载历史期货数据

我希望下载历史的期货数据,比如 M2606.DF,但是这个代码已经找不到了,用 get_market_data()返回结果是空。请问有没有办法下载历史的期货数据,或者期货主连也可以。

解决方案

在 QMT 平台中,如果您尝试使用 get_market_data() 获取已经退市的历史期货合约(过期合约)数据却返回为空,通常是因为本地没有补充该过期合约的历史数据。QMT 的 API 是基于本地数据进行查询的。

要获取历史期货数据或期货主连数据,您可以按照以下步骤操作:

一、 获取历史过期合约数据

1. 在客户端补充过期合约数据

首先,您必须在 QMT 客户端手动下载过期合约的数据:

  1. 打开 QMT 客户端,点击顶部菜单栏的 【数据管理】
  2. 在左侧选择 【补充数据】
  3. 在品种选择中,找到对应的期货市场(如大商所),并勾选 “包含过期合约”(如果有此选项)或者在过期合约列表中勾选您需要的品种。
  4. 选择需要的时间周期(如日线、1分钟线)和时间范围,点击下载。

2. 使用 API 获取过期合约列表及数据

补充数据后,您可以使用 ContextInfo.get_his_contract_list(market) 获取过期合约列表,然后使用 ContextInfo.get_market_data_ex() 获取数据。

#coding:gbk
def init(ContextInfo):
    # 获取大商所(DF)的过期合约列表
    his_contracts = ContextInfo.get_his_contract_list('DF')
    print("大商所过期合约示例:", his_contracts[:10])

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return
    
    # 假设您已经下载了 m2105.DF 的历史数据
    target_code = 'm2105.DF'
    
    # 使用 get_market_data_ex 获取历史数据
    data = ContextInfo.get_market_data_ex(
        fields=['open', 'high', 'low', 'close', 'volume'], 
        stock_code=[target_code], 
        period='1d', 
        start_time='20200101', 
        end_time='20210601'
    )
    
    if target_code in data and not data[target_code].empty:
        print(f"成功获取 {target_code} 历史数据:")
        print(data[target_code].head())
    else:
        print(f"未获取到 {target_code} 的数据,请检查数据管理中是否已下载该合约数据。")

二、 获取期货主连数据

如果您不需要特定月份的合约,而是希望使用期货主连(主力连续合约)进行回测或分析,QMT 提供了两种方式:

1. 直接使用主连代码

在 QMT 中,主连合约通常以 品种代码+00.市场代码 表示。例如,豆粕的主连代码是 m00.DF,沪深300股指期货主连是 IF00.IF。您同样需要在【数据管理】中下载这些主连代码的历史数据。

#coding:gbk
def init(ContextInfo):
    pass

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return
        
    # 豆粕主连代码
    main_code = 'm00.DF'
    
    data = ContextInfo.get_market_data_ex(
        fields=['close'], 
        stock_code=[main_code], 
        period='1d', 
        count=5
    )
    print("豆粕主连最新5天收盘价:")
    print(data[main_code])

2. 动态获取当前主力合约

如果您在实盘或模拟运行中,需要知道当前时刻的主力合约具体是哪一个月份,可以使用 ContextInfo.get_main_contract()

#coding:gbk
def init(ContextInfo):
    pass

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return
        
    # 获取当前豆粕的主力合约具体代码(如 m2401.DF)
    current_main = ContextInfo.get_main_contract('m.DF')
    print(f"当前豆粕主力合约为: {current_main}")

总结

  • 查不到数据的根本原因是本地未下载。请务必先通过 QMT 客户端的【数据管理】下载对应的过期合约或主连数据。
  • 推荐使用 get_market_data_ex 替代旧版的 get_market_data,前者返回标准的 pandas.DataFrame,更易于处理。