BLS 期权定价

BLS 期权定价 欧式期权 · 布莱克-斯科尔斯模型
根据标的价格、行权价、无风险利率、到期时间与波动率,计算欧式看涨/看跌期权的理论价格。
计算结果
点击「计算」查看输出
code 计算逻辑代码
以下为「ISDA国际通用」BLS 期权定价的 Python 代码示例(基于 QuantLib)。

# 依赖版本:
# python==3.9
# QuantLib==1.43
import math
import traceback
import QuantLib as ql


# ============================================================
# 核心计算函数(QuantLib BlackCalculator 口径)
# ============================================================
def _bls_price(S, K, r, T, sigma, q, option_type):
    """
    QuantLib BlackCalculator
    option_type: ql.Option.Call / ql.Option.Put
    """
    # Black 模型参数:
    #   forward  = S * e^{(r-q)T}   标的远期价格
    #   discount = e^{-rT}          到期支付折现因子
    #   stdDev   = sigma * sqrt(T)  远期价格对数标准差
    forward  = S * math.exp((r - q) * T)
    discount = math.exp(-r * T)
    stdDev   = sigma * math.sqrt(T)

    payoff = ql.PlainVanillaPayoff(option_type, K)
    bc = ql.BlackCalculator(payoff, forward, stdDev, discount)

    price = bc.value()
    delta = bc.delta(S)
    gamma = bc.gamma(S)
    vega  = bc.vega(T)
    theta = bc.theta(S, T)
    rho   = bc.rho(T)
    return price, delta, gamma, vega, theta, rho


def qjquant_calu_blsprice(
    price_var: float,
    strike_var: float,
    rate_var: float = 0.0,
    time_var: float = 1.0,
    volatility_var: float = 0.2,
    yieldVal_var: float = 0.0,
):
    try:
        S, K, r, T, sigma, q = (
            price_var, strike_var, rate_var,
            time_var, volatility_var, yieldVal_var,
        )
        # 参数校验
        if S <= 0 or K <= 0:
            return {"ok": False, "msg": "标的价和行权价必须大于 0"}
        if T <= 0:
            return {"ok": False, "msg": "到期时间必须大于 0"}
        if sigma <= 0:
            return {"ok": False, "msg": "波动率必须大于 0"}

        call_price, call_delta, call_gamma, call_vega, call_theta, call_rho = _bls_price(
            S, K, r, T, sigma, q, ql.Option.Call
        )
        put_price, put_delta, put_gamma, put_vega, put_theta, put_rho = _bls_price(
            S, K, r, T, sigma, q, ql.Option.Put
        )

        return {
            "ok": True,
            "inputs": {
                "price": S, "strike": K, "rate": r,
                "time": T, "volatility": sigma, "yield": q,
            },
            "call": {
                "price": round(call_price, 4),
                "delta": round(call_delta, 4),
                "gamma": round(call_gamma, 4),
                "vega":  round(call_vega, 4),
                "theta": round(call_theta, 4),
                "rho":   round(call_rho, 4),
            },
            "put": {
                "price": round(put_price, 4),
                "delta": round(put_delta, 4),
                "gamma": round(put_gamma, 4),
                "vega":  round(put_vega, 4),
                "theta": round(put_theta, 4),
                "rho":   round(put_rho, 4),
            },
        }
    except Exception as e:
        traceback.print_exc()
        return {"ok": False, "msg": f"计算失败: {e}"}


# ============================================================
# 示例:复制本文件后直接运行
# ============================================================
if __name__ == "__main__":
    print("=" * 60)
    print("示例 1:标准欧式期权(无股息,平值附近)")
    print("=" * 60)
    r1 = qjquant_calu_blsprice(
        price_var=100.0,
        strike_var=100.0,
        rate_var=0.05,
        time_var=1.0,
        volatility_var=0.2,
        yieldVal_var=0.0,
    )
    print(r1)

    print()
    print("=" * 60)
    print("示例 2:含股息率的欧式期权(半年期限)")
    print("=" * 60)
    r2 = qjquant_calu_blsprice(
        price_var=100.0,
        strike_var=95.0,
        rate_var=0.03,
        time_var=0.5,
        volatility_var=0.25,
        yieldVal_var=0.02,
    )
    print(r2)

    print()
    print("=" * 60)
    print("示例 3:深度实值看涨期权(高波动、长到期)")
    print("=" * 60)
    r3 = qjquant_calu_blsprice(
        price_var=120.0,
        strike_var=80.0,
        rate_var=0.04,
        time_var=2.0,
        volatility_var=0.3,
        yieldVal_var=0.01,
    )
    print(r3)

    print()
    print("=" * 60)
    print("示例 4:深度虚值看跌期权(低波动、短到期)")
    print("=" * 60)
    r4 = qjquant_calu_blsprice(
        price_var=100.0,
        strike_var=120.0,
        rate_var=0.02,
        time_var=0.25,
        volatility_var=0.15,
        yieldVal_var=0.0,
    )
    print(r4)