精密零件厂的质检员老周,每天的工作是抽检流水线上的零件,把每个零件尺寸与标准值的偏差记成一份“瑕疵记录”。老周深知:误差本身不可避免,但误差之间绝不能“串通”。如果上一个零件偏大,下一个也偏大,说明机器在闹脾气;反过来,如果误差像撒豆子一样毫无规律,机器才算合格。在时间序列建模里,模型拟合后剩下的“残差”就是那批瑕疵记录。残差若是白噪声——无记忆、无规律——说明模型已经榨干了数据里的信息;可怎么科学地判断?统计学家发明了 Ljung-Box 检验,专查残差之间有没有“串通”;又发明了异方差(ARCH)检验,专查波动的块头是不是忽大忽小。这篇内容,就跟着老周把残差的两道质检关卡走一遍。

岗位关联

对 AI 从业者来说,残差检验是模型上线前的“出厂质检”。学会 Ljung-Box 与 ARCH 检验,你就能用统计证据而非肉眼判断模型是否真的合格,给 ARIMA 和金融波动率建模构筑第一道防线。

目录
  1. 可视化演示
  2. 白噪声标准:瑕疵要像“撒豆子”一样
  3. 检验原理:老周的“默契度”仪表
  4. p值判读:证据不足不等于清白
  5. 检验不通过:给流水线开处方
  6. 异方差检验:瑕疵的块头也在变
  7. ARCH效应:波动率的“抱团”
  8. GARCH衔接:给波动率也建个模型
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示残差合格吗?Ljung-Bo的核心机制,通过概览/流程/对比/趋势四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

残差合格吗?Ljung-Bo:残差白噪 残差白噪声在时序建模中的核心作 Ljung-Box检验的原理与 核心机制可视化 残差合格吗?Ljung-Bo整体架构与关键组件

白噪声标准:瑕疵要像“撒豆子”一样

老周最想看到的瑕疵记录是“撒豆子”:点与点之间没有关系,上一颗豆子的位置完全不影响下一颗。统计上这叫白噪声。白噪声有三个标准:零均值(没有系统性偏移)、恒定方差(波动的块头稳定)、无自相关(没有串通)。对模型诊断来说,零均值通常被常数项吸收,重点看后两条。若残差仍有自相关,相当于瑕疵里还藏着机器的“惯性”,说明模型没把信息提取干净。

在 ARIMA 拟合完数据之后,残差就是观测值减去拟合值:ε_t = y_t - ŷ_t。一个好模型的残差应像白噪声;若残差仍有明显的自相关,说明数据里还有信息没被模型“吃进去”。数学上,白噪声要求不同时刻的协方差为零:

γ(k)=Cov⁡(εt,εt−k)=0,k≠0\gamma(k) = \operatorname{Cov}(\varepsilon_t, \varepsilon_{t-k}) = 0, \quad k \neq 0

1. 协方差 Cov:衡量两个变量一起变化的趋势,这里比较当期残差和 k 期前残差。

Cov⁡(εt,εt−k)=E[(εt−Eεt)(εt−k−Eεt−k)]\operatorname{Cov}(\varepsilon_t, \varepsilon_{t-k}) = E[(\varepsilon_t - E\varepsilon_t)(\varepsilon_{t-k} - E\varepsilon_{t-k})]

2. 残差序列 ε_t:模型拟合后剩下的部分,相当于零件的瑕疵。

εt=yt−y^t\varepsilon_t = y_t - \hat{y}_t

3. 条件 k ≠ 0:只关心不同时刻之间有没有关联,同一时刻和自己比较没有意义。

4. 等于 0:说明没有线性关联,残差中不再有可提取的信息。

老周把“撒豆子图”和“有规律的图”摆在一起,肉眼能看出区别;但机器读数成千上万,直觉不可靠,必须用统计检验来把关——这正是下一节 Ljung-Box 的活。

检验原理:老周的“默契度”仪表

