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

qmt 平台如何下载历史期货数据?(附 Python 源码)

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

问题描述

下载历史期货数据

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

解决方案

在 qmt 平台上,如果您想获取已经过期的历史期货合约数据(例如 M2606.DF),或者获取期货主力连续合约的数据,可以通过以下方法实现:

1. 获取过期合约数据

对于已经退市的过期合约,直接使用 get_market_data() 可能会返回空,因为默认情况下系统可能没有加载这些过期合约的信息。您需要先获取过期合约列表,然后再请求数据。

步骤:

  1. 补充数据: 在 qmt 客户端的【数据管理】中,手动补充对应市场(如大商所 DF)的过期合约列表和历史行情数据。
  2. 获取过期合约列表: 使用 ContextInfo.get_his_contract_list(market) 获取指定市场的过期合约列表。
  3. 获取行情数据: 确认合约代码在列表中后,使用 ContextInfo.get_market_data_ex()ContextInfo.get_market_data() 获取历史数据。

示例代码:

#encoding:gbk
def init(ContextInfo):
    # 获取大商所过期合约列表
    his_contracts = ContextInfo.get_his_contract_list('DF')
    print("大商所过期合约数量:", len(his_contracts))
    
    target_contract = 'M2606.DF'
    if target_contract in his_contracts:
        print(f"找到过期合约: {target_contract}")
        # 设置股票池
        ContextInfo.set_universe([target_contract])
    else:
        print(f"未找到过期合约: {target_contract},请检查数据管理中是否已补充过期合约列表。")

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return
    
    target_contract = 'M2606.DF'
    # 获取历史日线数据
    data = ContextInfo.get_market_data_ex(
        fields=['open', 'high', 'low', 'close', 'volume'], 
        stock_code=[target_contract], 
        period='1d', 
        start_time='20250101', # 替换为实际的有效时间段
        end_time='20260630',
        subscribe=False # 获取历史数据不需要订阅
    )
    
    if target_contract in data and not data[target_contract].empty:
        print(f"{target_contract} 历史数据获取成功:")
        print(data[target_contract].head())
    else:
        print(f"未能获取到 {target_contract} 的历史数据,请确保已在数据管理中下载该合约的历史日线数据。")

2. 获取期货主力连续合约数据

如果您只需要分析该品种的历史走势,使用主力连续合约(主连)通常是更好的选择,因为主连拼接了不同时期主力合约的数据,避免了单个合约到期的问题。

在 qmt 中,主力连续合约的代码通常以品种代码加上 00 表示,例如豆粕的主连代码为 M00.DF(具体代码规则请参考 qmt 客户端行情界面的显示)。

示例代码:

#encoding:gbk
def init(ContextInfo):
    # 设置豆粕主连为股票池
    ContextInfo.set_universe(['M00.DF'])

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return
    
    main_contract = 'M00.DF'
    # 获取主连历史日线数据
    data = ContextInfo.get_market_data_ex(
        fields=['open', 'high', 'low', 'close', 'volume'], 
        stock_code=[main_contract], 
        period='1d', 
        start_time='20200101', 
        end_time='20231231',
        subscribe=False
    )
    
    if main_contract in data and not data[main_contract].empty:
        print(f"{main_contract} 主连历史数据获取成功:")
        print(data[main_contract].head())
    else:
        print(f"未能获取到 {main_contract} 的历史数据,请在数据管理中补充该主连的数据。")

总结与建议

  1. 数据补充是前提: 无论是过期合约还是主连合约,必须先在 qmt 客户端的【数据管理】中下载对应的历史数据,否则 API 无法凭空获取。
  2. 推荐使用 get_market_data_ex 相比于旧版的 get_market_dataget_market_data_ex 返回 pandas DataFrame 格式,更方便进行数据处理和分析。
  3. 主连 vs 具体合约: 如果是为了回测长期策略,建议使用主连合约(如 M00.DF);如果是为了复盘特定历史时期的特定合约表现,则需要先获取过期合约列表再请求数据。