ADF 检验中滞后阶数(lag length)
一、为什么 ADF 一定要选滞后阶数?
先给直觉,再给形式。
1️⃣ 直觉解释(非常重要)
ADF 检验的核心假设是:
“如果序列是平稳的,它不会被过去的冲击长期影响”
但现实中:
- 金融时间序列几乎一定存在 短期自相关
- 如果不控制这种自相关,ADF 的 t 统计量会 失真
👉 滞后阶数的作用:
用过去的差分项来 “吸收” 残留自相关,让误差项尽可能接近白噪声。
2️⃣ 数学形式(你一定见过)
ADF 回归形式:
[
\Delta y_t = \alpha + \beta t + \gamma y_{t-1}
- \sum_{i=1}^{p} \delta_i \Delta y_{t-i}
- \varepsilon_t
] - ( p ) = 滞后阶数(我们要选的)
- 核心检验的是:
[
H_0: \gamma = 0 \quad (\text{单位根})
]
如果 p 选错:
- p 太小 → 残差相关 → 假拒绝 / 假不拒绝
- p 太大 → 自由度下降 → 检验力严重下降
二、方案一:AIC 自动选择(autolag='AIC')
adf_result = adfuller(spread.values, autolag='AIC')
1️⃣ AIC 在做什么?
AIC 的目标函数:
[
\text{AIC} = -2 \ln(L) + 2k
]
- ( L ):似然函数
- ( k ):模型参数个数(与滞后阶数成正比)
👉 思想:
在“拟合好”和“模型复杂度”之间 偏向拟合
2️⃣ AIC 的行为特征
| 特性 | 说明 |
|---|---|
| 偏好 | 较多滞后项 |
| 对自相关 | 非常谨慎 |
| 自由度 | 消耗较多 |
| 检验力 | 稍弱 |
👉 一句话总结:
AIC 更怕“漏掉自相关”,宁愿多加 lag
3️⃣ 在价差 / 协整残差中的含义
当你做的是:
spread = log_alt - (alpha + beta * log_base)
这个 spread:
- 本质是 估计误差的线性组合
- 自相关结构 不确定、常常复杂
👉 AIC 的优势:
- 能更稳健地“清洗”自相关
- 降低 假平稳(Type I error) 风险
4️⃣ 适用场景(强烈推荐)
✅ 高频数据(5min / 15min / 1h)
✅ 样本量 ≥ 300
✅ 用于 实盘前的稳健性检验
✅ 你更在意“别误判为平稳”
📌 量化交易中默认首选
三、方案二:BIC 自动选择(autolag='BIC')
adf_result = adfuller(spread.values, autolag='BIC')
1️⃣ BIC 在做什么?
BIC 的目标函数:
[
\text{BIC} = -2 \ln(L) + k \ln(n)
]
与 AIC 的关键区别:
- 惩罚项是 ( \ln(n) ),而不是常数 2
- 样本越大,惩罚越狠
👉 思想:
强烈偏向“简单模型”
2️⃣ BIC 的行为特征
| 特性 | 说明 |
|---|---|
| 偏好 | 更少滞后项 |
| 自由度 | 节省 |
| 检验力 | 更强 |
| 风险 | 残差可能仍有相关 |
👉 一句话总结:
BIC 更怕“模型太复杂”,宁愿 lag 少一点
3️⃣ 在价差 / 残差中的影响
BIC 往往会:
- 给你 更小的 lag
- 得到 更激进的拒绝单位根结果
这意味着:
你更容易判定 spread 是平稳的
⚠️ 风险:
- 如果自相关没清理干净
- ADF 统计量 偏向拒绝 H₀
4️⃣ 适用场景
✅ 样本量较小(< 200)
✅ 日频 / 周频数据
✅ 学术报告、论文
✅ 你更在意“检验力”
📌 论文写作常用,但实盘要谨慎
四、方案三:手动指定 maxlag(maxlag=5)
adf_result = adfuller(spread.values, maxlag=5)
1️⃣ 这实际上做了什么?
- statsmodels 会 在 0~maxlag 内搜索
- 默认还是用信息准则(除非你自己控制)
⚠️ 常见误解:
maxlag=5 ≠ 滞后一定是 5
它是:
搜索空间的上限
2️⃣ 为什么要手动?
因为有时候你 比 AIC / BIC 更懂数据
例如:
- 明确知道市场微结构带来 1–3 阶相关
- 高频数据中:
- lag 太大毫无经济意义
- 想让所有资产 滞后结构一致
3️⃣ maxlag 的经验规则
常见经验法则:
| 数据频率 | 推荐 maxlag |
|---|---|
| 日频 | 5–10 |
| 小时级 | 10–20 |
| 5 分钟 | 20–50 |
| tick | 不建议用 ADF |
📌 金融协整中非常常见:
maxlag = int(np.sqrt(len(spread)))
4️⃣ 优缺点总结
✅ 优点:
- 可控
- 可复现
- 便于批量资产对比
❌ 缺点:
- 主观
- 对新数据不鲁棒
五、三种方案的核心对比(重点)
| 维度 | AIC | BIC | maxlag |
|---|---|---|---|
| 滞后偏好 | 多 | 少 | 人为 |
| 自相关处理 | 强 | 弱 | 取决 |
| 检验力 | 中 | 强 | 不确定 |
| 假平稳风险 | 低 | 高 | 取决 |
| 实盘稳健性 | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ |
| 学术常用 | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ |
六、给你的“量化级建议”
✅ 协整残差 / 价差检验的黄金流程
# 主检验(稳健)
adf_aic = adfuller(spread, autolag='AIC')
# 对照检验(激进)
adf_bic = adfuller(spread, autolag='BIC')
判定逻辑:
只有当 AIC 和 BIC 都拒绝单位根
👉 才认为 spread 真正平稳