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

QMT平台如何获取期权合约单位(OptUnit)并计算备兑开仓所需标的股数?

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

问题描述

QMT 期权交易:利用 OptUnit 动态计算单笔申报所需的标的证券数量
如何在 QMT 中获取期权合约单位并计算备兑开仓所需的标的股数?

解决方案

QMT期权交易:利用 OptUnit 动态计算备兑开仓所需标的证券数量

在进行期权备兑开仓(Covered Call)交易时,投资者需要锁定足额的标的证券(通常为股票或ETF)作为担保。为了实现自动化、精准的仓位管理,我们需要在QMT中动态获取期权合约的合约单位(OptUnit),并根据计划申报的期权张数,计算出需要准备或锁定的标的证券数量。

本文将详细介绍如何使用 QMT Python API 中的 get_option_detail_data 接口获取 OptUnit,并给出完整的备兑开仓计算与下单示例。


1. 核心 API 接口介绍

1.1 获取期权详细信息:ContextInfo.get_option_detail_data()

QMT 提供了专门获取期权合约细节的接口,返回一个包含期权各项参数的字典(dict)。

  • 用法ContextInfo.get_option_detail_data(optioncode)
  • 关键返回值字段
    • OptUnit:期权合约单位(即一张期权合约对应多少股标的证券,通常为 10000 股)。
    • OptUndlCode:期权标的证券代码。
    • optType:期权类型('CALL' 或 'PUT')。
    • OptExercisePrice:期权行权价。

1.2 综合交易下单:passorder()

对于期权备兑开仓,passorder 的操作类型(opType)需设置为 54(备兑开仓)。


2. 动态计算与备兑开仓实现逻辑

备兑开仓所需的标的证券数量计算公式非常简单:
$$\text{所需标的股数} = \text{计划申报期权张数} \times \text{期权合约单位 (OptUnit)}$$

例如:计划买入/备兑开仓 5 张上证50ETF购1月3000期权(假设合约单位 OptUnit 为 10000),则需要锁定 $5 \times 10000 = 50000$ 股 50ETF 现货。


3. Python 策略源码示例

以下是一个完整的 QMT 策略示例,展示了如何在初始化时获取期权合约单位,并在 handlebar 中动态计算并执行备兑开仓:

#encoding:gbk
import time

def init(ContextInfo):
    # 设定交易账号(请替换为您的实际期权资金账号)
    ContextInfo.account_id = '12345678'
    ContextInfo.set_account(ContextInfo.account_id)
    
    # 定义需要操作的期权合约代码(以沪市期权为例)
    ContextInfo.option_code = '10003280.SHO'
    
    # 获取期权详细信息
    option_detail = ContextInfo.get_option_detail_data(ContextInfo.option_code)
    
    if option_detail:
        # 动态获取合约单位(OptUnit)与标的代码
        ContextInfo.opt_unit = option_detail.get('OptUnit', 10000) # 缺省默认为10000
        ContextInfo.underlying_code = option_detail.get('OptUndlCode', '')
        print(f"期权合约: {ContextInfo.option_code}")
        print(f"期权标的: {ContextInfo.underlying_code}")
        print(f"合约单位 (OptUnit): {ContextInfo.opt_unit}")
    else:
        print("获取期权详细信息失败,请检查合约代码是否正确或数据是否下载完整!")
        ContextInfo.opt_unit = None

def handlebar(ContextInfo):
    # 仅在最后一根Bar执行交易逻辑
    if not ContextInfo.is_last_bar():
        return
        
    if ContextInfo.opt_unit is None:
        return
        
    # 设定计划申报的期权张数
    target_option_volume = 5  # 计划开仓 5 张
    
    # 动态计算单笔申报所需的标的证券数量
    required_underlying_shares = target_option_volume * ContextInfo.opt_unit
    print(f"计划申报期权张数: {target_option_volume} 张")
    print(f"单笔申报所需标的证券数量: {required_underlying_shares} 股")
    
    # 获取当前标的持仓,确保有足额标的进行备兑(实际策略中可加入此风控逻辑)
    # positions = get_trade_detail_data(ContextInfo.account_id, 'STOCK_OPTION', 'POSITION')
    
    # 执行备兑开仓下单
    # opType=54 (备兑开仓), orderType=1101 (单股单账号股/手方式), prType=5 (最新价)
    passorder(54, 1101, ContextInfo.account_id, ContextInfo.option_code, 5, -1, target_option_volume, '备兑开仓策略', 1, ContextInfo)
    print("已发送备兑开仓委托指令。")

4. 注意事项

  1. 数据补充:在使用 get_option_detail_data 前,请确保已通过 QMT 客户端的“数据管理”功能补充了对应期权市场(如 SHO 上交所期权、SZO 深交所期权)的过期合约列表历史行情数据
  2. 标的足额:备兑开仓前,您的证券账户中必须已经持有足额的标的证券(如 50ETF 现货),否则柜台会因“标的不足”拒绝该笔备兑开仓申报。
  3. 账户类型passorder 中的 accountid 必须是开通了期权交易权限的资金账号,且账号类型需与期权市场匹配。