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

QMT 平台如何利用 BSM 理论价函数数值微商法计算期权希腊字母 Delta、Gamma 与 Vega?

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

问题描述

QMT 期权进阶:基于 bsm_price 数值微商法计算 Delta、Gamma 与 Vega
QMT 的 BSM 公式只提供理论价,如何用 Python 代码通过数值法计算希腊字母?

解决方案

在期权量化交易中,希腊字母(Greeks)是进行风险管理、对冲和构建波动率交易策略的核心指标。虽然 QMT 平台内置了 ContextInfo.bsm_price 用于计算欧式期权的理论价格,但并未直接提供计算 Delta、Gamma、Vega 等希腊字母的 API。

我们可以利用数值微商法(有限差分法),通过对标的价格 $S$ 和波动率 $\sigma$ 施加微小的扰动 $\Delta S$ 和 $\Delta \sigma$,并调用 ContextInfo.bsm_price 计算扰动后的期权价格,从而近似求得希腊字母的一阶和二阶偏导数。

一、 数值微商法计算原理

  1. Delta ($\Delta$):期权价格对标的资产价格的一阶导数。
    $$\Delta = \frac{\partial C}{\partial S} \approx \frac{f(S + \Delta S) - f(S - \Delta S)}{2 \Delta S}$$
  2. Gamma ($\Gamma$):期权 Delta 对标的资产价格的一阶导数(即期权价格对标的价格的二阶导数)。
    $$\Gamma = \frac{\partial^2 C}{\partial S^2} \approx \frac{f(S + \Delta S) - 2f(S) + f(S - \Delta S)}{(\Delta S)^2}$$
  3. Vega ($\nu$):期权价格对标的资产波动率的一阶导数(通常标示为波动率变动 1% 时期权价格的变化)。
    $$\text{Vega} = \frac{\partial C}{\partial \sigma} \approx \frac{f(S, \sigma + \Delta \sigma) - f(S, \sigma - \Delta \sigma)}{2 \Delta \sigma} \times 0.01$$

二、 QMT Python 核心实现代码

以下是在 QMT 策略中计算希腊字母的完整 Python 函数实现:

#coding:gbk
import numpy as np

def calculate_greeks(ContextInfo, optionType, S, K, r, sigma, days, dividend=0.0):
    """
    使用数值微商法计算期权的 Delta, Gamma 和 Vega
    :param optionType: 'C' 认购, 'P' 认沽
    :param S: 标的资产当前价格
    :param K: 期权行权价
    :param r: 无风险利率 (例如 0.03)
    :param sigma: 标的年化波动率 (例如 0.23)
    :param days: 剩余天数
    :param dividend: 分红率
    """
    if days <= 0:
        return 0.0, 0.0, 0.0
        
    # 设定微小扰动量
    dS = 0.001 * S if S > 0 else 0.001
    dSigma = 0.0001
    
    # 1. 计算基础理论价
    p_base = ContextInfo.bsm_price(optionType, S, K, r, sigma, days, dividend)
    
    # 2. 标的价格扰动后的理论价
    p_S_plus = ContextInfo.bsm_price(optionType, S + dS, K, r, sigma, days, dividend)
    p_S_minus = ContextInfo.bsm_price(optionType, S - dS, K, r, sigma, days, dividend)
    
    # 3. 波动率扰动后的理论价
    p_vol_plus = ContextInfo.bsm_price(optionType, S, K, r, sigma + dSigma, days, dividend)
    p_vol_minus = ContextInfo.bsm_price(optionType, S, K, r, sigma - dSigma, days, dividend)
    
    # 4. 数值微分计算希腊字母
    delta = (p_S_plus - p_S_minus) / (2 * dS)
    gamma = (p_S_plus - 2 * p_base + p_S_minus) / (dS ** 2)
    # Vega 通常定义为波动率变动 1% (0.01) 对应的期权价格变化
    vega = ((p_vol_plus - p_vol_minus) / (2 * dSigma)) * 0.01
    
    return delta, gamma, vega

def init(ContextInfo):
    print("期权希腊字母数值计算初始化...")

def handlebar(ContextInfo):
    # 示例:计算标的价格为 3.5 元,行权价为 3.5 元,剩余 15 天,无风险利率 3%,波动率 23% 的平值认购期权希腊字母
    S = 3.51
    K = 3.5
    r = 0.03
    sigma = 0.23
    days = 15
    
    delta, gamma, vega = calculate_greeks(ContextInfo, 'C', S, K, r, sigma, days)
    
    print(f"标的价格: {S}, 行权价: {K}, 剩余天数: {days}")
    print(f"Delta: {delta:.4f}")
    print(f"Gamma: {gamma:.4f}")
    print(f"Vega (1%): {vega:.4f}")

三、 实践注意事项

  1. 扰动量选择:$\Delta S$ 和 $\Delta \sigma$ 的选择不宜过大(会导致截断误差增加)也不宜过小(会导致计算机浮点数舍入误差)。一般 $\Delta S$ 取标的价格的 $0.1%$,$\Delta \sigma$ 取 $0.01%$ 即可获得极高精度的近似值。
  2. 边界处理:当期权临近到期日(days 趋近于 0)时,数值微商法可能会因为价格不连续而产生数值不稳定,策略中需对 days <= 0 进行安全过滤。