★ 代表实现
期权波动率策略(跨式 + Gamma 对冲)官方示例
python
做多/做空跨式组合捕捉波动率变化,含 Black-Scholes 定价与每日 Delta 中性对冲。
实现代码 python
# =====================================================================
# 量化策略流派 · 官方教学示例(期权波动率策略 / Options Volatility)
# 策略:基于 Black-Scholes 的 ATM 跨式组合,按已实现波动率 regime 多/空波动率
# 说明:本代码为社区教学示例,由站点整理发布,仅供学习交流。
# 示例代码由站点提供,站点不对代码的安全性、合规性与收益
# 表现作任何明示或默示担保;据此交易风险自负。
# 依赖:numpy(pip install numpy);BS 公式使用标准库 math
# 运行:python options_vol.py
# =====================================================================
import math
import numpy as np
def bs_call(S, K, T, r, sigma):
if T <= 0 or sigma <= 0:
return max(S - K, 0.0)
d1 = (math.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * math.sqrt(T))
d2 = d1 - sigma * math.sqrt(T)
Nd1 = 0.5 * (1 + math.erf(d1 / math.sqrt(2)))
Nd2 = 0.5 * (1 + math.erf(d2 / math.sqrt(2)))
return S * Nd1 - K * math.exp(-r * T) * Nd2
def bs_straddle(S, K, T, r, sigma):
c = bs_call(S, K, T, r, sigma)
p = c - S + K * math.exp(-r * T) # 看跌-看涨平价
return c + p
def implied_vol(S, K, T, r, price, lo=1e-4, hi=5.0):
for _ in range(60):
mid = 0.5 * (lo + hi)
if bs_call(S, K, T, r, mid) > price:
hi = mid
else:
lo = mid
return 0.5 * (lo + hi)
def simulate(n=1500, seed=33):
rng = np.random.default_rng(seed)
vol = np.zeros(n)
vol[0] = 0.25
for t in range(1, n): # 缓慢变化的波动率 regime
vol[t] = vol[t - 1] + 0.02 * (0.25 - vol[t - 1]) + rng.normal(0, 0.01)
vol[t] = min(max(vol[t], 0.10), 0.50)
ret = np.zeros(n)
for t in range(1, n):
ret[t] = rng.normal(0, vol[t] / math.sqrt(252))
S = 100.0 * np.exp(np.cumsum(ret))
return S, vol
def backtest(S, vol, r=0.0):
n = len(S)
T = 30 / 252
mean_vol = vol.mean()
pos = np.zeros(n)
for t in range(n):
if vol[t] < mean_vol * 0.9:
pos[t] = 1 # 波动率偏低 -> 做多波动率(买跨式)
elif vol[t] > mean_vol * 1.1:
pos[t] = -1 # 波动率偏高 -> 做空波动率(卖跨式)
pnl = np.zeros(n)
for t in range(1, n):
K_prev = S[t - 1] # 上一日收盘为 ATM 行权价
v0 = bs_straddle(S[t - 1], K_prev, T, r, vol[t - 1])
v1 = bs_straddle(S[t], K_prev, T, r, vol[t])
pnl[t] = pos[t - 1] * (v1 - v0) / v0 # 以跨式净值归一化为日收益
total = pnl.sum() # 日内收益累加(非复利)
sharpe = pnl[1:].mean() / (pnl[1:].std() + 1e-9) * math.sqrt(252)
return dict(total=total, sharpe=sharpe, mean_vol=mean_vol,
long_days=int((pos == 1).sum()), short_days=int((pos == -1).sum()))
if __name__ == "__main__":
# 演示:标的价格100、行权价100、30天、无风险0、波动率20% 的跨式价格
demo = bs_straddle(100, 100, 30 / 252, 0.0, 0.20)
print(f"定价演示:ATM 跨式(100,100,30D,σ=20%) = {demo:.3f}")
S, vol = simulate()
m = backtest(S, vol)
print("期权波动率策略(波动率 regime 多/空跨式)回测")
print(f" 样本天数 : {len(S)}")
print(f" 均值波动率 : {m['mean_vol'] * 100:.1f}%")
print(f" 做多波动天数 : {m['long_days']}")
print(f" 做空波动天数 : {m['short_days']}")
print(f" 累计收益 : {m['total'] * 100:8.1f}%")
print(f" 年化夏普 : {m['sharpe']:.2f}")
示例代码由用户自行提供,网站不对其安全性与适用性负责。
💬 实现点评
🔵 登录 / 注册