问题描述
我在新建的策略文件中,通过 download_history_data 和 get_market_data_ex 方法下载和获取股票期权合约的行情数据时,总是没有取到任何数据,请问一下是什么原因呢?
解决方案
在 QMT 平台中,通过 get_market_data_ex 或其他历史数据接口获取股票期权行情数据失败,通常是由以下几个常见原因导致的。您可以按照以下步骤进行排查和解决:
1. 合约代码格式不正确(最常见)
QMT 平台对合约代码有严格的格式要求,必须是 合约代码.市场代码 的形式。对于股票期权:
- 上交所期权 的市场后缀为
.SHO(例如:10001506.SHO) - 深交所期权 的市场后缀为
.SZO(例如:90000001.SZO)
如果您只输入了数字代码,或者使用了错误的后缀(如 .SH 或 .SZ,这是股票的后缀),将无法获取到任何数据。
2. 本地未补充历史数据
QMT 的历史数据接口(如 get_market_data_ex 在读取历史 K 线时)默认是从本地数据库读取的。如果您没有在客户端下载过该期权品种的数据,接口将返回空值。
- 解决方法:打开 QMT 客户端,进入【数据管理】 -> 【补充数据】,勾选您需要的期权市场(上交所期权/深交所期权)以及对应的时间周期(如日线、分钟线),点击补充数据。等待下载完成后再运行策略。
3. 尝试获取的是已过期的期权合约
期权合约有明确的到期日。如果您尝试获取的是已经退市的过期合约数据,但本地没有补充“过期合约”数据,也会导致获取失败。
- 解决方法:在【数据管理】中,确保勾选并下载了“过期合约”的数据。您可以通过
ContextInfo.get_his_contract_list('SHO')来获取上交所已过期的期权合约列表进行验证。
4. 接口参数设置问题
在使用 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 客户端的【数据管理】面板手动补充一次期权的历史数据和过期合约数据,通常即可解决该问题。