老周想知道瑕疵之间有没有“串通”,不能只盯着相邻两件看,还得看隔 2 件、隔 3 件……隔 m 件。统计上这叫滞后 k 阶的自相关,记作 ρ_k。样本自相关 ρ̂_k 把残差序列错开 k 格再算相关系数,就像把同一批瑕疵记录复制一份,前后错位对齐,看能不能“对上号”。

只凭一个 ρ̂_k 不够,因为任何随机数据都会偶尔出现较大的样本相关。Ljung-Box 检验把前 m 阶自相关的平方“打包”成一个 Q 统计量:

Q=n(n+2)∑k=1mρ^k2n−kQ = n(n+2)\sum_{k=1}^{m}\frac{\hat{\rho}_k^2}{n-k}

1. 样本自相关 ρ̂_k:残差与其滞后 k 期的相关系数,衡量“隔 k 格的默契”。

ρ^k=∑t=k+1n(εt−εˉ)(εt−k−εˉ)∑t=1n(εt−εˉ)2\hat{\rho}_k = \frac{\sum_{t=k+1}^{n}(\varepsilon_t - \bar{\varepsilon})(\varepsilon_{t-k} - \bar{\varepsilon})}{\sum_{t=1}^{n}(\varepsilon_t - \bar{\varepsilon})^2}

2. 平方 ρ̂_k²:避免正负自相关相互抵消,只保留强度信息。

3. 分母 n-k:样本后端少 k 个配对比,是小样本修正项。

4. n(n+2) 因子:整体缩放,让 Q 近似服从卡方分布,便于查 p 值。

5. 求和到 m:把前 m 阶的证据累积起来,m 一般取 min(10, n/5)。

老周把仪表读数 Q 与卡方对照表一比,就能给瑕疵下结论。下一节看怎么用 p 值做最终决定。

p值判读:证据不足不等于清白

老周很懂一个原则:证据不足只能“不起诉”,不能说“真清白”。Ljung-Box 的原假设 H0 是“残差为白噪声”。p 值就是在假设 H0 成立的前提下,出现当前 Q 这么大数值(甚至更大)的概率。p 小,说明如果残差真是白噪声,得到这么强的“串通证据”实在罕见,于是合理怀疑它不是白噪声。

p=P(Q>Qobs∣H0),α=0.05,p<α⇒拒绝 H0p = P(Q > Q_{\text{obs}} \mid H_0),\quad \alpha = 0.05,\quad p < \alpha \Rightarrow \text{拒绝 } H_0

1. 原假设 H0:残差是白噪声,即前 m 阶自相关全为 0。

H0:ρ1=ρ2=⋯=ρm=0H_0: \rho_1 = \rho_2 = \dots = \rho_m = 0

2. Qobs:从当前样本算出的 Ljung-Box 统计量。

3. P(Q > Qobs | H0):原假设下出现更极端证据的概率,也就是 p 值。

4. 显著性水平 α:常用 0.05,相当于法庭上“5% 的误判额度”。

5. 拒绝条件 p<α:证据强度足够,判定残差不合格。

如果把 p 值当成“清白概率”,那就错了:p=0.8 不表示有 80% 概率是白噪声,只是说证据不足。老周把这类案件标为“存疑不起诉”,而不是“无罪释放”。

检验不通过:给流水线开处方

如果 Ljung-Box 不通过,说明均值模型没把时间依赖提取干净。老周的解决办法是调机器参数——对应到 ARIMA,就是增加自回归项或移动平均项的阶数。ARMA(p,q) 模型把“过去的状态”和“过去的冲击”都纳入解释变量,试图把残差中的记忆全部吸收:

yt=c+∑i=1pφiyt−i+∑j=1qθjεt−j+εty_t = c + \sum_{i=1}^{p}\varphi_i y_{t-i} + \sum_{j=1}^{q}\theta_j \varepsilon_{t-j} + \varepsilon_t

1. y_t 当前观测:序列在 t 时刻的值。

