查看全课大纲(第 3 / 59 节)
  1. 1.量化投资必备基础知识
  2. 2.趋势型策略及模型原理
  3. 3.均值回复型策略及模型原理
  4. 4.配对交易策略及模型原理
  5. 5.量化策略研发流程与基本技能
  6. 6.常用的量化平台概述及如何选择
  7. 7.如何量化一个主观策略思路
  8. 8.常用技术指标及指标计算过程
  9. 9.如何编写指标代码
  10. 10.指标的物理意义
  11. 11.技术指标的应用技巧
  12. 12.更多的交易决策
  13. 13.编写程序去量化一个趋势型技术指标
  14. 14.编写趋势型技术指标的性能评价
  15. 15.策略对交易成本和持仓周期的影响
  16. 16.股票池策略的原理及基本框架
  17. 17.基于多因子分析的股票池设计与实现
  18. 18.股票池的性能评估
  19. 19.使用定制化财务因子构建股票池
  20. 20.趋势型策略原理及股票池机制的设计
  21. 21.趋势型择时信号的设计方法与编程实现
  22. 22.趋势型策略的回测与性能评估
  23. 23.优化趋势型策略的思路及方法
  24. 24.量化体系中的风险控制思想
  25. 25.风险的度量-波动率
  26. 26.常用的风险控制方法
  27. 27.实现止盈止损模块以提高策略性能
  28. 28.策略性能的评估与优化
  29. 29.探讨波动率与风险的关系
  30. 30.量化策略中的经典资金管理模型
  31. 31.用python编程实现资金管理模块
  32. 32.构建一个完善的量化交易策略
  33. 33.趋势型量化策略必备的期货知识
  34. 34.期货量化工具介绍
  35. 35.商品期货趋势型策略原理
  36. 36.用TB编写商品期货趋势型策略(上)
  37. 37.用TB编写商品期货趋势型策略(下)
  38. 38.分析优化商品期货趋势型策略的方法思路
  39. 39.期货交易策略的注意事项
  40. 40.均值回复型策略的原理
  41. 41.A股市场有没有稳定的均值回复效应?
  42. 42.编写一个均值回复型股票量化策略
  43. 43.编写多空组合策略进行策略改进
  44. 44.在策略中实现头寸管理进行策略优化
  45. 45.套利策略原理及常见套利类型
  46. 46.用MC开发一个跨品种套利交易策略(上)
  47. 47.用MC开发一个跨品种套利交易策略(下)
  48. 48.统计套利之股票配对交易策略
  49. 49.实盘中的细节问题:加减仓
  50. 50.关于高频交易
  51. 51.如何评价实盘量化策略的性能
  52. 52.量化系统的工作过程及研发流程
  53. 53.运气or实力
  54. 54.量化实盘交易需要满足什么条件
  55. 55.未来函数的坑
  56. 56.实盘数据接口异常的自动报警
  57. 57.交易系统的压力测试
  58. 58.自动运行的交易策略,什么时候需要人工干预
  59. 59.预案准备和实盘心理建设

均值回复型策略及模型原理

约 7 分钟

📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · 进阶量化交易实战:迭代式的量化策略研发 本讲义仅用于编程与量化方法教学,不构成任何投资建议。

在量化投资的二元哲学中,如果说趋势跟踪策略是”追随动量、让利润奔跑”的顺势利刃,那么均值回复策略(Mean Reversion)则是”物极必反、逢低吸纳”的逆势重盾。古人云”天下大势,分久必合,合久必分”,这种哲学在金融市场中体现为资产价格围绕其内在价值均线所呈现的钟摆式周期震荡。本讲深入剖析均值回复现象的行为金融学根源(过度反应与反应不足),建立基于 Z-Score 与奥恩斯坦-乌伦贝克(OU)过程的数学模型,并全方位对比趋势型与均值回复型策略的统计特征差异。


