China Options Pricing

Other

Compute Black-Scholes option prices, implied volatility, Greeks (Delta/Gamma/Theta/Vega/Rho), and multi-leg strategy P&L for Chinese ETF options, index options, and commodity options. Uses pure math (no third-party libraries). Can chain with china-commodity-quotes for underlying price input.

Install

openclaw skills install china-options-pricing

China Options Pricing — 中国期权定价分析

Black-Scholes 期权定价、隐含波动率计算、希腊值分析、多腿策略盈亏计算。覆盖中国主流期权品种:ETF期权、股指期权、商品期权。

Quick Start — 快速上手

什么时候用虾哥的期权分析能力:

场景怎么做
想知道一张期权合约的理论价格用 BS 定价公式计算
市场报价隐含了多少波动率用 Newton-Raphson 反推 IV
持仓的风险敞口有多大计算 Delta / Gamma / Theta / Vega / Rho
组合策略(牛市价差/跨式/蝶式)的盈亏形态用策略分析功能
需要标的资产的实时价格先调 china-commodity-quotes 获取

核心公式速览 (Black-Scholes)

欧式认购期权 (Call): $$C = S_0 N(d_1) - K e^{-rT} N(d_2)$$

欧式认沽期权 (Put): $$P = K e^{-rT} N(-d_2) - S_0 N(-d_1)$$

其中: $$d_1 = \frac{\ln(S_0/K) + (r + \sigma^2/2)T}{\sigma\sqrt{T}}$$ $$d_2 = d_1 - \sigma\sqrt{T}$$

  • $S_0$ = 标的资产当前价格
  • $K$ = 行权价
  • $T$ = 剩余期限(年)
  • $r$ = 无风险利率
  • $\sigma$ = 波动率
  • $N(\cdot)$ = 标准正态累积分布函数

Core Capabilities

1. Black-Scholes 期权定价

用途: 给定标的价、行权价、到期时间、利率、波动率,计算认购/认沽期权理论价格。

标准正态分布 CDF 近似

使用 Abramowitz & Stegun 算法(误差 < 1.5×10⁻⁷),无需第三方库:

import math