2. 常数项 c:序列的基准水平。

3. 自回归项 φ_i y_{t-i}:用过去的观测值解释现在,对应 AR 阶数 p。

∑i=1pφiyt−i\sum_{i=1}^{p}\varphi_i y_{t-i}

4. 移动平均项 θ_j ε_{t-j}:用过去的误差解释现在,对应 MA 阶数 q。

∑j=1qθjεt−j\sum_{j=1}^{q}\theta_j \varepsilon_{t-j}

5. 新残差 ε_t:加阶后重新拟合,希望它通过 Ljung-Box。

实际操作中,不通过时依次尝试增加 p、增加 q、加入季节项,再重新做 Ljung-Box,直到合格。这就像一个闭环质检:调机器、抽检、再调、再抽检。

异方差检验:瑕疵的块头也在变

Ljung-Box 管的是“瑕疵之间有没有串通”,可还有另一个隐患:瑕疵的块头忽大忽小。老周发现某几天零件误差像湖水一样平静,某几天却像海浪一样剧烈;误差本身没有相关,但波动的幅度却“抱团”。在时间序列里,这就是方差随时间变化,称为异方差。检验它最直接的办法,是对残差平方做自相关分析——如果“大波动”过去后“大波动”还会再来,残差平方就会出现正自相关。

ARCH-LM 检验把残差平方对自身滞后项做回归:

ε^t2=α0+∑i=1qαiε^t−i2+vt\hat{\varepsilon}_t^2 = \alpha_0 + \sum_{i=1}^{q}\alpha_i \hat{\varepsilon}_{t-i}^2 + v_t

1. 残差平方 ε̂t²:把每期波动大小变成一个新的“波动序列”。

2. 常数项 α0:长期平均方差水平。

3. 滞后平方项 α_i ε̂_{t-i}²:过去第 i 期的波动对当期波动的影响。

4. 误差 v_t:回归后剩余部分,应无模式。

5. 联合显著:用 F 检验或 LM 检验判断所有 α_i 是否同时为 0。

老周除了看“串通”,还要看“块头是否稳”。若块头不稳,均值模型合格也不代表模型能可靠预测风险。

ARCH效应:波动率的“抱团”

ARCH 效应的典型特征是波动率聚集:平静之后还是平静,剧烈之后接着剧烈。金融市场的日收益率几乎都有这个现象——某几天大盘暴跌,接着又是连续大波动;随后又会进入一段风平浪静。原因在于信息到达不均匀,市场对冲击的消化需要时间。

ARCH(1) 模型用上一期的“冲击”(残差平方)来解释当期的条件方差:

σt2=ω+αεt−12\sigma_t^2 = \omega + \alpha \varepsilon_{t-1}^2

1. σt² 条件方差:给定过去信息时,本期残差的方差。

2. ω 长期基准:没有冲击时的基础波动水平。

3. ε_{t-1}² 昨日冲击:上期残差平方,代表近期意外大小。

4. α 敏感度:冲击对条件方差的放大倍数。

老周把“块头波动”单独建模,不再把方差当作常数,这正是金融波动率建模的起点。

GARCH衔接:给波动率也建个模型

ARCH(1) 模型只依赖昨日的冲击,实际数据往往需要很高的阶数才能拟合波动的“长期记忆”。就像老周发现,不仅昨天的块头影响今天,前天甚至上周的块头都留有余温。GARCH 模型把“过去的方差”也引入方程,用更少的参数抓住这种记忆:

σt2=ω+αεt−12+βσt−12\sigma_t^2 = \omega + \alpha \varepsilon_{t-1}^2 + \beta \sigma_{t-1}^2

1. β σ_{t-1}² 方差记忆:上期方差对本期方差的延续影响。

2. α ε_{t-1}² 新冲击:昨日意外对本期波动的作用。

3. 持续性 α+β:接近 1 时波动消退很慢,金融序列通常 α+β 接近 0.95 以上。

