★ 代表實作
均值回归(布林带 + Z-Score)官方示例
python
以布林带宽度与价格 z-score 触发均值回归交易,含持仓周期限制与回测绩效统计。
實作程式碼 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}")
範例程式碼由使用者自行提供,網站不對其安全性與適用性負責。
💬 實作點評
🔵 登入 / 註冊