实现代码 python

# ===================================================================== # 量化策略流派 · 官方教学示例(均值回归 / Mean Reversion) # 策略:布林带 Z-Score 均值回归(超卖做多 / 超买卖空,回归中性平仓) # 说明:本代码为社区教学示例,由站点整理发布,仅供学习交流。 # 示例代码由站点提供,站点不对代码的安全性、合规性与收益 # 表现作任何明示或默示担保;据此交易风险自负。 # 依赖:numpy(pip install numpy) # 运行:python mean_reversion.py # ===================================================================== import numpy as np def gen_ou(n=1500, seed=7): """Ornstein-Uhlenbeck 过程:天然均值回归的价格路径。""" rng = np.random.default_rng(seed) theta, mu, sigma = 0.05, 100.0, 1.5 x = np.zeros(n) x[0] = mu for t in range(1, n): x[t] = x[t - 1] + theta * (mu - x[t - 1]) + sigma * rng.normal() return x def backtest(prices, w=20, entry=2.0, exit_z=0.5, cost=0.0005): n = len(prices) ma = np.full(n, np.nan) sd = np.full(n, np.nan) for i in range(w - 1, n): ma[i] = prices[i - w + 1:i + 1].mean() sd[i] = prices[i - w + 1:i + 1].std() z = (prices - ma) / sd pos = np.zeros(n) for t in range(w, n): if np.isnan(z[t]): continue if pos[t - 1] == 0: if z[t] < -entry: pos[t] = 1 elif z[t] > entry: pos[t] = -1 else: pos[t] = pos[t - 1] if abs(z[t]) > exit_z else 0 ret = np.zeros(n) for t in range(1, n): if pos[t - 1] != 0: r = pos[t - 1] * (prices[t] / prices[t - 1] - 1) if pos[t] != pos[t - 1]: r -= cost ret[t] = r eq = np.cumprod(1 + ret) sharpe = ret[1:].mean() / (ret[1:].std() + 1e-9) * np.sqrt(252) mdd = (eq - np.maximum.accumulate(eq)).min() trades = int(np.sum(pos[1:] != pos[:-1]) / 2) return dict(total=eq[-1] - 1, sharpe=sharpe, mdd=mdd, trades=trades) if __name__ == "__main__": px = gen_ou() m = backtest(px) print("均值回归(布林带 Z-Score)回测") print(f" 样本K线数 : {len(px)}") print(f" 累计收益 : {m['total'] * 100:8.1f}%") print(f" 年化夏普 : {m['sharpe']:8.2f}") print(f" 最大回撤 : {m['mdd'] * 100:8.1f}%") print(f" 交易次数 : {m['trades']:8d}")
示例代码由用户自行提供,网站不对其安全性与适用性负责。

💬 实现点评