🚀 AI 一键生成 qmt 策略代码
立即体验

QMT平台如何动态获取期权链?get_option_list 函数使用详解与Python源码

qmt | 发布时间: 2026/8/9
以下内容由 EasyQuant 生成。

问题描述

qmt 期权开发指南:使用 get_option_list 动态获取期权链合约
如何在 qmt 中使用 get_option_list 函数根据标的和到期日筛选出符合条件的认购或认沽期权列表?

解决方案

QMT期权开发指南:使用 get_option_list 动态获取期权链合约

在期权量化交易中,动态获取期权链(Option Chain)是构建波动率套利、备兑开仓、跨式套利等策略的基础。国信证券 QMT 平台提供了强大的 ContextInfo.get_option_list() 接口,允许开发者根据标的物、到期日、期权类型等维度,动态筛选出符合条件的期权合约代码列表。


1. get_option_list 函数详解

1.1 函数原型

ContextInfo.get_option_list(undl_code, dedate, opttype, isavailable)

1.2 参数说明

  • undl_code (string): 期权标的代码。例如:'510300.SH'(沪深300ETF)或 '510050.SH'(上证50ETF)。
  • dedate (string): 期权到期月或具体交易日期。
    • 格式为 "YYYYMM"(如 '202101'):表示获取该到期月份的所有期权合约。
    • 格式为 "YYYYMMDD"(如 '20210104'):表示获取该交易日当天正在交易的期权合约。
  • opttype (string, 可选): 期权类型。默认值为空,表示同时获取认购和认沽期权。可选值:
    • 'CALL': 认购期权(看涨)
    • 'PUT': 认沽期权(看跌)
  • isavailable (bool, 可选): 是否仅返回当前可交易的合约。当 dedate 格式为 "YYYYMMDD" 时生效:
    • True: 仅返回当前可交易的活跃合约。
    • False: 返回当前和历史已退市的可用合约。

1.3 返回值

  • 返回一个 list 结构,内含符合条件的期权合约代码(如 ['10003280.SHO', '10003281.SHO', ...])。

注意:如果需要获取历史已过期的期权合约,请确保已在 QMT 客户端的“数据管理”中下载了对应的过期合约列表。


2. 核心使用示例

示例 1:获取指定到期月份的认购合约

# 获取到期月份为2021年1月的上交所510300ETF认购期权列表
call_options = ContextInfo.get_option_list('510300.SH', '202101', "CALL")
print("202101到期认购期权:", call_options)

示例 2:获取指定交易日当天可交易的认沽合约

# 获取2021年1月4日当天,上交所510300ETF所有可交易的认沽期权
put_options = ContextInfo.get_option_list('510300.SH', '20210104', "PUT", True)
print("20210104可交易认沽期权:", put_options)

3. QMT 完整策略源码示例

以下是一个完整的 QMT 策略框架,展示了如何在 handlebar 中动态获取期权链,并获取期权合约的详细信息(如行权价、到期日等):

#coding:gbk

def init(ContextInfo):
    # 设定标的物为 510300.SH
    ContextInfo.underlying = '510300.SH'
    # 设定目标到期月份
    ContextInfo.target_month = '202101'
    print("期权策略初始化成功!")

def handlebar(ContextInfo):
    # 仅在最后一根Bar执行,避免历史回测重复打印
    if not ContextInfo.is_last_bar():
        return
        
    # 1. 动态获取 2021年1月到期的所有认购期权 (CALL)
    call_list = ContextInfo.get_option_list(ContextInfo.underlying, ContextInfo.target_month, 'CALL')
    
    print(f"标的 {ContextInfo.underlying} 在 {ContextInfo.target_month} 到期的认购期权共 {len(call_list)} 只:")
    
    # 2. 循环遍历期权链,获取期权合约的详细行权信息
    for option_code in call_list[:5]: # 仅打印前5只作为示例
        detail = ContextInfo.get_option_detail_data(option_code)
        if detail:
            exercise_price = detail.get('OptExercisePrice', '未知') # 行权价
            expire_date = detail.get('ExpireDate', '未知')         # 到期日
            opt_type = detail.get('optType', '未知')               # 期权类型
            
            print(f"期权代码: {option_code} | 类型: {opt_type} | 行权价: {exercise_price} | 到期日: {expire_date}")

4. 常见问题与开发技巧

  1. 获取不到合约代码?
    请检查标的代码后缀是否正确(上交所期权为 .SHO,深交所期权为 .SZO)。同时,请确认本地是否补充了对应的历史期权行情数据与过期合约列表。
  2. 如何计算隐含波动率?
    获取到期权合约代码后,可以使用 ContextInfo.get_option_iv(optioncode) 动态获取实时隐含波动率,或者使用 ContextInfo.bsm_iv() 函数自行计算。