4. 平稳约束:α+β<1 保证长期方差有限,不会爆炸。

至此,老周的完整质检流程是:先用 Ljung-Box 把关均值残差是否白噪声,再用 ARCH 检验把关方差是否时变;前者不合格就调整 ARMA 阶数,后者不合格就进入 GARCH 建模。两道关卡都过了,模型才敢拿“出厂合格证”。

AI 应用场景

场景一:时序预测模型上线前的自动“出厂质检”

阶段:模型诊断与上线前验证

解决的问题:企业用 ARIMA 预测库存时,传统做法只盯 RMSE,残差带明显周期也照常上线。用 Ljung-Box 自动化检验残差,能在上线前发现“模型没吃干净信息”,及时加季节项,避免预测系统性偏移。

具体案例:某设备预警平台对轴承温度做 ARIMA 预测,上线前 Ljung-Box p=0.008,说明残差仍有 24 小时周期;加入日季节项后 p=0.31,预警误报率下降约 20%。

场景二:金融风控中的波动率建模

阶段:风险度量与特征工程

解决的问题:量化风控团队发现股票收益率模型残差 Ljung-Box 通过,但 ARCH-LM 检验显著——均值模型够用,但方差在聚集,历史模拟法算 VaR 会失真。需要用 GARCH 给波动率建模,把动态风险纳入 VaR。

具体案例:对沪深 300 日收益率序列做 ARCH-LM 检验,p<0.001,存在明显 ARCH 效应;改用 GARCH(1,1) 预测条件方差后,95% VaR 的历史回测覆盖率从 82% 提升到 94%。

Python 演示

python53 行
import numpy as npfrom scipy import stats def ljung_box(resid, lags=10):    n = len(resid)    resid = resid - np.mean(resid)    acf = np.ones(lags + 1)    for k in range(1, lags + 1):        acf[k] = np.corrcoef(resid[:-k], resid[k:])[0, 1]    q = n * (n + 2) * np.sum(acf[1:] ** 2 / (n - np.arange(1, lags + 1)))    p = 1.0 - stats.chi2.cdf(q, lags)    return q, p def arch_test(resid, lags=5):    r2 = resid ** 2    T = len(r2) - lags    y = r2[lags:]    X = np.column_stack([np.ones(T)] + [r2[lags - i: len(r2) - i] for i in range(1, lags + 1)])    beta = np.linalg.lstsq(X, y, rcond=None)[0]    resid_lm = y - np.dot(X, beta)    rss0 = np.sum((y - np.mean(y)) ** 2)    rss1 = np.sum(resid_lm ** 2)    lm = T * (1.0 - rss1 / rss0)    p = 1.0 - stats.chi2.cdf(lm, lags)    return lm, p np.random.seed(42)n = 500noise = np.random.randn(n)y = np.zeros(n)for t in range(1, n):    y[t] = 0.75 * y[t - 1] + noise[t] resid_bad = y - np.mean(y)q1, p1 = ljung_box(resid_bad, lags=10)print("均值模型残差 Ljung-Box: Q=%.2f p=%.4f" % (q1, p1)) ar_resid = np.zeros(n)for t in range(1, n):    ar_resid[t] = y[t] - 0.75 * y[t - 1]ar_resid = ar_resid[1:]q2, p2 = ljung_box(ar_resid, lags=10)print("AR(1)模型残差 Ljung-Box: Q=%.2f p=%.4f" % (q2, p2)) garch_eps = np.random.randn(n)sigma2 = np.ones(n)for t in range(1, n):    sigma2[t] = 0.2 + 0.8 * garch_eps[t - 1] ** 2    garch_eps[t] = np.sqrt(sigma2[t]) * garch_eps[t] q3, p3 = ljung_box(garch_eps, lags=10)lm, p_arch = arch_test(garch_eps, lags=5)print("GARCH模拟残差 Ljung-Box: p=%.3f, ARCH-LM: p=%.4f" % (p3, p_arch))
目的:用一段可复现的 Python 脚本演示三个场景——错误均值模型残差被 Ljung-Box 拒绝、正确 AR(1) 残差通过、GARCH 残差 Ljung-Box 通过但 ARCH 检验显著。
  1. acf[k] = np.corrcoef(resid[:-k], resid[k:])[0, 1]把残差错开 k 格对齐,算样本自相关。
  2. q = n * (n + 2) * np.sum(acf[1:] ** 2 / (n - np.arange(1, lags + 1)))这就是 Ljung-Box Q 统计量。
  3. p = 1.0 - stats.chi2.cdf(q, lags)用卡方分布把 Q 翻译成 p 值。
  4. X = np.column_stack([np.ones(T)] + [r2[lags - i: len(r2) - i] for i in range(1, lags + 1)])构造 ARCH-LM 的滞后回归矩阵。
  5. lm = T * (1.0 - rss1 / rss0)LM 统计量,等价于 T 乘以回归 R²。
  6. resid_bad = y - np.mean(y)只用均值模型的残差,必然带自相关。
  7. sigma2[t] = 0.2 + 0.8 * garch_eps[t - 1] ** 2模拟波动率聚集,让方差被上一期冲击驱动。

