问题描述
解决方案
在 QMT (Quantitative Trading Platform) 中,查询某个 ETF(如 510050.SH)对应的所有期权合约,主要可以使用 ContextInfo.get_option_undl_data 接口。此外,如果你需要根据特定月份或到期日筛选,也可以使用 ContextInfo.get_option_list。
以下是具体的实现方案和代码示例。
核心接口说明
1. ContextInfo.get_option_undl_data(undl_code_ref)
这是获取指定标的(ETF)对应的期权合约列表最直接的方法。
- 参数:
undl_code_ref(string),期权标的代码,例如'510050.SH'。 - 返回值:
list,包含该标的对应的期权合约代码列表。
2. ContextInfo.get_option_list(undl_code, dedate, opttype, isavailable)
如果你需要获取特定月份到期,或者特定交易日可交易的期权列表,可以使用此函数。
- 参数:
undl_code: 标的代码。dedate: 日期字符串。格式为 "YYYYMM"(获取该月到期的合约)或 "YYYYMMDD"(获取该日交易的合约)。opttype: "CALL" (认购), "PUT" (认沽), 或 "" (全部)。isavailable:True(当前可用),False(包含历史)。
完整策略代码示例
以下代码展示了如何在策略初始化时查询 510050.SH (上证50ETF) 的所有关联期权合约。
# -*- coding: gbk -*-
def init(ContextInfo):
"""
策略初始化函数
"""
# 设定要查询的 ETF 标的代码 (例如:华夏上证50ETF)
etf_code = '510050.SH'
print(f"正在查询标的 {etf_code} 对应的期权合约...")
# --- 方法 1:获取该标的对应的所有期权合约列表 (推荐) ---
# get_option_undl_data 返回一个列表,包含该标的关联的期权代码
all_options = ContextInfo.get_option_undl_data(etf_code)
if all_options:
print(f"方法1 - 找到 {len(all_options)} 个关联期权合约。")
# 打印前 5 个合约作为示例
print(f"示例合约: {all_options[:5]}")
else:
print("方法1 - 未找到对应的期权合约。")
# --- 方法 2:获取特定月份到期的期权合约 (例如获取 2023年12月到期的合约) ---
# 注意:实际使用时请修改为未来的有效月份
target_month = '202312'
month_options = ContextInfo.get_option_list(etf_code, target_month, "", True)
if month_options:
print(f"方法2 - {target_month} 到期的合约共有 {len(month_options)} 个。")
else:
print(f"方法2 - 未找到 {target_month} 到期的合约 (可能已过期或未上市)。")
# --- 方法 3:获取当前交易日所有可交易的期权 ---
# 获取当前回测/运行时间
import time
current_date = time.strftime('%Y%m%d', time.localtime(time.time()))
# 如果是回测模式,建议使用 ContextInfo.get_bar_timetag 转换的时间
# 获取当日可交易的所有认购(CALL)合约
daily_calls = ContextInfo.get_option_list(etf_code, current_date, "CALL", True)
print(f"方法3 - {current_date} 当日可交易的认购合约共有 {len(daily_calls)} 个。")
def handlebar(ContextInfo):
"""
行情驱动函数
"""
# 此处不需要执行逻辑,仅演示查询
return
注意事项
- 数据下载:在进行回测或查询历史期权数据前,请确保在 QMT 客户端的【数据管理】中下载了对应的期权合约列表和期权行情数据。
- 标的代码格式:标的代码必须包含后缀,例如
'510050.SH'或'159919.SZ'。 - 返回值类型:
get_option_undl_data返回的是一个纯代码列表(如['10000001.SHO', '10000002.SHO', ...]),如果需要获取合约的详细信息(如行权价、到期日),需要进一步调用ContextInfo.get_instrumentdetail(option_code)。
Q&A
Q: get_option_undl_data 和 get_option_list 有什么区别?
A: get_option_undl_data 主要用于获取某个标的下挂载的所有期权合约代码,不区分到期日,适合获取全量列表。而 get_option_list 提供了筛选功能,可以根据到期月份、交易日期、认购/认沽类型以及是否上市来精确筛选合约。
Q: 查询到的期权代码后缀是什么?
A: 上交所期权的后缀通常为 .SHO (如 10002345.SHO),深交所期权的后缀通常为 .SZO。
Q: 如何获取查询到的期权合约的行权价?
A: 拿到期权代码后,可以使用 ContextInfo.get_instrumentdetail(option_code) 获取详细信息,返回的字典中 OptExercisePrice 字段即为行权价。
Q: 为什么查询结果为空?
A: 请检查:1. 标的代码是否正确(如 510050.SH);2. 是否在客户端下载了完整的“期权合约列表”数据;3. 该 ETF 是否确实存在对应的期权产品。