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

QMT 平台如何使用 bsm_iv 函数计算欧式期权隐含波动率?(附 Python 策略源码)

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

问题描述

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

Title: QMT 期权量化:使用 bsm_iv 计算欧式期权隐含波动率

Question: 在 QMT 中如何使用 bsm_iv 函数反推期权的隐含波动率?

解决方案

QMT 平台使用 bsm_iv 函数计算欧式期权隐含波动率

在期权量化交易中,**隐含波动率(Implied Volatility, IV)**是评估期权价格贵贱及市场风险预期的核心指标。QMT(迅投量化系统)提供了内置函数 ContextInfo.bsm_iv(),让开发者可以基于 Black-Scholes-Merton (BSM) 模型轻松反推期权的隐含波动率。


1. ContextInfo.bsm_iv 函数详解

1.1 函数语法与释义

ContextInfo.bsm_iv(optionType, objectPrices, strikePrice, optionPrice, riskFree, days, dividend)

该函数通过传入期权类型、标的价格、行权价、期权现价、无风险利率、剩余天数及标的分红率,反推出使 BSM 理论价等于期权现价的隐含波动率。

1.2 参数说明

参数名 类型 说明
optionType str 期权类型:'C' 代表认购期权(Call),'P' 代表认沽期权(Put)
objectPrices float 期权标的资产的当前价格
strikePrice float 期权的行权价格
optionPrice float 期权的当前市场价格(现价)
riskFree float 年化无风险收益率(如 0.03 表示 3%)
days int / float 到期剩余天数
dividend float 标的资产的年化分红率(可选/默认常填 0

1.3 返回值

  • 返回 double 类型的隐含波动率数值(例如返回 0.23 表示 23% 的隐含波动率)。如果参数非法,则返回 nan

2. 策略源码示例

以下是一个完整的 QMT 策略示例,演示如何在 handlebar 中获取期权的实时行情并计算其隐含波动率:

#coding:gbk

def init(ContextInfo):
    # 设定交易或监控的期权合约(以 50ETF 期权为例)
    ContextInfo.option_code = '10003280.SHO'
    # 设定标的资产代码
    ContextInfo.target_code = '510300.SH'
    # 订阅行情数据
    ContextInfo.set_universe([ContextInfo.option_code, ContextInfo.target_code])
    print("期权 IV 计算策略初始化完成")

def handlebar(ContextInfo):
    # 仅在最新 Bar 运行以提高效率
    if not ContextInfo.is_last_bar():
        return
    
    # 1. 获取期权详细信息(获取行权价、期权类型、到期日等)
    opt_detail = ContextInfo.get_option_detail_data(ContextInfo.option_code)
    if not opt_detail:
        print("未能获取到期权详情")
        return
        
    strike_price = opt_detail['OptExercisePrice']         # 行权价
    opt_type_str = opt_detail['optType']                  # 'CALL' 或 'PUT'
    opt_type = 'C' if opt_type_str == 'CALL' else 'P'
    
    # 2. 获取标的价格与期权现价
    target_tick = ContextInfo.get_full_tick([ContextInfo.target_code])
    option_tick = ContextInfo.get_full_tick([ContextInfo.option_code])
    
    target_price = target_tick[ContextInfo.target_code]['lastPrice']
    option_price = option_tick[ContextInfo.option_code]['lastPrice']
    
    # 3. 设置计算参数
    risk_free = 0.025   # 无风险利率 2.5%
    days = 15           # 假设距离到期日剩余 15 天
    dividend = 0.0      # 分红率 0%
    
    # 4. 调用 bsm_iv 计算隐含波动率
    iv = ContextInfo.bsm_iv(
        opt_type,
        target_price,
        strike_price,
        option_price,
        risk_free,
        days,
        dividend
    )
    
    print(f"期权代码: {ContextInfo.option_code}")
    print(f"标的价格: {target_price}, 行权价: {strike_price}, 期权现价: {option_price}")
    print(f"计算得到的隐含波动率 (IV): {iv:.4f}")

3. 注意事项

  1. 行情数据完整性:计算 IV 前需确保通过 get_full_tickget_market_data 成功获取到最新的标的价格与期权成交价/买卖盘价格。
  2. 深度虚值与深度实值期权:对于深度虚值或深度实值期权,因为交易不活跃或价格偏离,bsm_iv 可能计算出异常值或 nan,在策略中建议做好数值有效性校验。
  3. 历史与实时 IV 比较:可结合 ContextInfo.get_option_iv(optioncode) 获取行情服务器直接推送的实时波动率进行对比校验。