實作程式碼 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}")
範例程式碼由使用者自行提供,網站不對其安全性與適用性負責。

💬 實作點評