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

QMT平台如何结合隐含波动率与BSM模型进行期权定价与套利?(附Python源码)

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

问题描述

qmt 期权套利:结合 get_option_iv 与 bsm_price 的波动率套利
qmt 怎么结合隐含波动率和 BSM 模型进行期权定价与套利?

解决方案

QMT期权套利:结合 get_option_iv 与 bsm_price 的波动率套利指南

在期权交易中,**波动率套利(Volatility Arbitrage)**是一种经典的量化交易策略。当期权的实时市场价格偏离了基于Black-Scholes-Merton (BSM) 模型计算出的理论价格时,就存在套利机会。QMT(Quantitative Trading System)平台提供了强大的期权分析接口,使得投资者可以轻松获取实时隐含波动率并计算理论定价。

本文将详细介绍如何结合QMT的 ContextInfo.get_option_iv()ContextInfo.bsm_price() 接口,构建一个期权波动率套利策略。


1. 核心API接口介绍

1.1 获取实时隐含波动率:get_option_iv

  • 用法ContextInfo.get_option_iv(optioncode)
  • 释义:获取股票期权的实时隐含波动率(IV)。
  • 参数optioncode(期权代码,如 '10003280.SHO')。
  • 返回double(隐含波动率数值)。

1.2 BSM模型理论定价:bsm_price

  • 用法ContextInfo.bsm_price(optionType, objectPrices, strikePrice, riskFree, sigma, days, dividend)
  • 释义:基于 BSM 模型,输入标的价格、行权价、无风险利率、波动率、剩余天数等,计算期权的理论价格。
  • 参数
    • optionType:期权类型,认购为 'C',认沽为 'P'
    • objectPrices:期权标的价格(可为单个价格或列表)。
    • strikePrice:期权行权价。
    • riskFree:无风险收益率(如 0.03 代表 3%)。
    • sigma:标的波动率(套利时可传入历史波动率或预测波动率)。
    • days:剩余天数。
    • dividend:分红率。

2. 波动率套利策略逻辑

  1. 获取实时数据:通过 get_full_tick 获取期权合约的最新市场价格(最新价、买卖价)以及标的证券的最新价格。
  2. 获取实时隐含波动率:使用 get_option_iv 获取当前期权的实时隐含波动率(市场IV)。
  3. 计算理论价格:使用 bsm_price 传入基准波动率(例如标的历史波动率 OptUndlHistoryRate 或无风险利率等),计算出期权的理论合理价格
  4. 套利机会识别
    • 期权被高估:若 市场最新价 > 理论价格 + 阈值,且市场IV显著高于历史波动率,说明期权价格偏高,可执行卖出开仓(Short Volatility)
    • 期权被低估:若 市场最新价 < 理论价格 - 阈值,且市场IV显著低于历史波动率,说明期权价格偏低,可执行买入开仓(Long Volatility)

3. QMT Python 策略源码示例

以下是一个在QMT中运行的期权波动率套利策略框架:

#encoding:gbk
import datetime

def init(ContextInfo):
    # 设定套利目标期权合约(以上证50ETF期权为例)
    ContextInfo.option_code = '10003280.SHO' 
    ContextInfo.set_universe([ContextInfo.option_code])
    
    # 获取期权详细信息以获取标的代码、行权价、到期日等
    detail = ContextInfo.get_option_detail_data(ContextInfo.option_code)
    ContextInfo.undl_code = detail['OptUndlCode'] + '.' + detail['OptUndlMarket'] # 标的代码
    ContextInfo.strike_price = detail['OptExercisePrice'] # 行权价
    ContextInfo.opt_type = 'C' if detail['optType'] == 'CALL' else 'P' # 期权类型
    
    # 获取到期日并计算剩余天数
    expire_date_str = str(detail['ExpireDate'])
    ContextInfo.expire_date = datetime.datetime.strptime(expire_date_str, '%Y%m%d')
    
    # 设定无风险利率与基准波动率(实际交易中可动态计算历史波动率)
    ContextInfo.risk_free = 0.03 # 3%
    ContextInfo.base_sigma = 0.20 # 假设基准历史波动率为20%
    ContextInfo.dividend = 0.0
    
    # 交易账号设置
    ContextInfo.account_id = 'YOUR_OPTION_ACCOUNT'
    ContextInfo.set_account(ContextInfo.account_id)

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return
        
    # 1. 计算剩余天数
    today = datetime.datetime.now()
    remaining_days = (ContextInfo.expire_date - today).days
    if remaining_days <= 0:
        print("期权已到期或今日到期,不进行套利")
        return
        
    # 2. 获取标的最新价格与期权最新市场价
    undl_tick = ContextInfo.get_full_tick([ContextInfo.undl_code])
    opt_tick = ContextInfo.get_full_tick([ContextInfo.option_code])
    
    if not undl_tick or not opt_tick:
        return
        
    undl_price = undl_tick[ContextInfo.undl_code]['lastPrice']
    opt_market_price = opt_tick[ContextInfo.option_code]['lastPrice']
    
    # 3. 获取期权实时隐含波动率(IV)
    realtime_iv = ContextInfo.get_option_iv(ContextInfo.option_code)
    
    # 4. 使用 BSM 模型计算理论价格
    theoretical_price = ContextInfo.bsm_price(
        ContextInfo.opt_type, 
        undl_price, 
        ContextInfo.strike_price, 
        ContextInfo.risk_free, 
        ContextInfo.base_sigma, 
        remaining_days, 
        ContextInfo.dividend
    )
    
    print(f"标的价: {undl_price:.4f} | 期权市价: {opt_market_price:.4f} | 理论价: {theoretical_price:.4f} | 实时IV: {realtime_iv:.4f}")
    
    # 5. 套利交易信号判定
    spread_threshold = 0.0050 # 套利价格偏差阈值
    
    # 偏离度过大且IV处于高位 -> 卖出高估期权
    if opt_market_price > (theoretical_price + spread_threshold) and realtime_iv > ContextInfo.base_sigma * 1.2:
        print("检测到期权价格高估,执行卖出开仓套利")
        # 52: 卖出开仓 (期权交易)
        passorder(52, 1101, ContextInfo.account_id, ContextInfo.option_code, 5, -1, 1, ContextInfo)
        
    # 偏离度过大且IV处于低位 -> 买入低估期权
    elif opt_market_price < (theoretical_price - spread_threshold) and realtime_iv < ContextInfo.base_sigma * 0.8:
        print("检测到期权价格低估,执行买入开仓套利")
        # 50: 买入开仓 (期权交易)
        passorder(50, 1101, ContextInfo.account_id, ContextInfo.option_code, 5, -1, 1, ContextInfo)

4. 策略注意事项

  1. Delta对冲:单纯的买卖期权会暴露在标的方向性风险(Delta)下。在实际的波动率套利中,通常需要根据期权的实时 Delta 值,在标的证券(如50ETF)上建立反向头寸进行 Delta中性对冲
  2. 交易成本:期权交易的手续费和滑点对套利利润影响极大,在设置 spread_threshold 阈值时,务必将双边交易成本计算在内。
  3. 到期日效应:临近到期的期权(如剩余天数小于5天),其时间价值衰减极快,且Gamma风险激增,建议避开临近到期合约。