残差波动结构检测
一、什么叫“残差波动结构检测”(对照标准)
一个完整的残差波动结构检测,至少包含 5 个维度:
| 维度 | 核心问题 |
|---|---|
| ① 平稳性 | 是否 I(0) |
| ② 波动幅度 | 波动是否覆盖交易成本 |
| ③ 回归速度 | 偏离后多久回归 |
| ④ 自相关结构 | 是否有节奏/周期/噪声 |
| ⑤ 稳定性 | 不同时间段是否一致 |
👉 ADF 只是第 ① 项的最低门槛。
二、你这份代码“实际做了什么”(逐项核对)
✅ 已经做到的部分(但你可能高估了它)
1️⃣ 残差构建(OK)
你在两个地方构建了残差(spread):
spread_ols = log_alt_series - (alpha + beta * log_base_series)
以及:
spread = log_alt - (alpha + beta_ols * log_base)
✔ 这是标准 Engle–Granger 残差定义
✔ 没问题
2️⃣ 平稳性检验(只做了“是不是平稳”)
你做了:
adfuller(spread.values)
并用:
adf_pvalue < 0.05
👉 这只回答了一个问题:
残差是不是 I(0)?
✔ 这是残差波动结构的必要条件
❌ 不是“结构检测”
3️⃣ Z-score(只看“当前点”)
zscore = (current_spread - spread_mean) / spread_std
这一步等价于:
「当前点离均值多远?」
✔ 适合信号触发
❌ 不告诉你这个 spread 平时是怎么动的
三、你【没有】做的关键残差结构分析(非常关键)
下面这些一个都没做,但它们才是“残差波动结构”的核心:
❌ 1️⃣ 回归速度(Half-life / AR(1))
你没有做:
ε_t = ρ ε_{t-1} + u_t
也没有:
- AR(1) 系数 ρ
- 半衰期 half-life
👉 所以你不知道:
- 这个 spread 是 5 小时回归
- 还是 5 天才回归
⚠️ 对 1h × 30d 来说,这是生死线。
❌ 2️⃣ 残差自相关结构(ACF / PACF)
你没有分析:
- ACF 是否快速衰减
- 是否存在周期性
- 是否高频抖动
👉 你不知道这是:
- 干净的均值回归
- 还是噪声震荡
❌ 3️⃣ 波动结构是否“可交易”
你只用了 std 算 Z-score,但没有:
- spread 波动 / ATR
- spread std vs 手续费
- 有效偏离比例(|z| > 1 的时间占比)
👉 统计上显著 ≠ 经济上有意义
四、一句话精准评价你的代码
我给你一个非常精确的定位:
你这份代码实现的是:
「协整存在性验证 + 当前偏离信号生成」
而不是:
「残差波动结构检测」
或者更直白一点:
你判断的是“能不能构成配对”,
而不是“这个配对好不好用”。
五、如果要“补齐残差波动结构”,最小改动方案
不推翻你现有代码,只加 3 个统计量就够:
✅ 必加 4 项(性价比最高)
- AR(1) 回归 & 半衰期
- spread std / median absolute deviation
- ACF(1~5)
六、一个重要但你还没意识到的点(提醒)
你现在同时在做三件事:
- 延迟相关(lead-lag)
- 协整 / 均值回归
- Z-score 偏离
👉 这三者并不总是兼容的
很多币:
- 有 lead-lag
- 但残差不回归
- 或回归极慢
残差波动结构检测,正是用来筛掉这种“看起来很美”的币。
七、总结(给你一个“工程级结论”)
这段代码:
❌ 没有真正实现“残差波动结构检测”
✅ 实现了“协整 + 信号生成的前半段”