3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 QMT 平台中,通过 get_market_data_ex 或其他历史数据接口获取股票期权行情数据失败,通常是由以下几个常见原因导致的。您可以按照以下步骤进行排查和解决:
QMT 平台对合约代码有严格的格式要求,必须是 合约代码.市场代码 的形式。对于股票期权:
.SHO(例如:10001506.SHO).SZO(例如:90000001.SZO)如果您只输入了数字代码,或者使用了错误的后缀(如 .SH 或 .SZ,这是股票的后缀),将无法获取到任何数据。
QMT 的历史数据接口(如 get_market_data_ex 在读取历史 K 线时)默认是从本地数据库读取的。如果您没有在客户端下载过该期权品种的数据,接口将返回空值。
期权合约有明确的到期日。如果您尝试获取的是已经退市的过期合约数据,但本地没有补充“过期合约”数据,也会导致获取失败。
ContextInfo.get_his_contract_list('SHO') 来获取上交所已过期的期权合约列表进行验证。在使用 get_market_data_ex 时,请检查您的参数设置是否合理:
period 参数是否正确(如 '1d', '1m' 等)。start_time 和 end_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 客户端的【数据管理】面板手动补充一次期权的历史数据和过期合约数据,通常即可解决该问题。