常见误区

误区检验出来 p=0.8,残差肯定是白噪声,模型完全没问题!

正解p 值大只能说明“没有足够证据拒绝白噪声”,不等于证明白噪声成立。就像法庭上证据不足判无罪,不等于被告真清白。当样本量少、滞后数选得小时,检验力很低,有自相关也可能测不出来。

为何常见:把“不拒绝”等同于“接受”,混淆了“缺席的证据”和“无罪的证据”。

误区Ljung-Box 都通过了,残差肯定是白噪声,其他检验不用做了。

正解Ljung-Box 只查均值结构的自相关,不查方差结构。GARCH 残差水平上无自相关,LB 能通过,但残差平方有强相关,ARCH 检验显著。必须再做异方差检验,质检才算完整。

为何常见:只关注第一阶矩的规律,忽略了二阶矩(方差)可能隐藏的模式。

误区残差 Ljung-Box 不通过?那加个 GARCH 模型就行了。

正解GARCH 解决的是方差建模,不是均值残差的相关性。LB 不通过说明均值模型没提取干净,应先加 AR/MA 或季节项,再重新检验;GARCH 是确认异方差之后才做的下一步。

为何常见:知道 GARCH 能改善时序,但不清楚它只管方差,不管均值结构。

误区多取几个滞后更稳妥,m=10 不够就取 m=30,信息越多越好。

正解m 太大会引入大量随机噪声,而且损失样本配对数,检验力反而下降。经验做法是取 m ≈ min(10, n/5) 或 m ≈ ln(n)。小样本下滞后过多,很容易漏检真实的自相关。

为何常见:直觉上“信息越多越好”,忽略了统计检验中自由度和噪声的代价。

面试题

Q1. Ljung-Box检验的原假设是什么?

单选题 · easy

  • A.残差前m阶自相关均为零← 正确答案
  • B.残差后m阶自相关均为零
  • C.残差方差恒为常数
  • D.残差均值显著不为零

答案:A。Ljung-Box 的原假设是“残差为白噪声”,等价于前 m 阶自相关系数全为 0。方差和均值不是它检验的对象,所以 C、D 都不对;B 中“后 m 阶”不是检验关心的方向。

Q2. 残差为白噪声时,样本自相关函数(ACF)最可能出现什么特征?

单选题 · easy

  • A.各阶自相关都落置信带内← 正确答案
  • B.第一阶自相关显著越界
  • C.自相关随滞后续渐衰减
  • D.自相关呈现周期性起伏

答案:A。白噪声的样本自相关理论值为 0,实际估计值会在 0 附近随机波动,通常落在 ±1.96/√n 的置信带内。越界、衰减、周期波动都说明残差还有结构。

Q3. Ljung-Box Q统计量的计算形式是?

