Install
openclaw skills install china-options-pricingCompute 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.
openclaw skills install china-options-pricingBlack-Scholes 期权定价、隐含波动率计算、希腊值分析、多腿策略盈亏计算。覆盖中国主流期权品种:ETF期权、股指期权、商品期权。
什么时候用虾哥的期权分析能力:
| 场景 | 怎么做 |
|---|---|
| 想知道一张期权合约的理论价格 | 用 BS 定价公式计算 |
| 市场报价隐含了多少波动率 | 用 Newton-Raphson 反推 IV |
| 持仓的风险敞口有多大 | 计算 Delta / Gamma / Theta / Vega / Rho |
| 组合策略(牛市价差/跨式/蝶式)的盈亏形态 | 用策略分析功能 |
| 需要标的资产的实时价格 | 先调 china-commodity-quotes 获取 |
欧式认购期权 (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}$$
用途: 给定标的价、行权价、到期时间、利率、波动率,计算认购/认沽期权理论价格。
使用 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)
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元/张 |
| 商品期权 | 同期货手数 | 按品种而异 |
用途: 根据市场价格反推隐含的波动率水平。使用 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 ✅
─────────────────────────────────────
用途: 量化期权价格对各风险因子的敏感度。
| 希腊值 | 符号 | 含义 | 公式 |
|---|---|---|---|
| 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元/张)
─────────────────────────────────────
用途: 分析常见期权组合策略的盈亏情况。
| 策略 | 腿数 | 适用场景 |
|---|---|---|
| 买入看涨 (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
| 品种 | 代码 | 合约单位 | 上市交易所 | 标的 |
|---|---|---|---|---|
| 上证50ETF期权 | 510050 | 10,000份 | 上交所 | 上证50ETF |
| 沪深300ETF期权(沪) | 510300 | 10,000份 | 上交所 | 华泰柏瑞沪深300ETF |
| 沪深300ETF期权(深) | 159919 | 10,000份 | 深交所 | 嘉实沪深300ETF |
| 中证500ETF期权(沪) | 510500 | 10,000份 | 上交所 | 南方中证500ETF |
| 中证500ETF期权(深) | 159922 | 10,000份 | 深交所 | 嘉实中证500ETF |
| 科创50ETF期权 | 588000 | 10,000份 | 上交所 | 科创50ETF |
| 创业板ETF期权 | 159915 | 10,000份 | 深交所 | 创业板ETF |
| 中证1000ETF期权 | 159845 | 10,000份 | 深交所 | 中证1000ETF |
| 深100ETF期权 | 159901 | 10,000份 | 深交所 | 深证100ETF |
| 上证综指ETF期权 | 510210 | 10,000份 | 上交所 | 上证综合ETF |
| 品种 | 代码 | 乘数 | 上市日期 |
|---|---|---|---|
| 沪深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 模型仅作为近似参考,实际定价应考虑提前行权溢价。
所有公式均使用 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⁻⁶ | 隐含波动率收敛条件 |
| 最大迭代 | 100 | Newton-Raphson 上限 |
典型工作流: 先查标的价 → 再算期权定价
步骤:
china-commodity-quotes 获取标的资产实时价格示例:上证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%
BS 模型局限性: 假设波动率恒定、利率恒定、无交易成本、标的连续交易。中国期权市场实际定价可能与 BS 模型存在偏差。
美式期权溢价: 中国商品期权多为美式期权,BS 模型计算的欧式价格低于美式理论价格(因提前行权权有额外价值)。对于深度价内的 ETF 期权(含股息),提前行权也可能发生。
股息调整: ETF 期权在除息日应调整 BS 模型:$S_0 \to S_0 - PV(D)$,其中 $PV(D)$ 为剩余期限内预期股息的现值。
波动率偏斜: 中国期权市场存在波动率微笑/偏斜现象,不同行权价的 IV 不同。分析时建议同时查多个行权价进行波动率曲线分析。
到期月份选择: 中国期权通常有当月、下月、下季月、隔季月四个到期月份,选择流动性最好的月份进行分析。
无风险利率: 默认 2.5% 为近似值。对于更精确的分析,可查询当日中国 10 年期国债收益率替代。
保证金计算(卖方): 本 skill 不直接计算期权卖方的保证金需求。实际交易中,卖方保证金按交易所标准单独计算,超出权利金收入。