协整关系中,ADF检验样本量确定的问题
一、4 小时(4H)数据
是的,如果是 4 小时(4H)数据,样本量可以明显少于 300,
100 条在“工程上可用”,但属于“下限可用”,不是理想值。
更精确一点的分级结论:
| 样本量 | 对 4H ADF 的评价 |
|---|---|
| < 80 | ❌ 不可靠,几乎不建议 |
| 80–120 | ⚠️ 勉强可用(MVP / 探索期) |
| 120–200 | ✅ 可接受(实盘前筛选) |
| > 200 | ⭐ 稳健(强烈推荐) |
所以你说 100 条 ——
👉 “可以用,但要知道自己在冒什么风险”
二、为什么 4H 数据可以“少一点样本”?
这是核心逻辑,不是拍脑袋。
1️⃣ ADF 真正关心的不是“条数”,而是:
单位根是否在“足够长的时间跨度”内显现
4H 数据的时间跨度:
- 100 根 4H ≈ 16.7 天
- 200 根 4H ≈ 33 天
而对协整价差来说:
- 均值回归半衰期往往是 几天到几周
- 你至少要 覆盖多个完整回归周期
👉 这就是为什么:
- 5min 要 1000+
- 1H 要 300+
- 4H 可以降到 100+
2️⃣ 自相关结构随频率下降而“变简单”
这是一个被很多人忽略的事实:
- 高频(5m / 15m):
- 微结构噪声
- bid-ask bounce
- 高频自相关
- 4H / 1D:
- 大部分短期噪声被“时间聚合”消掉
结果是:
ADF 所需的滞后阶数 p 下降
这点非常关键,因为:
[
\text{有效自由度} \approx n - p
]
- 高频:n 大,但 p 也大
- 4H:n 小,但 p 通常 ≤ 3
👉 有效样本量差距被显著缩小
三、那为什么我之前说 AIC 推荐 ≥300?
因为我说的是**“通用、保守、实盘级建议”**,不是极限情况。
之前那条规则隐含前提是:
- 频率:≤ 1H
- lag 结构复杂
- spread 噪声较大
- 要求 极低假平稳概率
而现在你限定的是:
- 4H
- 协整价差
- 有明确经济含义
👉 前提已经变了,样本下限自然可以放松
四、100 条 4H 数据的真实风险在哪里?
我不光告诉你“可以”,我还要告诉你哪里会出问题。
⚠️ 风险 1:ADF 的“低检验力”问题
在小样本下:
- 不拒绝 H₀ ≠ 不平稳
很可能是:
“我没能力拒绝”
也就是说:
假阴性(Type II error)概率上升
⚠️ 风险 2:AIC / BIC 选择不稳定
样本少时:
- AIC、BIC 对 lag 的选择 非常跳
- 今天选 1,明天选 3
👉 这会导致:
- ADF p-value 波动大
- 策略信号不稳定
⚠️ 风险 3:协整关系“暂时成立”
100 根 4H 只覆盖:
- 一个市场 regime
- 一段波动结构
你检验到的可能是:
短期统计协整,而非结构性协整
五、如果你坚持用 100 条 4H,我给你一个“专业补救方案”
这是重点,工程上怎么兜底。
✅ 1️⃣ 同时跑 AIC + BIC(必须)
adf_aic = adfuller(spread, autolag='AIC')
adf_bic = adfuller(spread, autolag='BIC')
判定规则(比之前更严格):
只有在 AIC 和 BIC 都拒绝 H₀,才认定平稳
✅ 2️⃣ 强制限制 maxlag(非常重要)
adf = adfuller(spread, maxlag=3, autolag='AIC')
原因:
- 小样本 + 大 lag = 自杀
- 4H 数据 lag > 3 基本无经济意义
✅ 3️⃣ 一定要做残差白噪声检验
from statsmodels.stats.diagnostic import acorr_ljungbox
lb_p = acorr_ljungbox(spread, lags=[5], return_df=True)["lb_pvalue"].iloc[0]
规则:
ADF 拒绝 + Ljung–Box 不拒绝
👉 才是真的“可交易平稳”
✅ 4️⃣ 用“半衰期”做最后一关
如果你算出来:
- half-life > 20 根 4H
👉 说明回归太慢,ADF 即便拒绝也没交易价值
六、一句“量化老手级”的总结
4H 数据 100 条不是“统计上理想”,
但在工程和交易上是“可用下限”。
真正稳健的做法是:
- 4H + 150~250 条
- AIC 主检验
- BIC 对照
- 限制 maxlag
- 加 Ljung–Box + 半衰期