4. 时间序列异常检测基础方法实战
行情时间序列的异常点识别,核心难点不在“算一个分数”,而在于分布形态与检测假设是否匹配。价格序列常出现尖峰脉冲(如瞬时错价、单笔异常成交),成交量序列则普遍呈现右偏厚尾(少数时段成交量远高于常态)。同一套阈值规则,在近似正态的收益率上可能表现良好,直接套到原始成交量上却会大量误报。本节围绕滚动统计、Z-score、MAD、IQR 四类基础方法,给出可复现的计算过程与适用性判断。
一、先明确检测对象与参照系
实战中不建议直接对原始价格做统计检测,因为价格存在趋势与量纲漂移,均值与标准差随时间变化,滚动窗口内的“正常”会被趋势吞掉。更稳妥的做法是先做变换:
- 价格类:取对数收益率
r_t = ln(P_t / P_{t-1}),或对价格做一阶差分;检测目标是“跳变”而非“价位高低”。 - 成交量类:先取对数
v_t = ln(1 + Vol_t)压缩右偏,再在滚动窗口内做标准化;也可用相对量Vol_t / MA_n(Vol)作为检测统计量。 - 方向约定:本节所有 Z 分数、MAD 分数均定义为“当前值减窗口中心,再除以窗口尺度”,正值表示高于窗口中心,负值表示低于窗口中心;双侧检测取
|score| > k。
下面这张图给出四类方法在同一段行情序列上的处理链路与判定差异,重点看“窗口统计量 → 标准化分数 → 阈值判定”这条主线,以及各方法对尖峰和厚尾的不同敏感度。
二、四类方法的计算过程与参数选择
滚动统计阈值是最直观的一类:在长度为 n 的窗口内计算均值 μ 与标准差 σ,把 μ ± kσ 作为上下轨。参数上,n 取 20 适合捕捉日内节奏,取 60 更平滑;k 常取 2.5~3。它的缺陷在于 σ 本身会被窗口内的异常值抬高,导致“异常把阈值撑大、反而漏检自己”。因此它更适合作为基线对照,而不是唯一判据。
Z-score 与滚动统计同源,只是把偏离量除以 σ 得到无量纲分数 z = (x − μ)/σ,便于跨品种、跨时段比较。在近似正态的收益率上,|z|>3 对应约千分之三的双侧概率,误报可控;但收益率本身已有尖峰厚尾,直接用 3 作为硬阈值会偏松,实践中常配合“连续两期超限”或“超限幅度排序取 Top-N”来抑制单点噪声。
MAD 用中位数替代均值、用绝对偏差的中位数替代标准差:MAD = median(|x_i − med|),再构造修正分数 0.6745·(x − med)/MAD(0.6745 是正态下 MAD 与 σ 的换算系数,使分数在正态时与 z 同尺度)。中位数与 MAD 的崩溃点高,单个极端值几乎不影响它们,因此对尖峰型异常特别有效。注意当窗口内 MAD 为 0(大量重复值,如长时间无成交)时需设下限保护,否则分数会爆炸。
IQR 不依赖任何分布假设:取窗口内 25% 与 75% 分位数 Q1、Q3,IQR = Q3 − Q1,上下界为 Q1 − 1.5·IQR 与 Q3 + 1.5·IQR。它对厚尾分布天然友好,因为分位数不受尾部极值牵引。代价是它对“轻度异常”不够敏感,1.5 倍系数偏保守,若希望提高召回可放宽到 2.0~3.0,但需同步评估误报。
三、一段可执行的计算示例
以下示例参数均为教学假设,用于说明计算流程,不代表真实行情结果。设某标的连续 20 个交易日的对数收益率窗口,当前新到一期 r_t = 0.041(即约 4.1% 的单日涨幅),窗口内均值 μ = 0.002、标准差 σ = 0.011、中位数 med = 0.0015、MAD = 0.006、Q1 = −0.004、Q3 = 0.007。
# 教学示例参数(假设值)
r_t = 0.041
mu, sigma = 0.002, 0.011
med, mad = 0.0015, 0.006
q1, q3 = -0.004, 0.007
# ① 滚动统计 / Z-score
z = (r_t - mu) / sigma # (0.041-0.002)/0.011 ≈ 3.55 → |z|>3 命中
# ② MAD 修正分数
mad_score = 0.6745 * (r_t - med) / mad # ≈ 0.6745*0.0395/0.006 ≈ 4.44 → 命中
# ③ IQR 上界
iqr = q3 - q1 # 0.011
upper = q3 + 1.5 * iqr # 0.007 + 0.0165 = 0.0235
# r_t=0.041 > 0.0235 → 命中
本例中三种方法一致命中,说明这是一个幅度足够大的尖峰。但若把 r_t 换成 0.026(约 2.6%),Z-score 得 2.18 不命中,MAD 分数约 2.75 处于边缘,IQR 上界 0.0235 仍命中——差异就出现了。这提示我们:阈值不是绝对真理,方法间的分歧点恰恰是最值得人工复核的样本。工程上可对“仅单一方法命中”的时点降级为待复核,对“多方法同时命中”的时点直接告警。
四、尖峰与厚尾下的适用性判断
| 方法 | 对尖峰的敏感度 | 对厚尾的稳健性 | 主要风险 | 推荐场景 |
|---|---|---|---|---|
| 滚动统计阈值 | 中 | 低 | σ 被异常值抬高导致漏检 | 基线对照、平稳序列 |
| Z-score | 中高 | 低 | 厚尾下误报偏多 | 收益率等近似对称序列 |
| MAD | 高 | 中高 | MAD=0 时分数爆炸 | 单点脉冲、错价识别 |
| IQR | 中 | 高 | 系数保守导致召回不足 | 成交量、右偏厚尾序列 |
落到实操,建议按“先变换、再双方法交叉、后人工复核”的顺序推进:价格用对数收益率配 MAD 与 Z-score 交叉,成交量用对数变换配 IQR 与 MAD 交叉;窗口长度与阈值系数在历史数据上做小范围网格试算,以“命中样本的人工确认率”而非单纯命中数量作为调参依据。异常点输出至少包含时间戳、方法名、分数、方向与窗口参数,便于回溯复现。只有把方法假设、参数与判定口径写清楚,异常检测结果才具备可审计、可复用的工程价值。