💡 核心导读

  • 均值回复现象的行为金融学根源:
    • 体育画报的厄运(Sports Illustrated Jinx):诺贝尔奖得主丹尼尔·卡尼曼指出,运动员登上封面代表当期表现达到了极值顶点,随后回归正常水平纯属统计学上的均值回归,而非玄学;
    • 过度反应(Overreaction):市场对突发利空(如情绪恐慌或推特舆情)产生非理性抛售,导致资产价格严重偏离其合理价值中枢,孕育了极佳的均值修复买点;
    • 反应不足(Underreaction):市场对高质量企业长期的低估值、高 ROE 与稳定分红反应迟钝,形成了长期的价值收敛回归红利。
  • 均值回复策略的统计特征与收益分布:
    • 胜率偏高(60% ~ 75%):大多数震荡行情中,价格偏离后均能较快回归中轨;
    • 盈亏比偏低(0.8:1 ~ 1.2:1):单笔盈利空间受限于均值中线,依靠高胜率积累净值;
    • 致命风险(Fat-Tail Risk):最怕遭遇单边暴跌大趋势(均值破位下移),必须设置极度严格的硬性止损以截断左侧逆势深套风险。
  • 均值回复核心数学模型:
    • Z-Score 偏离度度量: Zt=Pricet−μtσt=Closet−MAN(Closet)StdN(Closet)Z_t = \frac{Price_t - \mu_t}{\sigma_t} = \frac{Close_t - MA_N(Close_t)}{Std_N(Close_t)} 当 Zt<−2.0Z_t < -2.0 时代表价格进入统计学 95% 置信度之外的极度超跌区间,触发均值回复买入。
┌─────────────────────────────────────────────────────────────┐
│                    均值回复型策略 Z-Score 偏离与修复模型    │
└──────────────────────────────┬──────────────────────────────┘
                               │
 价格走势 (Price)               ▲
 ─── 上轨 +2.0σ ────────────────┼───────────▲ (超买做空/止盈) ────────────────
                                │          / \
 ─── 价值中轨 μ ────────────────┼─────────/───\─────────────▲ (回归平仓) ─────
                                │        /     \           /
 ─── 下轨 -2.0σ ────────────────┼───────/───────▼ (超卖买入) ─────────────────
                                │      /
 ───────────────────────────────┴─────/───────────────────────► (时间 t)

一、趋势型 vs 均值回复型策略全方位对比矩阵

特征维度趋势跟踪型策略 (Trend Following)均值回复型策略 (Mean Reversion)
底层假设价格具备动量延续性 (走势有惯性)价格具备中枢引力 (偏离必回归)
交易方向右侧交易 (追涨杀跌、顺势而为)左侧交易 (抄底逃顶、逆势布局)
胜率特征偏低 (35% ~ 45%)偏高 (60% ~ 75%)
盈亏比极高 (3:1 ~ 5:1 以上)偏低 (0.8:1 ~ 1.2:1)
最佳市场环境单边暴涨/暴跌大牛熊市宽幅箱体震荡市、无明确方向横盘市
风控核心保护利润,跟踪止盈防回撤硬性止损,严防单边趋势破位暴击

二、奥恩斯坦-乌伦贝克(OU)过程与半衰期(Half-Life)

在连续时间金融工程中,均值回复时序常用 OU 随机微分方程建模:

dxt=θ(μ−xt)dt+σdWtdx_t = \theta (\mu - x_t) dt + \sigma dW_t

其中 θ\theta 为均值回复速率。时序回归均值所需的半衰期(Half-Life) 为:

τ1/2=ln⁡(2)θ\tau_{1/2} = \frac{\ln(2)}{\theta}

若半衰期过长(如 τ>60\tau > 60 天),则资金占用成本过高,不适宜作为高频均值回复交易标的。

注意连续时间与离散回归两种口径的映射:下文代码对离散过程 Δxt=θ^xt−1+c\Delta x_t=\hat{\theta}x_{t-1}+c 做回归,斜率 θ^<0\hat{\theta}<0,它与连续时间回复速度 θ\theta(为正)相差一个时间尺度,即 θ=−θ^/Δt\theta=-\hat{\theta}/\Delta t(日线 Δt=1\Delta t=1)。离散递推为 xt+1=(1+θ^)xt+cx_{t+1}=(1+\hat{\theta})x_t+c,均值偏离按 (1+θ^)n(1+\hat{\theta})^n 衰减,令其衰减至一半可得离散口径的精确半衰期 τ1/2=−ln⁡2/ln⁡(1+θ^)\tau_{1/2}=-\ln 2/\ln(1+\hat{\theta});代码中的 −ln⁡2/θ^-\ln 2/\hat{\theta} 只是 ∣θ^∣|\hat{\theta}| 很小时由 ln⁡(1+θ^)≈θ^\ln(1+\hat{\theta})\approx\hat{\theta} 得到的一阶近似(例如 θ^=−0.15\hat{\theta}=-0.15 时精确值约 4.27 天、近似值约 4.62 天,偏差约 8%),要求精确时应改用精确式。