单选题 · easy

  • A.样本量乘绝对自相关和
  • B.n(n+2)乘平方加权和← 正确答案
  • C.各阶平方和乘样本量
  • D.样本量乘拟合优度值

答案:B。Q = n(n+2)Σ[ρ̂_k²/(n-k)],正是“n(n+2) 乘各阶自相关平方的加权和”。A、C 少了分母修正,D 完全不相关。

Q4. Ljung-Box检验得到p=0.02,在α=0.05下应如何判断?

单选题 · mid

  • A.残差是白噪声模型合格
  • B.残差存在显著自相关← 正确答案
  • C.残差方差随时间改变
  • D.残差均值发生漂移

答案:B。p=0.02 < 0.05,拒绝“白噪声”原假设,说明残差存在显著自相关,模型不合格。C 是异方差问题,D 是均值漂移问题,都不是 LB 的直接结论。

Q5. Ljung-Box检验不通过,哪些对策是合理的?

多选题 · mid

  • A.增加AR项阶数← 正确答案
  • B.增加MA项阶数← 正确答案
  • C.改用GARCH建模方差
  • D.引入季节差分项← 正确答案

答案:ABD。LB 不通过说明均值模型没把自相关提取干净,增加 AR/MA 阶数或引入季节项都能补上“记忆槽位”。GARCH 只解决方差时变问题,不解决均值残差相关,所以不选 C。

Q6. 异方差(ARCH)检验主要观察什么?

单选题 · mid

  • A.残差平方是否存在自相关← 正确答案
  • B.残差水平值是否自相关
  • C.残差是否服从正态分布
  • D.残差均值是否显著为零

答案:A。ARCH 检验把残差平方看作新序列,看过去的平方能否预测未来的平方,即“大波动是否扎堆”。残差水平的相关性是 LB 检验的事,正态性和均值不是异方差的核心。

Q7. 关于白噪声与ARCH效应,哪些说法正确?

多选题 · mid

  • A.白噪声一定没有条件异方差
  • B.无自相关仍可有ARCH效应← 正确答案
  • C.ARCH看残差平方序列← 正确答案
  • D.两种检验可互相替代

答案:BC。弱白噪声只规定无自相关和恒定无条件方差,但允许条件方差随时间变化,所以 A 错、B 对;ARCH 检验的是残差平方序列的相关性,C 对;两种检验考察不同维度,不能互相替代,D 错。

Q8. ARCH-LM检验的核心步骤是?

单选题 · hard

  • A.残差平方对滞后平方回归← 正确答案
  • B.残差对滞后残差回归
  • C.拟合值对时间趋势回归
  • D.残差做正态性检验

答案:A。ARCH-LM 把残差平方作为被解释变量,对若干阶滞后的残差平方做回归,再算 LM = T·R²。B 是检验均值相关,C、D 与方差结构无关。

Q9. 哪些情况会让Ljung-Box检验结论不可靠?

多选题 · hard

  • A.样本量小且滞后太多← 正确答案
  • B.缺失值未做任何处理← 正确答案
  • C.忽略估计参数自由度← 正确答案
  • D.残差严格服从正态分布

答案:ABC。样本量小、滞后过多会降低检验力;缺失值会扭曲自相关估计;模型估计参数会消耗自由度,忽略它会让卡方临界值偏大。残差是否正态不是 LB 检验可靠性的前提,所以 D 不选。

Q10. 对ARIMA残差直接用卡方(m)分布做Ljung-Box检验,会怎样?

单选题 · extreme

  • A.检验偏保守容易漏检← 正确答案
  • B.检验偏激进容易误报
  • C.对检验结果毫无影响
  • D.卡方分布完全失效

答案:A。ARIMA 的参数估计消耗了残差的自由度,理论空分布更接近卡方(m-p-q)。若仍用卡方(m),临界值偏大,p 值偏大,更不容易拒绝 H0,因此检验偏保守、容易漏掉真实的残差自相关。