问题描述
参考的接口文档是:
XtQuant.XtData 行情模块.md
数据字典_行业数据.md
文档中关于相关接口的原文大意如下:
download_history_contracts():下载过期(退市)合约信息
过期(退市)标的列表可以通过 get_stock_list_in_sector 获取
过期板块名称可以通过:
print([i for i in xtdata.get_sector_list() if "过期" in i])
查看
我们按文档原示例做了测试,步骤如下:
from xtquant import xtdata
xtdata.connect()
print("开始 download_history_contracts...")
xtdata.download_history_contracts()
print("完成")
expired = [i for i in xtdata.get_sector_list() if "过期" in i]
print(f"含'过期'字样板块数:{len(expired)}")
print(expired[:10])
实际结果是:
xtdata.connect() 正常
xtdata.download_history_contracts() 能正常返回
但执行完后:
expired = [i for i in xtdata.get_sector_list() if "过期" in i]
返回结果仍然是 []
也就是说:
download_history_contracts() 已完成
但 get_sector_list() 中并没有出现文档示例所说的包含“过期”字样的板块名称
如果当前版本不再通过“过期”板块暴露,是否有新的标准方式获取退市/过期标的列表?
补充说明:
get_sector_list() 本身是可正常返回的,当前返回数量为 851
只是其中没有任何包含“过期”字样的分组名称
解决方案
针对您在获取过期(退市)合约时遇到的问题,在 QMT 平台的标准 Python API 中,获取指定市场过期合约列表的推荐方式是使用 ContextInfo.get_his_contract_list(market) 接口,而不是依赖于板块名称匹配。
标准获取过期合约接口
用法: ContextInfo.get_his_contract_list(market)
释义: 获取指定市场过期合约列表。
参数:
market: 市场代码,如'SH'(上交所),'SZ'(深交所),'SHO'(上交所期权),'SZO'(深交所期权),'IF'(中金所)等。
返回:
list: 期权/期货/股票等合约代码列表。
⚠️ 重要前提(注意事项)
获取过期合约前,需要手动在 QMT 客户端补充过期合约列表数据。 请在 QMT 客户端的【数据管理】中,勾选并下载对应的过期合约数据,否则接口可能返回空列表。
策略代码示例
#coding:gbk
def init(ContextInfo):
pass
def handlebar(ContextInfo):
# 仅在最后一根K线执行,避免重复打印
if not ContextInfo.is_last_bar():
return
# 获取中金所过期合约列表
if_expired = ContextInfo.get_his_contract_list('IF')
print('中金所过期合约数量:', len(if_expired))
print('中金所过期合约示例:', if_expired[:10])
# 获取上交所期权过期合约列表
sho_expired = ContextInfo.get_his_contract_list('SHO')
print('上交所期权过期合约数量:', len(sho_expired))
总结
如果您在独立版 xtquant 中通过 get_sector_list 找不到“过期”板块,建议切换到 QMT 内置策略环境中使用 ContextInfo.get_his_contract_list,或者确认您的 QMT 终端【数据管理】中是否已经成功下载了“过期合约”相关的数据包。