ADF检验不自动判断平稳性,需人工比对p值(<0.05)或ADF统计量是否小于对应临界值(如-3.43);推荐默认regression="c",显式设置maxlags,差分前先绘图识别趋势与季节性,避免过差分。

ADF检验本身不关心序列是否“已经平稳”,它只是检验原假设“序列存在单位根(非平稳)”是否成立;Statsmodels的 adfuller 函数返回的是原始统计量和临界值对比结果,**不会自动判断平稳与否**——你得自己比对 p-value 或统计量与临界值。
怎么调用 adfuller 并正确解读返回值
Statsmodels 的 adfuller 默认使用带常数项和趋势项的检验形式(regression="ct"),但多数平稳性诊断场景下,应优先尝试更宽松的 regression="c"(仅含截距),避免因过度拟合趋势导致检验功效下降。
关键返回字段包括:statistic(ADF统计量)、pvalue、usedlag、critical_values(字典,含 '1%', '5%', '10%' 对应临界值)、icbest。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 始终显式传入
maxlags(如maxlags=10),否则 Statsmodels 会按经验公式自动选滞后阶数,小样本下容易过拟合 - 若
pvalue < 0.05,可拒绝原假设,认为序列在 5% 显著性水平下平稳;但更稳妥的做法是同时检查statistic < critical_values["5%"],因为pvalue是近似计算,小样本时可能不准 - 注意
critical_values是负数,越小(即越负)代表越显著;例如 -2.86 比 -2.57 更容易通过 5% 检验
为什么 adfuller 常报错 “Insufficient observations” 或返回 nan
常见于序列太短或预处理不当。ADF检验至少需要 maxlags + 2 个有效观测值(默认 maxlags 约为 12*(nobs/100)**(1/4)),若原始序列含缺失值或全为常数,adfuller 内部差分后可能只剩 1~2 个点。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 调用前先运行
np.isnan(series).sum()和series.nunique() == 1排查数据质量 - 避免直接对原始
pd.Series调用;转成一维numpy.ndarray(用series.dropna().values)可绕过部分 pandas 索引引发的隐式对齐错误 - 若必须处理极短序列(如 n < 20),改用 KPSS 检验(
kpsstest)作补充,它原假设是“平稳”,与 ADF 互为佐证
如何选择 regression 参数:c / ct / nc
选项直接影响检验势(power)和适用场景:
-
regression="nc":无截距无趋势,仅适用于均值为 0 且无漂移的白噪声序列,现实中极少适用 -
regression="c":含截距(常数项),覆盖大多数平稳序列(如 ARMA 模型残差),推荐作为默认起点 -
regression="ct":含截距+线性趋势,仅当序列明显呈长期单调变化(如带确定性趋势的伪平稳)时才考虑;误用会导致“假阴性”(该拒绝却不拒绝)
一个简单判据:对原始序列做 plt.plot(series),若肉眼可见明显向上/向下斜线,再结合领域知识判断是否属于确定性趋势(而非随机游走),否则坚持用 "c"。
真正容易被忽略的是:ADF 检验对“结构突变”完全不敏感——比如序列前半段平稳、后半段突变出新均值,adfuller 仍可能给出低 pvalue;此时需配合 Chow 检验或滚动窗口 ADF 来定位断点。

















