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

qmt 平台如何实现股票期权备兑开仓与平仓策略?(全流程源码)

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: qmt 期权备兑开仓策略:从证券锁定到备兑下单全流程

Question: 请帮我编写一个股票期权备兑开仓与备兑平仓的自动化策略

解决方案

QMT 期权备兑开仓与平仓自动化策略指南

在股票期权交易中,**备兑开仓(Covered Call)**是指在拥有标的股票持仓的基础上,卖出对应数量的认购期权(CALL),以获取期权权利金收入。利用 QMT 平台的 Python API,用户可以实现证券锁定、备兑开仓、备兑平仓以及证券解锁的全流程自动化。


一、期权备兑核心操作类型(opType)

根据 QMT 交易接口 passorder 的说明,期权交易涉及的核心 opType 参数如下:

  • 50:期权买入开仓
  • 51:期权卖出平仓
  • 52:期权卖出开仓
  • 53:期权买入平仓
  • 54:备兑开仓
  • 55:备兑平仓
  • 56:认购行权
  • 57:认沽行权
  • 58:证券锁定(将现货标的股票锁定为备兑证券)
  • 59:证券解锁(解除备兑锁定)

二、备兑策略标准全流程

  1. 标的持仓准备:持有或买入足额的期权标的股票(例如 510300.SH)。
  2. 证券锁定(opType=58):调用 passorder 将标的股票锁定,生成备兑持仓额度。
  3. 备兑开仓(opType=54):卖出认购期权合约,建立备兑卖空头寸。
  4. 备兑平仓(opType=55):平仓买入认购期权合约,解除期权义务。
  5. 证券解锁(opType=59):将锁定的标的股票解锁,恢复为普通自由持仓。

三、Python 策略完整源码

以下策略演示如何在 QMT 中完成从证券锁定 -> 备兑开仓以及满足条件后的备兑平仓 -> 证券解锁全流程:

#encoding:gbk
import time

def init(ContextInfo):
    # 1. 设定资金账号与交易标的
    ContextInfo.accID = '6000000058'
    ContextInfo.set_account(ContextInfo.accID)
    
    # 标的现货与期权代码示例
    ContextInfo.underlying = '510300.SH'      # 标的 ETF
    ContextInfo.option_code = '10003280.SHO'  # 对应认购期权合约
    
    # 设置全局状态标记
    ContextInfo.locked = False
    ContextInfo.covered_open = False

def handlebar(ContextInfo):
    # 确保只在最后一根 K 线运行最新逻辑
    if not ContextInfo.is_last_bar():
        return
        
    # 获取当前期权最新价格及相关数据
    opt_tick = ContextInfo.get_full_tick([ContextInfo.option_code])
    if ContextInfo.option_code not in opt_tick:
        return
    
    last_price = opt_tick[ContextInfo.option_code]['lastPrice']
    
    # ---------------- 流程 1:证券锁定 与 备兑开仓 ----------------
    if not ContextInfo.locked:
        # 锁定 10000 股 510300.SH 股票用于备兑(以最新价/指定价提交)
        print(f"开始执行证券锁定: {ContextInfo.underlying}")
        passorder(58, 1101, ContextInfo.accID, ContextInfo.underlying, 5, -1, 10000, 'CoveredCall', 1, ContextInfo)
        ContextInfo.locked = True
        
    elif ContextInfo.locked and not ContextInfo.covered_open:
        # 备兑开仓:卖出 1 张期权合约(对应 10000 股标的)
        print(f"开始执行备兑开仓: {ContextInfo.option_code}")
        passorder(54, 1101, ContextInfo.accID, ContextInfo.option_code, 5, -1, 1, 'CoveredCall', 1, ContextInfo)
        ContextInfo.covered_open = True
        
    # ---------------- 流程 2:备兑平仓 与 证券解锁 ----------------
    # 示例平仓条件:当期权价格降低至止盈目标(如 0.0010)时执行平仓解锁
    elif ContextInfo.covered_open and last_price <= 0.0010:
        print(f"触发平仓信号,当前期权价格: {last_price}")
        # 1. 备兑平仓(买入平仓期权合约)
        passorder(55, 1101, ContextInfo.accID, ContextInfo.option_code, 5, -1, 1, 'CoveredCall', 1, ContextInfo)
        
        # 2. 证券解锁(将锁定的标的解封)
        passorder(59, 1101, ContextInfo.accID, ContextInfo.underlying, 5, -1, 10000, 'CoveredCall', 1, ContextInfo)
        
        ContextInfo.covered_open = False
        ContextInfo.locked = False

四、注意事项与最佳实践

  1. 标的数量匹配:1 张期权合约通常对应 10000 股 ETF 标的,锁定股票数量必须满足期权合约乘数的整倍数Requirement。
  2. 状态主推结合:生产环境中,建议结合 order_callbackposition_callback 等实时回报函数判定委托是否完全成交,再驱动下一步订单,避免因未成交导致备兑开仓失败。
  3. QuickTrade 参数:在盘中实时触发下单时,可将 passorderquickTrade 参数设为 1,实现信号实时快速发出。