import pandas as pd
import numpy as np

def calculate_half_life(series):
    """
    计算时间序列的均值回复半衰期 (Half-life of Mean Reversion)
    离散时间口径精确公式:-np.log(2)/np.log(1+theta),其中 theta 为回归斜率。
    连续时间近似公式:-np.log(2)/theta (当 |theta| 较小时)。
    注意:theta 应为负值,表示向均值回复。
    """
    df = pd.DataFrame({'x': series})
    df['x_lag'] = df['x'].shift(1)
    df['delta_x'] = df['x'] - df['x_lag']
    df = df.dropna()
    
    # 线性回归 delta_x = theta_hat * x_lag + c
    theta = np.polyfit(df['x_lag'], df['delta_x'], 1)[0]
    
    # 精确离散半衰期
    if theta < 0:
        half_life = -np.log(2) / np.log(1 + theta)
    else:
        half_life = np.nan
    return half_life

# 合成一个均值回复序列(OU过程)用于演示
rng = np.random.default_rng(42)
n = 100
x = np.zeros(n)
x[0] = 0.0
theta_true = -0.1  # 真实的回复速度参数
for t in range(1, n):
    x[t] = x[t-1] + theta_true * x[t-1] + rng.normal(0, 0.5)

# 计算半衰期
hl = calculate_half_life(x)
print("===== 均值回复半衰期计算示例 =====")
print(f"合成序列长度: {len(x)}")
print(f"估计的回归斜率 theta: {np.polyfit(x[:-1], np.diff(x), 1)[0]:.6f}")
print(f"精确离散半衰期: {hl:.2f} 期")
print(f"连续时间近似半衰期: {-np.log(2)/np.polyfit(x[:-1], np.diff(x), 1)[0]:.2f} 期")
print("注:半衰期估计依赖历史数据稳定性,未来市场结构可能变化。")
===== 均值回复半衰期计算示例 =====
合成序列长度: 100
估计的回归斜率 theta: -0.112176
精确离散半衰期: 5.83 期
连续时间近似半衰期: 6.18 期
注:半衰期估计依赖历史数据稳定性,未来市场结构可能变化。

📝 动手练一练

下面我们用 Python 编写一段 基于 Z-Score 的均值回复策略模拟引擎,在 OU 过程合成的震荡行情中按 Z<−2.0Z < -2.0 超卖买入、回归中轴平仓,从持仓序列还原真实交易明细并统计胜率与盈亏:

import pandas as pd
import numpy as np

def run_mean_reversion_simulation():
    """
    均值回复型策略核心统计特征模拟(合成数据)。
    采用 Z-Score 偏离度逆势回归模型,验证高胜率、低盈亏比特征。
    风险提示:合成数据不代表真实市场,策略存在单边破位导致连续亏损的风险。
    """
    rng = np.random.default_rng(42)
    dates = pd.date_range("2023-01-01", periods=150, freq="B")
    
    # 模拟均值回归震荡走势 (OU 过程)
    p = [100.0]
    for _ in range(149):
        p_next = p[-1] + 0.15 * (100.0 - p[-1]) + rng.normal(0, 1.2)
        p.append(p_next)
        
    df = pd.DataFrame({'close': p}, index=dates)
    
    # 计算均线与标准差 (Z-Score)
    df['ma20'] = df['close'].rolling(20).mean()
    df['std20'] = df['close'].rolling(20).std()
    df['z_score'] = (df['close'] - df['ma20']) / (df['std20'] + 1e-6)
    
    # 交易逻辑: Z < -2.0 极度超卖做多,回归 Z >= 0 平仓
    df['signal'] = np.nan
    df.loc[df['z_score'] < -2.0, 'signal'] = 1
    df.loc[df['z_score'] >= 0, 'signal'] = 0
    df['position'] = df['signal'].ffill().fillna(0)
    
    # 收益测算
    df['pct_change'] = df['close'].pct_change()
    df['strat_ret'] = df['position'].shift(1) * df['pct_change']
    df['cum_ret'] = (1 + df['strat_ret'].fillna(0)).cumprod()
    
    # 从持仓序列还原真实交易明细
    pos = df['position'].values
    closes = df['close'].values
    trade_returns = []
    entry_price = None
    for i in range(1, len(df)):
        if pos[i] == 1 and pos[i - 1] == 0:
            entry_price = closes[i]
        elif pos[i] == 0 and pos[i - 1] == 1 and entry_price is not None:
            trade_returns.append(closes[i] / entry_price - 1.0)
            entry_price = None
    if entry_price is not None:
        trade_returns.append(closes[-1] / entry_price - 1.0)
    
    total_trades = len(trade_returns)
    wins = [r for r in trade_returns if r > 0]
    losses = [r for r in trade_returns if r <= 0]
    win_rate = len(wins) / total_trades if total_trades > 0 else 0.0
    avg_win = float(np.mean(wins)) if wins else 0.0
    avg_loss = float(np.mean(losses)) if losses else 0.0
    profit_loss_ratio = f"{avg_win / abs(avg_loss):.2f} : 1" if avg_loss < 0 else "N/A"
    
    res = {
        "Total_Trades": total_trades,
        "Win_Rate": f"{win_rate * 100:.1f}%",
        "Avg_Win": f"{avg_win * 100:.2f}%",
        "Avg_Loss": f"{avg_loss * 100:.2f}%" if avg_loss < 0 else "N/A",
        "Profit_Loss_Ratio": profit_loss_ratio,
        "Benchmark_Return": f"{(df['close'].iloc[-1]/df['close'].iloc[0] - 1)*100:.2f}%",
        "Strategy_Return": f"{(df['cum_ret'].iloc[-1] - 1)*100:.2f}%"
    }
    return res, df

