问题描述
1.过期合约列表已下载
2.用内置 python 可以获取的到列表
data = ContextInfo.get_option_list("159915.SZ",'20230603',"CALL", True)
print(data)
获取结果:【2024-11-03 16:47:03.641】 ['90002128.SZO', '90001453.SZO', '90001525.SZO', '90002125.SZO', '90001899.SZO', '90002216.SZO', '90001785.SZO', '90002123.SZO', '90001458.SZO', '90002130.SZO', '90001836.SZO', '90002277.SZO', '90001455.SZO', '90001460.SZO', '90002281.SZO', '90001461.SZO', '90001893.SZO', '90001454.SZO', '90001991.SZO', '90002211.SZO', '90001837.SZO', '90001509.SZO', '90001459.SZO', '90002131.SZO', '90002217.SZO', '90002124.SZO', '90002129.SZO', '90002218.SZO', '90001526.SZO', '90001833.SZO', '90002215.SZO', '90002126.SZO', '90001841.SZO', '90001835.SZO', '90002213.SZO', '90002279.SZO', '90001838.SZO', '90001456.SZO', '90001891.SZO', '90001981.SZO', '90001457.SZO', '90001507.SZO', '90002283.SZO', '90001839.SZO', '90001903.SZO', '90002005.SZO', '90002212.SZO', '90001834.SZO', '90001840.SZO', '90002127.SZO', '90002214.SZO', '90002101.SZO', '90002219.SZO', '90002183.SZO', '90001799.SZO']
3.用原生 python 获取为空
option_list = xtdata.get_option_list('159915.SZ', '20230603', 'CALL',True)
print(option_list)
感谢解答!
解决方案
在 miniQMT(原生 Python 环境)中使用 xtdata.get_option_list 获取历史期权列表为空,而在 QMT 内置 Python 中使用 ContextInfo.get_option_list 正常,通常是因为 miniQMT 本地基础数据(板块和合约信息)未同步或未下载。
QMT 内置 Python 直接运行在客户端进程中,可以直接读取客户端内存中的数据;而 miniQMT 的 xtdata 模块依赖于本地硬盘上的数据文件。如果本地数据文件没有更新,就会导致查询为空。
请按照以下步骤排查和解决:
1. 在代码中主动下载板块和基础数据
在调用 get_option_list 之前,必须确保 xtdata 已经下载了最新的板块和合约基础数据。请在你的原生 Python 代码开头添加以下下载代码:
from xtquant import xtdata
# 1. 下载基础的板块和合约数据(包含期权和过期合约信息)
xtdata.download_sector_data()
# 2. 再次尝试获取期权列表
option_list = xtdata.get_option_list('159915.SZ', '20230603', 'CALL', True)
print("获取到的期权列表:", option_list)
注:download_sector_data() 会从 QMT 客户端同步最新的合约列表到原生 Python 的数据目录下。
2. 检查 QMT 客户端的数据下载状态
虽然你提到已经下载了过期合约列表,但请确保:
- 在 QMT 客户端的 数据管理 -> 补充数据 中,不仅要勾选“过期合约”,还要确保勾选了对应的期权市场(如深交所期权 SZO、上交所期权 SHO)。
- 下载完成后,重启一次 QMT 客户端。有时候客户端下载完数据后,需要重启才能将数据完全刷入本地供
xtdata读取。
3. 检查参数格式
xtdata.get_option_list 的参数定义与 ContextInfo 基本一致,但请确保传入的日期格式正确。你传入的 '20230603' 是一个具体的交易日,isavailable=True 表示获取该日期当天可交易的期权。如果该日期是非交易日(例如周末),可能会返回空列表。2023年6月3日是星期六,非交易日,这可能是导致原生 Python 返回空的原因之一(内置 Python 可能做了容错处理,而 xtdata 校验更严格)。
建议测试一个明确的交易日,例如 2023年6月2日(周五):
option_list = xtdata.get_option_list('159915.SZ', '20230602', 'CALL', True)
print(option_list)
总结
绝大多数情况下,在 miniQMT 中遇到“内置能查到,原生查不到”的问题,都是因为缺少 xtdata.download_sector_data() 这一步。加上该函数并确保查询日期为有效交易日后,即可正常获取期权列表。