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

QMT 平台如何利用 bsm_iv 函数计算期权隐含波动率?(附 Python 完整策略)

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

问题描述

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

Title: QMT 期权高阶:利用 bsm_iv 计算隐含波动率与期权希腊字母

Question: 请帮我编写一个通过 ContextInfo.bsm_iv 计算期权隐含波动率的 Python 策略脚本。

解决方案

QMT 期权高阶:利用 bsm_iv 计算隐含波动率

在期权交易与风险管理中,隐含波动率(Implied Volatility, IV) 是最核心的指标之一。QMT 平台提供了基于 Black-Scholes-Merton (BSM) 模型的内置函数 ContextInfo.bsm_iv(),让开发者能够非常高效地实时计算期权隐含波动率。


1. ContextInfo.bsm_iv 函数说明

接口定义与参数

ContextInfo.bsm_iv(optionType, objectPrices, strikePrice, optionPrice, riskFree, days, dividend)
  • optionType: 期权类型,'C' 表示认购期权(Call),'P' 表示认沽期权(Put)。
  • objectPrices: 期权标的资产当前价格(float)。
  • strikePrice: 期权行权价(float)。
  • optionPrice: 期权当前市场价格/现价(float)。
  • riskFree: 无风险年化利率(float,如 0.03 表示 3%)。
  • days: 期权到期剩余天数(int 或 float)。
  • dividend: 标的分红率(float,可缺省或填 0)。

2. 完整 Python 策略示例

以下策略展示了如何在 QMT 中获取期权实时行情、计算剩余天数,并通过 ContextInfo.bsm_iv 实时计算隐含波动率。

#coding:gbk
import time
import datetime

def init(ContextInfo):
    # 设定订阅的期权代码与标的代码
    ContextInfo.option_code = '10003280.SHO'  # 示例期权代码
    ContextInfo.target_code = '510300.SH'    # 标的 300ETF
    ContextInfo.set_universe([ContextInfo.option_code, ContextInfo.target_code])
    
    # 获取期权合约详细信息(如行权价、到期日、期权类型等)
    detail = ContextInfo.get_option_detail_data(ContextInfo.option_code)
    ContextInfo.strike_price = detail['OptExercisePrice']
    ContextInfo.expire_date = str(detail['ExpireDate'])  # 格式如 '20231225'
    ContextInfo.option_type = 'C' if detail['optType'] == 'CALL' else 'P'
    
    print(f"初始化期权: {ContextInfo.option_code}, 行权价: {ContextInfo.strike_price}, 类型: {ContextInfo.option_type}")

def handlebar(ContextInfo):
    if not ContextInfo.is_last_bar():
        return
        
    # 1. 获取标的与期权的最新价格
    target_tick = ContextInfo.get_full_tick([ContextInfo.target_code])
    option_tick = ContextInfo.get_full_tick([ContextInfo.option_code])
    
    if ContextInfo.target_code not in target_tick or ContextInfo.option_code not in option_tick:
        return
        
    target_price = target_tick[ContextInfo.target_code]['lastPrice']
    option_price = option_tick[ContextInfo.option_code]['lastPrice']
    
    # 2. 计算剩余天数
    today = datetime.datetime.now()
    expire_dt = datetime.datetime.strptime(ContextInfo.expire_date, '%Y%m%d')
    days = (expire_dt - today).days + 1
    if days <= 0:
        days = 0.5  # 避免到期日或负数计算异常
        
    # 3. 设置参数
    risk_free = 0.025  # 无风险利率 2.5%
    dividend = 0.0     # 股息率
    
    # 4. 调用 bsm_iv 计算隐含波动率
    iv = ContextInfo.bsm_iv(
        ContextInfo.option_type, 
        target_price, 
        ContextInfo.strike_price, 
        option_price, 
        risk_free, 
        days, 
        dividend
    )
    
    # 5. 输出或绘图
    print(f"[行情更新] 标的价格: {target_price:.4f}, 期权现价: {option_price:.4f}, 剩余天数: {days}天")
    print(f"计算所得隐含波动率 (IV): {iv * 100:.2f}%")
    
    # 在图表上画出隐含波动率曲线
    ContextInfo.paint('Implied_Volatility', iv * 100, -1, 0, 'red')

3. 使用注意事项

  1. 非法参数处理: 若输入的期权现价低于内涵价值(出现套利空间或报价异常),BSM 模型可能无解,此时函数会返回 nan,策略中需做好健壮性判断。
  2. 剩余天数精细度: days 参数支持浮点数,盘中交易时可以换算为更精准的 剩余小时/24
  3. 期权基础数据补充: 运行前需确保通过 QMT 客户端的“数据管理”补充了对应的期权合约与过期合约信息。