🚀 AI 一键生成 qmt 策略代码

QMT 期权开发:如何根据标的 ETF 获取对应的期权合约列表?

qmt | 发布时间: 2025/12/20
以下内容由 EasyQuant 生成。

问题描述

如何根据 ETF 代码查询它对应的所有期权合约?

解决方案

在 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

注意事项

  1. 数据下载:在进行回测或查询历史期权数据前,请确保在 QMT 客户端的【数据管理】中下载了对应的期权合约列表期权行情数据
  2. 标的代码格式:标的代码必须包含后缀,例如 '510050.SH''159919.SZ'
  3. 返回值类型get_option_undl_data 返回的是一个纯代码列表(如 ['10000001.SHO', '10000002.SHO', ...]),如果需要获取合约的详细信息(如行权价、到期日),需要进一步调用 ContextInfo.get_instrumentdetail(option_code)

Q&A

Q: get_option_undl_dataget_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 是否确实存在对应的期权产品。