def norm_cdf(x):
    """标准正态累积分布函数 — Abramowitz & Stegun 近似"""
    if x < -6:
        return 0.0
    if x > 6:
        return 1.0
    a1, a2, a3, a4, a5 = 0.254829592, -0.284496736, 1.421413741, -1.453152027, 1.061405429
    p = 0.3275911
    sign = 1.0 if x >= 0 else -1.0
    x_abs = abs(x)
    t = 1.0 / (1.0 + p * x_abs)
    y = 1.0 - (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t * math.exp(-x_abs * x_abs / 2)
    return y if sign > 0 else 1.0 - y

def norm_pdf(x):
    """标准正态概率密度函数"""
    return math.exp(-0.5 * x * x) / math.sqrt(2 * math.pi)

BS 定价实现

def d1_d2(S, K, T, r, sigma):
    """计算 d1 和 d2"""
    if T <= 0 or sigma <= 0:
        raise ValueError("T 和 sigma 必须为正数")
    d1 = (math.log(S / K) + (r + 0.5 * sigma * sigma) * T) / (sigma * math.sqrt(T))
    d2 = d1 - sigma * math.sqrt(T)
    return d1, d2

def bs_call_price(S, K, T, r, sigma):
    """欧式认购期权理论价格"""
    d1, d2 = d1_d2(S, K, T, r, sigma)
    return S * norm_cdf(d1) - K * math.exp(-r * T) * norm_cdf(d2)

def bs_put_price(S, K, T, r, sigma):
    """欧式认沽期权理论价格"""
    d1, d2 = d1_d2(S, K, T, r, sigma)
    return K * math.exp(-r * T) * norm_cdf(-d2) - S * norm_cdf(-d1)

执行示例

用户输入:
  S = 3.500  (上证50ETF 现价)
  K = 3.600  (行权价)
  T = 0.25   (3个月到期)
  r = 0.025  (无风险利率 2.5%)
  σ = 0.20   (波动率 20%)

输出:
  🦐 Black-Scholes 定价结果
  📌 标的: 上证50ETF | 认购 Call | 行权价 3.600
  📅 剩余期限: 0.25 年 (约91天)
  ─────────────────────────────────────
  💰 理论价格:  0.0552 (约 552 元/张)
  📊 内在价值:  0.0000 (价外)
  ⏳ 时间价值:  0.0552
  ✅ 价格状态:  看涨期权为价外 (OTM)
  ─────────────────────────────────────

中国期权合约单位:

期权类型合约单位权利金示例
ETF期权10,000份/张价格 0.0552 = 552元/张
股指期权每点100元价格 80.5 = 8,050元/张
商品期权同期货手数按品种而异

2. 隐含波动率 (Implied Volatility)

用途: 根据市场价格反推隐含的波动率水平。使用 Newton-Raphson 迭代。

实现

def implied_volatility_call(S, K, T, r, market_price, max_iter=100, tol=1e-6):
    """用 Newton-Raphson 反推认购期权的隐含波动率"""
    if T <= 0:
        return 0.0
    # 初始猜测
    sigma = 0.2
    for i in range(max_iter):
        d1, d2 = d1_d2(S, K, T, r, sigma)
        price = S * norm_cdf(d1) - K * math.exp(-r * T) * norm_cdf(d2)
        diff = price - market_price
        if abs(diff) < tol:
            return sigma
        # Vega = ∂price/∂σ
        vega = S * norm_pdf(d1) * math.sqrt(T)
        if vega < 1e-12:
            break
        sigma -= diff / vega
        if sigma <= 0:
            sigma = 0.01
    return round(sigma, 6)

def implied_volatility_put(S, K, T, r, market_price, max_iter=100, tol=1e-6):
    """用 Newton-Raphson 反推认沽期权的隐含波动率"""
    if T <= 0:
        return 0.0
    sigma = 0.2
    for i in range(max_iter):
        d1, d2 = d1_d2(S, K, T, r, sigma)
        price = K * math.exp(-r * T) * norm_cdf(-d2) - S * norm_cdf(-d1)
        diff = price - market_price
        if abs(diff) < tol:
            return sigma
        vega = S * norm_pdf(d1) * math.sqrt(T)
        if vega < 1e-12:
            break
        sigma -= diff / vega
        if sigma <= 0:
            sigma = 0.01
    return round(sigma, 6)

收敛条件: 最大 100 次迭代,精度 1×10⁻⁶。通常 5-15 次迭代即可收敛。

执行示例

用户输入:
  S = 3.500    (上证50ETF 现价)
  K = 3.600
  T = 0.25
  r = 0.025
  market_price = 0.0600 (市场权利金)

输出:
  🦐 隐含波动率计算
  📌 认购 Call @ 3.600 | 市价 0.0600
  ─────────────────────────────────────
  🔄 隐含波动率 σ_IV = 24.37%
  📊 BS 理论价 @ 24.37% = 0.0600 ✅
  ─────────────────────────────────────

3. 希腊值 (Greeks) 计算

用途: 量化期权价格对各风险因子的敏感度。

希腊值符号含义公式
DeltaΔ标的价每变动1元,期权价格变动多少Call: $N(d_1)$, Put: $-N(-d_1)$
GammaΓDelta对标的价的敏感度$\frac{N'(d_1)}{S_0 \sigma \sqrt{T}}$
ThetaΘ每过去1天,期权价格损失多少见代码
Vegaν波动率每变动1%,期权价格变动多少$S_0 N'(d_1) \sqrt{T}$
Rhoρ利率每变动1%,期权价格变动多少Call: $KTe^{-rT} N(d_2)$, Put: $-KTe^{-rT} N(-d_2)$

实现

def calculate_greeks(S, K, T, r, sigma, option_type='call'):
    """计算所有希腊值"""
    d1, d2 = d1_d2(S, K, T, r, sigma)
    sqrt_T = math.sqrt(T)

    # Delta
    if option_type == 'call':
        delta = norm_cdf(d1)
    else:
        delta = -norm_cdf(-d1)

    # Gamma (Call 和 Put 相同)
    gamma = norm_pdf(d1) / (S * sigma * sqrt_T)

    # Theta (年化 → 每日)
    term1 = -(S * norm_pdf(d1) * sigma) / (2 * sqrt_T)
    if option_type == 'call':
        theta_year = term1 - r * K * math.exp(-r * T) * norm_cdf(d2)
    else:
        theta_year = term1 + r * K * math.exp(-r * T) * norm_cdf(-d2)
    theta_daily = theta_year / 365

    # Vega (波动率每变动 1%)
    vega = S * norm_pdf(d1) * sqrt_T / 100  # 每变动1个百分点

    # Rho (利率每变动 1%)
    if option_type == 'call':
        rho = K * T * math.exp(-r * T) * norm_cdf(d2) / 100
    else:
        rho = -K * T * math.exp(-r * T) * norm_cdf(-d2) / 100

    return {
        'delta': round(delta, 4),
        'gamma': round(gamma, 4),
        'theta': round(theta_daily, 6),   # 每日时间价值损耗
        'vega':  round(vega, 6),          # 波动率+1%的敏感度
        'rho':   round(rho, 6)            # 利率+1%的敏感度
    }

希腊值解读表

Delta 值含义
0.50~0.70平值或轻度价内,标的波动敏感
0.20~0.40价外期权,方向性弱
>0.90深度价内,接近持有标的
Gamma 值含义
高 Gamma平值附近,Delta 变化快,适合 Gamma Scalping
低 Gamma深度价内/价外,Delta 稳定
Theta含义
负值时间损耗(期权卖方收益来源)
绝对值大平值附近到期前 Theta 最大

执行示例

用户输入:
  S = 3.500, K = 3.600, T = 0.25, r = 0.025, σ = 0.20

输出:
  🦐 希腊值分析 — 认购 Call
  ─────────────────────────────────────
  📌 标的: 50ETF @ 3.500 | 行权 3.600 | 剩余 91天
  ─────────────────────────────────────
  Δ Delta  =  0.3232  → 标的+1分,期权约+0.32分
  Γ Gamma  =  1.7286  → 每升1元,Delta增1.73
  Θ Theta  = -0.00052 → 每天损耗约5.2元/张
  ν Vega   =  0.00373 → 波动率+1%,期权+0.37分(37元/张)
  ρ Rho    =  0.00074 → 利率+1%,期权+0.07分(7.4元/张)
  ─────────────────────────────────────

4. 期权策略分析

用途: 分析常见期权组合策略的盈亏情况。

支持的策略

策略腿数适用场景
买入看涨 (Long Call)1强烈看涨,风险有限
买入看跌 (Long Put)1强烈看跌,风险有限
卖出看涨 (Short Call)1不看涨,收取权利金
卖出看跌 (Short Put)1不看跌,收取权利金
牛市价差 (Bull Spread)2温和看涨,降低权利金成本
熊市价差 (Bear Spread)2温和看跌,降低权利金成本
跨式组合 (Straddle)2预期剧烈波动(做多跨式)
宽跨式 (Strangle)2预期大幅波动,成本更低
蝶式价差 (Butterfly)4预期窄幅震荡,风险有限
备兑开仓 (Covered Call)2持有标的,增收权利金
保护性看跌 (Protective Put)2持有标的,买入保险

盈亏计算实现

def strategy_pnl(strategy, S_T, legs):
    """
    计算期权策略在到期时的盈亏
    strategy: 策略名称
    S_T: 到期标的价
    legs: 列表,每腿 = {type: 'call'/'put', position: 'long'/'short',
                         K: 行权价, premium: 权利金, multiplier: 合约乘数}
    """
    total = 0.0
    for leg in legs:
        if leg['type'] == 'call':
            intrinsic = max(S_T - leg['K'], 0)
        else:
            intrinsic = max(leg['K'] - S_T, 0)
        if leg['position'] == 'long':
            leg_pnl = (intrinsic - leg['premium']) * leg.get('multiplier', 1)
        else:
            leg_pnl = (leg['premium'] - intrinsic) * leg.get('multiplier', 1)
        total += leg_pnl
    return total

def analyze_strategy(strategy, legs, S_range=None):
    """
    分析策略在标的价范围内的盈亏
    返回盈亏表 + 关键指标(最大盈利/最大亏损/盈亏平衡点)
    """
    # ... 实现策略分析,返回盈亏表
    pass

执行示例

🦐 期权策略分析 — 牛市价差 (Bull Call Spread)
═════════════════════════════════════════
📌 标的: 上证50ETF (510050)
📅 到期: 2026-08-20 (剩余91天)

📋 策略构成:
  腿1: 买入 Call @ 3.500,权利金 0.0800
  腿2: 卖出 Call @ 3.700,权利金 0.0250
  净权利金支出: 0.0550 (550元/张)

📊 到期盈亏分析:
  S_T=3.400:  -550 元 🔴
  S_T=3.500:  -550 元 🔴 (盈亏平衡点下方)
  S_T=3.555:     0 元 ⚪ (盈亏平衡点)
  S_T=3.600:  +450 元 🟢
  S_T=3.700: +1450 元 🟢 (最大盈利)

📈 关键指标:
  最大盈利: 1,450 元/张
  最大亏损: -550 元/张
  盈亏平衡: 3.555
  盈亏比: 2.64 : 1

5. 中国期权品种参考

ETF期权(上证所/深交所)

品种代码合约单位上市交易所标的
上证50ETF期权51005010,000份上交所上证50ETF
沪深300ETF期权(沪)51030010,000份上交所华泰柏瑞沪深300ETF
沪深300ETF期权(深)15991910,000份深交所嘉实沪深300ETF
中证500ETF期权(沪)51050010,000份上交所南方中证500ETF
中证500ETF期权(深)15992210,000份深交所嘉实中证500ETF
科创50ETF期权58800010,000份上交所科创50ETF
创业板ETF期权15991510,000份深交所创业板ETF
中证1000ETF期权15984510,000份深交所中证1000ETF
深100ETF期权15990110,000份深交所深证100ETF
上证综指ETF期权51021010,000份上交所上证综合ETF

股指期权(中金所 CFFEX)

品种代码乘数上市日期
沪深300股指期权IO¥100/点2019-12-23
中证1000股指期权MO¥100/点2022-07-22
上证50股指期权HO¥100/点2022-12-19

商品期权(三大商品交易所)

交易所品种代码行权方式
大商所 DCE豆粕期权M美式
玉米期权C美式
铁矿石期权I美式
棕榈油期权P美式
豆油期权Y美式
液化气期权PG美式
塑料期权L美式
聚丙烯期权PP美式
PVC期权V美式
豆二期权B美式
玉米淀粉期权CS美式
乙二醇期权EG美式
苯乙烯期权EB美式
生猪期权LH美式
郑商所 ZCE白糖期权SR美式
棉花期权CF美式
PTA期权TA美式
甲醇期权MA美式
菜籽粕期权RM美式
菜籽油期权OI美式
动力煤期权ZC美式
纯碱期权SA美式
尿素期权UR美式
短纤期权PF美式
花生期权PK美式
对二甲苯期权PX美式
烧碱期权SH美式
玻璃期权FG美式
苹果期权AP美式
上期所 SHFE铜期权CU美式
黄金期权AU美式
铝期权AL美式
锌期权ZN美式
橡胶期权RU美式
螺纹钢期权RB美式
白银期权AG美式
丁二烯橡胶期权BR美式
氧化铝期权AO美式
铅期权PB美式
镍期权NI美式
锡期权SN美式
热轧卷板期权HC美式
天然橡胶期权RU美式
纸浆期权SP美式
广期所 GFEX工业硅期权SI美式
碳酸锂期权LC美式
国际能源中心 INE原油期权SC美式

重要提示: 中国商品期权多为 美式期权,可在到期前任意交易日行权,BS 模型仅作为近似参考,实际定价应考虑提前行权溢价。


6. 定价公式速查(纯数学实现)

所有公式均使用 math.log, math.exp, math.sqrt, math.pi不依赖任何第三方库

关键函数汇总

# ==============================
# 正态分布函数
# ==============================
def norm_cdf(x):
    """Abramowitz & Stegun 近似 (误差 < 1.5e-7)"""

def norm_pdf(x):
    """标准正态密度函数"""

# ==============================
# BS 核心函数
# ==============================
def d1_d2(S, K, T, r, sigma):
    """计算 d1, d2"""
    d1 = (log(S/K) + (r + sigma**2/2)*T) / (sigma*sqrt(T))
    d2 = d1 - sigma*sqrt(T)
    return d1, d2

def bs_call_price(S, K, T, r, sigma):
    """BS认购定价"""
    d1, d2 = d1_d2(S, K, T, r, sigma)
    return S*N(d1) - K*exp(-r*T)*N(d2)

def bs_put_price(S, K, T, r, sigma):
    """BS认沽定价"""
    d1, d2 = d1_d2(S, K, T, r, sigma)
    return K*exp(-r*T)*N(-d2) - S*N(-d1)

# ==============================
# 隐含波动率
# ==============================
def iv_call(S, K, T, r, mkt_price):
    """Newton-Raphson 反推 IV"""
def iv_put(S, K, T, r, mkt_price):
    """Newton-Raphson 反推 IV"""

# ==============================
# 希腊值
# ==============================
def calculate_greeks(S, K, T, r, sigma, type='call'):
    """返回 delta, gamma, theta, vega, rho"""

参数约定

参数默认值说明
无风险利率 $r$2.5% (0.025)参考 10Y 中国国债收益率
到期时间 $T$按日历日/365如91天 = 91/365 ≈ 0.25
波动率 $\sigma$20% (0.20)年化波动率
迭代精度1×10⁻⁶隐含波动率收敛条件
最大迭代100Newton-Raphson 上限

7. 在 Skilled Chain 中使用(结合 china-commodity-quotes)

典型工作流: 先查标的价 → 再算期权定价

步骤:

  1. china-commodity-quotes 获取标的资产实时价格
  2. 将获取到的价格作为 $S_0$ 代入 BS 定价
  3. 输出完整的期权分析结果

示例:上证50ETF期权分析

Step 1: 查标的价
  → 使用 china-commodity-quotes 获取 510050 最新价
  → 返回: S = 3.500

Step 2: 计算 Call @ 3.600, 剩余91天
  → 使用本 skill 的 BS 定价
  → 参数: S=3.500, K=3.600, T=0.25, r=0.025, σ=0.20
  → 结果: 理论价 0.0552

Step 3: 如果已有市价,反推隐含波动率
  → 市价 = 0.0600
  → IV = 24.37%

Notes & Caveats

  1. BS 模型局限性: 假设波动率恒定、利率恒定、无交易成本、标的连续交易。中国期权市场实际定价可能与 BS 模型存在偏差。

  2. 美式期权溢价: 中国商品期权多为美式期权,BS 模型计算的欧式价格低于美式理论价格(因提前行权权有额外价值)。对于深度价内的 ETF 期权(含股息),提前行权也可能发生。

  3. 股息调整: ETF 期权在除息日应调整 BS 模型:$S_0 \to S_0 - PV(D)$,其中 $PV(D)$ 为剩余期限内预期股息的现值。

  4. 波动率偏斜: 中国期权市场存在波动率微笑/偏斜现象,不同行权价的 IV 不同。分析时建议同时查多个行权价进行波动率曲线分析。

  5. 到期月份选择: 中国期权通常有当月、下月、下季月、隔季月四个到期月份,选择流动性最好的月份进行分析。

  6. 无风险利率: 默认 2.5% 为近似值。对于更精确的分析,可查询当日中国 10 年期国债收益率替代。

  7. 保证金计算(卖方): 本 skill 不直接计算期权卖方的保证金需求。实际交易中,卖方保证金按交易所标准单独计算,超出权利金收入。