adf检验maxlags应按schwert准则设为int(12*(nobs/100)^(1/4)),季节性数据至少取一周期长度(如月度数据设12),避免默认maxlags=1导致统计量偏误。

ADF检验的maxlags参数怎么设才合理?
默认自动选阶(autolag="AIC")在多数场景下够用,但高阶AR过程或小样本时容易低估滞后阶数。手动设maxlags更可控:建议取int(12 * (nobs/100)**(1/4))(Schwert准则),其中nobs是有效观测数;若序列含明显季节性,至少保留一个完整周期长度(如月度数据设maxlags=12)。别直接用maxlags=1——这会让检验统计量偏误,尤其当真实滞后阶数>1时,pvalue可能虚假显著。
KPSS检验失败提示"Kernel is not positive definite"怎么办?
这是核估计器在小样本或强自相关下数值不稳定导致的。优先尝试:
- 换核函数:
regression="c"(仅截距)比"ct"(趋势+截距)更稳定 - 降低带宽:
nlags设为int(np.sqrt(nobs))或更小,避免过度平滑 - 先对原序列做一阶差分再跑KPSS——很多用户卡在这一步,误以为必须原始序列才能检验
statsmodels.tsa.stattools.kpss返回的statistic越小越支持平稳,和ADF相反,这点常被忽略。
为什么ADF和KPSS结论冲突?比如ADF说平稳、KPSS说非平稳
这不是bug,是两类检验原假设根本不同:ADF原假设是“存在单位根”(即非平稳),KPSS原假设是“平稳”。当序列含结构突变、缓慢漂移或近单位根(ρ=0.95左右)时,两者天然易打架。此时要:
- 画
plot_acf和plot_pacf看拖尾/截尾特征 - 检查残差是否异方差——用
arch_model拟合后做arch_lm_test - 试
Phillips-Perron(pp.test)交叉验证,它对异方差更鲁棒
用adfuller检验季节性序列总报错"LinAlgError: SVD did not converge"
这是OLS求解器在高度共线性下崩溃,常见于未去季节性的月度/季度数据。解决路径很直接:
- 先用
seasonal_decompose(model="additive")提取季节项,再对resid跑adfuller - 或改用
stl分解(statsmodels.tsa.seasonal.STL),它对异常值更稳健 - 绝对避免对原始季节性序列直接设高
maxlags——这只会加剧共线性
adfuller本身不处理季节性,它只管单位根;季节性得靠预处理剥离。
实际操作中,最常被跳过的步骤是检查差分后的残差是否白噪声(acorr_ljungbox),而不仅是看ADF结果。这点一旦漏掉,后续建模大概率出偏。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











