🚀 AI 一键生成 qmt 策略代码

为什么 QMT 原生 Python 中 get_market_data_ex 获取期权数据为空?

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

问题描述

刚开通行情vip。用这个get_market_data_ex取期权的数据为空值

{'10007803.SHO': Empty DataFrame
Columns: [open, high, low, close]
Index: []}

刚开通行情 vip。用这个 get_market_data_ex 取期权的数据,为什么还是空值呢?在内置的 python 可以查询到期权行情, 但是原生 python 期权一直是空值。

price = xtdata.get_market_data_ex(['open','high','low','close'], ["10007803.SHO"], start_time='', end_time='',period='1d')

解决方案

在 QMT 平台中,内置 Python 环境和原生 Python(通过 xtquant 库独立运行)在数据获取机制上存在差异。遇到 get_market_data_ex 返回空值(Empty DataFrame)的情况,通常是由以下原因引起的:

1. 原因分析

  • 数据存储机制:原生 Python(xtquant)的 get_market_data_ex 接口默认是从本地数据目录中读取数据的。如果本地没有该期权合约的历史数据,就会返回空值。
  • 内置环境差异:QMT 客户端内置的 Python 环境通常会共享客户端内存中的数据,或者客户端在后台自动进行了数据补充,因此能直接查到。
  • 期权数据未下载:期权合约数量庞大且生命周期短,客户端通常不会默认下载所有期权的历史数据。

2. 解决方法

在原生 Python 中获取数据前,必须先显式地下载或订阅数据

方法一:先下载历史数据(推荐用于获取历史 K 线)

在使用 get_market_data_ex 之前,调用 download_history_data 将数据下载到本地。

from xtquant import xtdata

stock_code = "10007803.SHO"
period = "1d"

# 1. 先下载历史数据到本地
print(f"开始下载 {stock_code} 的历史数据...")
xtdata.download_history_data(stock_code, period=period)
print("下载完成!")

# 2. 再次调用 get_market_data_ex 获取数据
price = xtdata.get_market_data_ex(
    ['open', 'high', 'low', 'close'], 
    [stock_code], 
    start_time='', 
    end_time='', 
    period=period
)

print(price)

方法二:订阅实时行情(推荐用于获取最新数据)

如果你需要的是最新的实时数据,可以使用 subscribe_quote 进行订阅,订阅后本地会持续接收并更新数据。

from xtquant import xtdata
import time

stock_code = "10007803.SHO"

# 1. 订阅行情数据
seq = xtdata.subscribe_quote(stock_code, period='1d', count=-1)

# 等待数据接收(稍微延迟一下确保数据落盘)
time.sleep(2)

# 2. 获取数据
price = xtdata.get_market_data_ex(
    ['open', 'high', 'low', 'close'], 
    [stock_code], 
    period='1d'
)

print(price)

3. 其他注意事项

  1. 合约是否过期:请确认 10007803.SHO 是否是已经退市的过期合约。如果是过期合约,可能需要通过特定的过期合约接口或在客户端的数据管理中勾选“包含过期合约”进行下载。
  2. 市场代码后缀:上交所期权后缀为 .SHO,深交所期权后缀为 .SZO,请确保后缀拼写正确。
  3. VIP 权限生效:刚开通 VIP 权限后,建议重启 QMT 客户端以及你的 Python 脚本,确保权限验证刷新。