# 执行模拟并打印结果
results, sim_df = run_mean_reversion_simulation()
print("================ 均值回复型策略收益特征模拟 ================")
for k, v in results.items():
    print(f"  - {k:<20}: {v}")
print("------------------------------------------------------------")
print("策略逻辑:Z-Score < -2.0 做多,>= 0 平仓。")
print(f"触发次数:{(sim_df['position'].diff() == 1).sum()} 次")
print("风险提示:高胜率策略依赖严格止损,合成数据存在前视偏差。")
print("============================================================")

运行结果输出:

================ 均值回复型策略收益特征模拟 ================
  - Total_Trades        : 3
  - Win_Rate            : 100.0%
  - Avg_Win             : 2.41%
  - Avg_Loss            : N/A
  - Profit_Loss_Ratio   : N/A
  - Benchmark_Return    : -0.23%
  - Strategy_Return     : 7.41%
------------------------------------------------------------
策略逻辑:Z-Score < -2.0 做多,>= 0 平仓。
触发次数:3 次
风险提示:高胜率策略依赖严格止损,合成数据存在前视偏差。
============================================================

📖 结果解读:Z<−2.0Z < -2.0 的严格阈值在本次合成行情中触发 3 笔交易,胜率 100%(平均单笔 +2.41%),策略收益 7.41% 跑赢基准 -0.23%——体现了均值回复”少而精、高胜率”的特征。但 3 笔样本同样不具统计意义;且单笔盈利空间(约 2.4%)有限,正是”高胜率、低盈亏比”收益分布的真实写照。实盘中还必须警惕肥尾破位风险:一旦价格单边下移不回中轴,逆势多单将被深套,硬性止损不可或缺。


👉 点击查看解析

本练习围绕均值回复模型,核心是计算价格或价差相对历史均值的偏离程度(如 z-score),当偏离超出阈值时反向开仓、回归均值时平仓。代码演示的关键结论是:该策略在震荡市中能捕捉回归收益,但在强趋势中需设置止损以防均值回复失效。

本章小结

  1. 领悟钟摆回归力量:市场对突发事件的过度反应为均值修复策略提供了肥沃土壤。
  2. 警惕肥尾单边风险:均值回复的致命死穴是趋势破位,必须将硬性止损线作为最高优先级系统规则。
  3. 构建策略互补组合:均值回复与趋势跟踪天然具备收益低相关性,是构建全天候组合的理想搭档。

📋 行动清单 (Action Checklist)

  • 运行本讲 Z-Score 均值回复代码,观察震荡行情下高胜率的累积过程;
  • 计算自己关注品种的价差半衰期(Half-Life),筛选出半衰期小于 15 天的优质震荡标的;
  • 预习下一节,探讨将均值回复推向极致的经典策略——统计套利与配对交易(Pairs Trading)。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第1章课件:实战量化投资必备基础知识
    PDF · 4.5MB
    下载