问题描述
{'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. 其他注意事项
- 合约是否过期:请确认
10007803.SHO是否是已经退市的过期合约。如果是过期合约,可能需要通过特定的过期合约接口或在客户端的数据管理中勾选“包含过期合约”进行下载。 - 市场代码后缀:上交所期权后缀为
.SHO,深交所期权后缀为.SZO,请确保后缀拼写正确。 - VIP 权限生效:刚开通 VIP 权限后,建议重启 QMT 客户端以及你的 Python 脚本,确保权限验证刷新。