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

QMT平台如何自动识别期权到期日并一键触发认购行权?(附Python实盘源码)

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

问题描述

QMT 期权实盘:自动识别到期日并一键触发认购行权 API 教程
期权临近到期日时,如何用 QMT 自动判断并实现认购期权自动行权?

解决方案

QMT期权实盘:自动识别到期日并一键触发认购行权API教程

在期权交易中,临近到期日(Expiration Date)时,实值期权如果不及进行平仓或行权,将会面临价值归零的风险。QMT(Quantitative Trader)平台提供了完善的期权合约信息查询接口与交易接口。通过QMT Python API,我们可以实现自动监控持仓期权的到期日,并在到期日当天自动触发认购行权


一、 核心API接口介绍

要实现自动识别到期日并触发认购行权,我们需要使用以下两个核心API:

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

  • 用法ContextInfo.get_option_detail_data(optioncode)
  • 关键返回字段
    • ExpireDate:期权到期日(格式通常为 YYYYMMDD 的整型或字符串)。
    • optType:期权类型(CALL 代表认购,PUT 代表认沽)。
    • VolumeMultiple:合约乘数。

2. 综合交易下单接口:passorder()

  • 用法passorder(opType, orderType, accountid, orderCode, prType, modelprice, volume, ContextInfo)
  • 行权关键参数设置
    • opType:操作类型。56 代表认购行权57 代表认沽行权
    • orderType:下单方式。通常使用 1101(单股、单账号、普通、股/手方式下单)。
    • prType:选价类型。行权申报通常使用指定价 11 或最新价 5(具体根据柜台要求,行权一般填入行权价或标的价格)。

二、 自动行权策略逻辑设计

  1. 初始化:在 init 函数中设置期权交易账号,并定义需要监控的期权持仓代码。
  2. 获取当前时间:在 handlebar 中获取当前交易日。
  3. 到期日比对:通过 get_option_detail_data 获取期权的 ExpireDate,判断当前日期是否为到期日。
  4. 行权条件判定:如果是到期日,且该期权为认购期权(CALL),且处于实值状态(标的资产价格 > 行权价),则调用 passorder 触发 opType=56 的认购行权指令。

三、 Python 实盘自动行权源码示例

#coding:gbk
import datetime

def init(ContextInfo):
    # 1. 设定您的期权资金账号
    ContextInfo.account_id = "12345678" 
    ContextInfo.set_account(ContextInfo.account_id)
    
    # 2. 设定需要监控的期权合约池(例如上交所50ETF期权)
    ContextInfo.option_pool = ['10003280.SHO']
    ContextInfo.set_universe(ContextInfo.option_pool)
    
    print("QMT期权自动行权策略初始化成功!")

def handlebar(ContextInfo):
    # 获取当前K线的时间戳并转换为日期字符串 YYYYMMDD
    timetag = ContextInfo.get_bar_timetag(ContextInfo.barpos)
    current_date = timetag_to_datetime(timetag, '%Y%m%d')
    
    # 遍历监控的期权合约
    for option_code in ContextInfo.option_pool:
        # 获取期权详细信息
        opt_detail = ContextInfo.get_option_detail_data(option_code)
        if not opt_detail:
            continue
            
        expire_date = str(opt_detail['ExpireDate']) # 到期日 YYYYMMDD
        opt_type = opt_detail['optType']           # 期权类型 CALL/PUT
        strike_price = opt_detail['OptExercisePrice'] # 行权价
        undl_code = opt_detail['OptUndlCode'] + '.' + opt_detail['OptUndlMarket'] # 标的代码
        
        # 获取标的资产的最新价格
        full_tick = ContextInfo.get_full_tick([undl_code])
        if undl_code in full_tick:
            undl_price = full_tick[undl_code]['lastPrice']
        else:
            continue
            
        # 判断是否到了到期日当天
        if current_date == expire_date:
            print(f"合约 {option_code} 今日到期!当前标的价格: {undl_price}, 行权价: {strike_price}")
            
            # 认购期权自动行权逻辑:属于认购期权,且标的价格高于行权价(实值期权)
            if opt_type == 'CALL' and undl_price > strike_price:
                # 获取当前期权持仓数量
                position_info = get_trade_detail_data(ContextInfo.account_id, 'STOCK_OPTION', 'POSITION')
                opt_volume = 0
                for pos in position_info:
                    if pos.m_strInstrumentID == option_code.split('.')[0]:
                        opt_volume = pos.m_nCanUseVolume # 可用持仓量
                        break
                
                if opt_volume > 0:
                    print(f"检测到实值认购期权持仓 {opt_volume} 张,一键触发自动行权!")
                    # 调用 passorder 发送认购行权指令
                    # opType=56 (认购行权), orderType=1101 (单股单账号手方式), prType=11 (指定价/模型价)
                    passorder(56, 1101, ContextInfo.account_id, option_code, 11, strike_price, opt_volume, ContextInfo)
                else:
                    print(f"合约 {option_code} 为实值,但当前无可用持仓。")

四、 实盘注意事项

  1. 行权资金准备:认购期权行权意味着您需要按行权价买入标的证券。请确保您的期权账户或关联A股账户中有足够的足额现金以支付行权所需的购买资金,否则行权会因资金不足而失败。
  2. 行权时间窗口:期权行权申报通常只能在到期日当天的特定交易时间内进行(如15:00前),请确保策略运行时间覆盖此区间。
  3. 实盘测试:在正式实盘运行前,建议先在模拟盘或通过极小单量测试 passorder(56, ...) 接口的报单反馈,确保柜台支持该行权指令。