🚀 AI 一键生成 qmt 策略代码

QMT平台获取不到股票期权行情数据怎么办?

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

问题描述

无法获取股票期权行情数据

我在新建的策略文件中,通过 download_history_data 和 get_market_data_ex 方法下载和获取股票期权合约的行情数据时,总是没有取到任何数据,请问一下是什么原因呢?

解决方案

在 QMT 平台中,通过 get_market_data_ex 或其他历史数据接口获取股票期权行情数据失败,通常是由以下几个常见原因导致的。您可以按照以下步骤进行排查和解决:

1. 合约代码格式不正确(最常见)

QMT 平台对合约代码有严格的格式要求,必须是 合约代码.市场代码 的形式。对于股票期权:

  • 上交所期权 的市场后缀为 .SHO(例如:10001506.SHO
  • 深交所期权 的市场后缀为 .SZO(例如:90000001.SZO

如果您只输入了数字代码,或者使用了错误的后缀(如 .SH.SZ,这是股票的后缀),将无法获取到任何数据。

2. 本地未补充历史数据

QMT 的历史数据接口(如 get_market_data_ex 在读取历史 K 线时)默认是从本地数据库读取的。如果您没有在客户端下载过该期权品种的数据,接口将返回空值。

  • 解决方法:打开 QMT 客户端,进入【数据管理】 -> 【补充数据】,勾选您需要的期权市场(上交所期权/深交所期权)以及对应的时间周期(如日线、分钟线),点击补充数据。等待下载完成后再运行策略。

3. 尝试获取的是已过期的期权合约

期权合约有明确的到期日。如果您尝试获取的是已经退市的过期合约数据,但本地没有补充“过期合约”数据,也会导致获取失败。

  • 解决方法:在【数据管理】中,确保勾选并下载了“过期合约”的数据。您可以通过 ContextInfo.get_his_contract_list('SHO') 来获取上交所已过期的期权合约列表进行验证。

4. 接口参数设置问题

在使用 get_market_data_ex 时,请检查您的参数设置是否合理:

  • period 参数是否正确(如 '1d', '1m' 等)。
  • start_timeend_time 的格式是否正确(如 '20230101'),且该时间段内该期权合约是否已经上市。

正确的获取示例代码

#coding:gbk

def init(ContextInfo):
    # 设置需要获取的期权合约,注意后缀是 .SHO 或 .SZO
    ContextInfo.opt_code = '10003280.SHO' 

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return
    
    # 获取期权日线数据
    data = ContextInfo.get_market_data_ex(
        fields=['open', 'high', 'low', 'close', 'volume'], 
        stock_code=[ContextInfo.opt_code], 
        period='1d',
        start_time='20230101', 
        end_time='', 
        count=-1,
        dividend_type='none', # 期权通常不复权
        subscribe=True
    )
    
    if ContextInfo.opt_code in data and not data[ContextInfo.opt_code].empty:
        print(f"成功获取到 {ContextInfo.opt_code} 的数据:\n", data[ContextInfo.opt_code].tail())
    else:
        print(f"未获取到 {ContextInfo.opt_code} 的数据,请检查代码后缀或是否已补充本地数据。")

总结建议:首先检查您的代码后缀是否为 .SHO.SZO,然后务必前往 QMT 客户端的【数据管理】面板手动补充一次期权的历史数据和过期合约数据,通常即可解决该问题。