滚动Z分数:识别价格极值与回归机会的标准化工具
一、什么是“滚动Z分数”?
滚动Z分数(Rolling Z Score)是一种基于统计标准化的方法,用于衡量某一时点的价格相对于过去一段时间的均值的偏离程度。
它本质上回答的问题是:
当前价格高(或低)得是否“离谱”?
Z分数公式如下:
$$ Z = \frac{x_t - \mu_t}{\sigma_t} $$
其中:
- $x_t$:当前收盘价
- $\mu_t$:过去 N 日的滚动平均值
- $\sigma_t$:过去 N 日的滚动标准差
Z分数为正 → 高于均值 Z分数为负 → 低于均值 Z分数绝对值大 → 偏离显著(可能是极端值或转折点)
二、如何用 pandas_ta 实现?
pandas_ta
中调用方式非常简洁:
import pandas as pd
import pandas_ta as ta
df = pd.read_csv("price.csv")
df["ZSCORE"] = ta.zscore(df["close"], length=30, std=1)
length=30
:基于30日的滚动均值与标准差;std=1
:默认1个标准差作为归一化因子;- 返回值为
ZSCORE
列,是每个K线的标准分数。
三、图示与解读:Z分数的波动意义
我们可以这样绘图:
import matplotlib.pyplot as plt
df[["close", "ZSCORE"]].plot(subplots=True, figsize=(12, 6), title=["收盘价", "滚动Z分数"])
plt.axhline(y=2, color='r', linestyle='--')
plt.axhline(y=-2, color='g', linestyle='--')
plt.show()
图中:
- Z > 2:价格远高于均值(可能超买)
- Z < -2:价格远低于均值(可能超卖)
- Z ≈ 0:价格处于历史均值附近
这种标准化处理,使得不同股票、不同周期间的价格行为可以进行横向比较。
四、典型应用场景
✅ 均值回归策略
Z分数是布林带策略和配对交易的核心之一:
df["signal"] = 0
df.loc[df["ZSCORE"] > 2, "signal"] = -1 # 做空信号
df.loc[df["ZSCORE"] < -2, "signal"] = 1 # 做多信号
这类策略假设价格会向均值靠拢,而 Z 分数提供明确的进出场门槛。
✅ 情绪极端识别
在市场出现突发利好/利空时,价格会瞬间脱离均值,此时 Z 分数将迅速跳出 ±3 区间,投资者可识别是否属于“情绪驱动”。
✅ 风险预警系统
当 Z 分数波动过大时,代表市场波动性剧增,适合用作风控指标或仓位调节参考。
五、与布林带的异同
项目 | 滚动Z分数 | 布林带 |
---|---|---|
本质 | 标准化偏离度 | 价格的上下轨构建 |
输出 | 标准分数(可正可负) | 上轨、均线、下轨三条价格线 |
解读难度 | 略高,需要结合均值与分布形态 | 直观,常用于K线图叠加 |
比较优势 | 可做横向标准比较,多品种量化有利 | 更适合图形化趋势识别 |
六、实战策略:配对交易中的Z分数过滤
对于高度相关的两只股票(如中国平安 vs 中国太保),计算它们价格差的Z分数:
df["spread"] = df["close_stock1"] - df["close_stock2"]
df["zscore_spread"] = ta.zscore(df["spread"], length=20)
信号逻辑:
zscore_spread > 2
:价差偏离均值过多,可做空价差zscore_spread < -2
:价差偏离过低,可做多价差zscore_spread ≈ 0
:平仓点,均值回归完成
结语
滚动Z分数是一个既简单又强大的工具。它为我们提供了一个标准化尺度,使得我们能在纷繁复杂的市场数据中,捕捉“异常点”、识别“回归机会”、管理“风险暴露”。
在 pandas_ta
中通过一行代码调用 zscore()
函数,量化交易者便拥有了一把在不确定市场中识别偏离的利器。
不论你是构建交易信号系统、执行风控管理,还是做跨品种套利分析——滚动Z分数都是你不可或缺的数据基准线。