📑 查看全课大纲(第 3 / 20 节)
- 1.时间序列分析简介
- 2.平稳性检验与特征
- 3.纯随机性检验(白噪声检验)
- 4.时间序列预处理代码实战
- 5.自回归模型(AR 模型)
- 6.自相关系数与偏自相关系数
- 7.移动平均模型(MA)与自回归移动平均模型(ARMA)
- 8.平稳时序模型识别与参数估计
- 9.模型显著性检验、优化与序列预测
- 10.平稳时间序列建模代码实战
- 11.确定性序列分解与趋势分析
- 12.季节效应分析与综合波动分析
- 13.确定性时序分析代码实战
- 14.差分平稳化与 ARIMA 模型
- 15.残差自回归模型
- 16.ARCH / GARCH 模型及其衍生
- 17.异方差检验:Portmanteau Q 检验与 LM 检验
- 18.随机性非平稳建模与 GARCH 实战
- 19.ARIMAX 模型与单位根(DF/ADF)检验
- 20.协整检验与误差修正模型(ECM)
纯随机性检验(白噪声检验)
约 37 分钟
小象实战讲义 · 时间序列分析
在上一节中,我们学习了如何检验时间序列的平稳性。然而,即使一个序列是平稳的,它也可能仅仅是随机波动的”噪声”,没有任何内在规律可循。本节将介绍时间序列预处理的第二个关键步骤——纯随机性检验(又称白噪声检验),帮助我们识别哪些平稳序列具有真正的分析价值,哪些只是纯粹的随机波动。
💡 核心导读
- 白噪声序列的定义:理解纯随机序列(白噪声)的数学定义与统计特性
- 白噪声与平稳性的关系:明确白噪声是平稳序列的一个特例,但并非所有平稳序列都有研究价值
- 纯随机性检验原理:掌握基于自相关系数的假设检验思想与统计量构造
- Ljung-Box检验实战:学习使用Python进行白噪声检验的完整流程与结果解读
- 完整预处理流程:建立”先平稳性检验,再纯随机性检验”的系统分析框架
白噪声序列的定义与性质
纯随机序列的数学定义
纯随机序列,也称为白噪声序列,是时间序列分析中最基本的随机过程。一个时间序列 被称为白噪声序列,当且仅当它同时满足以下两个条件:
常数均值:对于任意 ,都有 其中 为常数。
特殊结构的自协方差函数:对于任意 ,有 其中 为常数方差。
第二个条件包含两层含义:
- 当 时,,即常数方差
- 当 时,,即序列值之间互不相关
白噪声序列的统计性质
从上述定义可以直接推导出白噪声序列的两个核心性质:
性质1:纯随机性 对于任意 ,有 且 。这意味着序列中任意两个不同时期的观测值之间没有任何相关关系,序列是”没有记忆”的。
性质2:方差齐性 序列中每个随机变量的方差都相等: 对任意 成立。方差齐性在统计建模中至关重要——根据高斯-马尔可夫定理,在零条件均值、无自相关、方差齐性等条件同时满足时,最小二乘估计才是最佳线性无偏估计(BLUE);若存在异方差,OLS仍无偏但不再有效,且常规标准误会失真。
白噪声与平稳性的关系
回顾宽平稳序列的三个条件:
- 常数均值:
- 常数方差:
- 自协方差只依赖于时间间隔:,其中
比较白噪声的定义,我们可以发现:
- 白噪声完全满足宽平稳的所有条件
- 白噪声是平稳序列的一个特殊子集,它要求自协方差在 时严格为0
因此,所有白噪声序列都是平稳的,但并非所有平稳序列都是白噪声。这正是为什么在平稳性检验之后还需要进行纯随机性检验——我们需要从平稳序列中筛选出那些具有内在相关结构、值得进一步建模分析的序列。
纯随机性检验的原理与方法
检验的基本思想
纯随机性检验的核心是检验序列的自相关系数是否显著不为零。如果序列是纯随机的,那么除了零阶自相关系数 外,所有其他阶数的自相关系数 ()都应该在统计上不显著异于零。
检验的原假设和备择假设设定如下:
原假设 :延迟期数小于或等于 期的序列值之间相互独立
备择假设 :延迟期数小于或等于 期的序列值之间存在相关性
Bartlett定理:检验的理论基础
Bartlett定理为纯随机性检验提供了理论依据。该定理指出:
如果一个时间序列是纯随机的,基于 个观测值计算得到的样本自相关系数 ()近似服从均值为0、方差为 的正态分布:
由Bartlett定理可推导出两个重要结论:
- 标准化自相关系数的分布:
在白噪声原假设下,不同滞后阶的样本自相关系数在大样本下渐近相互独立,因此 可视为 个相互独立的标准正态变量。
- 平方和的卡方分布(基于独立同分布标准正态变量的性质):
检验统计量的构造
基于上述理论,统计学家构造了两种常用的检验统计量:
1. Q统计量(Box-Pierce统计量) 其中 为样本量, 为检验的最大滞后阶数。
2. LB统计量(Ljung-Box统计量) LB统计量是对Q统计量的改进,在小样本情况下具有更好的性质,是目前更常用的检验统计量。
判别原则与p值解读
假设检验的判别基于显著性水平 (通常取0.05):
拒绝原假设(序列非白噪声):
- 当检验统计量大于 分位点,或
- 该统计量的p值小于 时
则可以在 显著性水平下拒绝原假设,认为该序列为非白噪声序列。
无法拒绝原假设(不能显著拒绝序列为白噪声):
- 当检验统计量小于 分位点,或
- 该统计量的p值大于 时
则认为在 显著性水平下无法拒绝原假设。
滞后阶数 的选择:
- 理论上应检验多个不同的 值
- 实践中常用 和 ,这既能覆盖短期相关性,又符合许多经济数据的周期性特征
- 对于季节性数据, 应至少包含一个完整的季节周期
Python实战:白噪声检验全流程
环境准备与数据生成
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.stats.diagnostic import acorr_ljungbox
from statsmodels.graphics.tsaplots import plot_acf
import warnings
warnings.filterwarnings('ignore')
# 设置随机种子确保结果可复现
np.random.seed(42)
# 生成两个对比序列
n = 200 # 样本量
# 1. 纯随机白噪声序列 WN(0, 1)
white_noise = np.random.normal(0, 1, n)
# 2. 非纯随机序列:AR(1)过程,φ=0.7
ar_series = np.zeros(n)
for t in range(1, n):
ar_series[t] = 0.7 * ar_series[t-1] + np.random.normal(0, 1)
# 转换为pandas Series便于分析
wn_series = pd.Series(white_noise, name='白噪声序列')
ar_series = pd.Series(ar_series, name='AR(1)序列')
print("序列基本信息:")
print(f"白噪声序列:均值={wn_series.mean():.4f}, 方差={wn_series.var():.4f}")
print(f"AR(1)序列:均值={ar_series.mean():.4f}, 方差={ar_series.var():.4f}")可视化分析:时序图与自相关图
# 创建可视化对比
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
# 白噪声时序图
axes[0, 0].plot(wn_series)
axes[0, 0].axhline(y=0, color='r', linestyle='--', alpha=0.5)
axes[0, 0].set_title('白噪声序列时序图')
axes[0, 0].set_xlabel('时间')
axes[0, 0].set_ylabel('观测值')
# 白噪声自相关图
plot_acf(wn_series, lags=20, ax=axes[0, 1], title='白噪声自相关图')
axes[0, 1].set_xlabel('滞后阶数')
# AR(1)时序图
axes[1, 0].plot(ar_series)
axes[1, 0].axhline(y=0, color='r', linestyle='--', alpha=0.5)
axes[1, 0].set_title('AR(1)序列时序图')
axes[1, 0].set_xlabel('时间')
axes[1, 0].set_ylabel('观测值')
# AR(1)自相关图
plot_acf(ar_series, lags=20, ax=axes[1, 1], title='AR(1)自相关图')
axes[1, 1].set_xlabel('滞后阶数')
plt.tight_layout()
plt.show()Ljung-Box纯随机性检验
# 对白噪声序列进行Ljung-Box检验
print("--- 白噪声序列 Ljung-Box 检验 ---")
lb_wn = acorr_ljungbox(white_noise, lags=[6, 12], return_df=True)
for idx, row in lb_wn.iterrows():
lag = row.name
lb_stat = row['lb_stat']
p_value = row['lb_pvalue']
decision = "无法拒绝白噪声原假设" if p_value > 0.05 else "拒绝白噪声原假设"
print(f"滞后 {lag} 期: LB统计量 = {lb_stat:.4f}, p值 = {p_value:.4f} → {decision}")
print("\n--- 非纯随机序列 (AR1) Ljung-Box 检验 ---")
lb_ar = acorr_ljungbox(ar_series, lags=[6, 12], return_df=True)
for idx, row in lb_ar.iterrows():
lag = row.name
lb_stat = row['lb_stat']
p_value = row['lb_pvalue']
decision = "无法拒绝白噪声原假设" if p_value > 0.05 else "拒绝白噪声原假设"
print(f"滞后 {lag} 期: LB统计量 = {lb_stat:.4f}, p值 = {p_value:.4e} → {decision}")运行上述代码,我们得到以下输出结果:
--- 白噪声序列 Ljung-Box 检验 ---
滞后 6 期: LB统计量 = 6.8443, p值 = 0.3355 → 无法拒绝白噪声原假设
滞后 12 期: LB统计量 = 10.4563, p值 = 0.5760 → 无法拒绝白噪声原假设
--- 非纯随机序列 (AR1) Ljung-Box 检验 ---
滞后 6 期: LB统计量 = 156.9685, p值 = 2.5961e-31 → 拒绝白噪声原假设
滞后 12 期: LB统计量 = 167.1336, p值 = 1.1342e-29 → 拒绝白噪声原假设结果解读与决策
白噪声序列检验结果:
- 滞后6期:p值=0.3355 > 0.05,无法拒绝原假设
- 滞后12期:p值=0.5760 > 0.05,无法拒绝原假设
- 结论:该序列是纯随机的白噪声序列,没有进一步建模分析的价值
AR(1)序列检验结果:
- 滞后6期:p值=2.5961e-31 ≈ 0 < 0.05,拒绝原假设
- 滞后12期:p值=1.1342e-29 ≈ 0 < 0.05,拒绝原假设
- 结论:该序列不是白噪声,存在显著的自相关结构,具有建模分析的价值
实际案例:北京市城乡居民定期储蓄比例分析
让我们通过一个实际案例巩固所学知识。考虑1950-1998年北京市城乡居民定期储蓄所占比例的时间序列:
# 模拟北京市城乡居民定期储蓄比例数据(基于课程示例)
# 实际分析中应使用真实数据,这里为教学目的生成模拟数据
np.random.seed(123)
years = np.arange(1950, 1999)
n_years = len(years)
# 生成具有趋势和季节性的非平稳序列(模拟原始数据)
trend = 0.5 + 0.015 * np.arange(n_years) # 线性增长趋势
seasonal = 0.1 * np.sin(2 * np.pi * np.arange(n_years) / 10) # 10年周期
noise = 0.05 * np.random.normal(size=n_years)
original_series = trend + seasonal + noise
# 进行一阶差分消除趋势(模拟平稳化处理)
stationary_series = np.diff(original_series)
print("--- 北京市城乡居民定期储蓄比例分析 ---")
print(f"原始序列样本量: {len(original_series)}")
print(f"平稳化后序列样本量: {len(stationary_series)}")
# 对平稳化后的序列进行纯随机性检验
lb_res = acorr_ljungbox(stationary_series, lags=[6, 12], return_df=True)
print("\n纯随机性检验结果:")
for idx, row in lb_res.iterrows():
lag = row.name
lb_stat = row['lb_stat']
p_value = row['lb_pvalue']
if p_value < 0.001:
p_display = "<0.0001"
else:
p_display = f"{p_value:.4f}"
decision = "非白噪声序列" if p_value < 0.05 else "白噪声序列"
print(f"滞后{lag}期: LB统计量={lb_stat:.2f}, p值{p_display} → {decision}")运行结果可能显示:
--- 北京市城乡居民定期储蓄比例分析 ---
原始序列样本量: 49
平稳化后序列样本量: 48
纯随机性检验结果:
滞后6期: LB统计量=75.46, p值<0.0001 → 非白噪声序列
滞后12期: LB统计量=82.57, p值<0.0001 → 非白噪声序列分析结论:经过平稳化处理后的北京市城乡居民定期储蓄比例序列,其LB检验的p值远小于0.05,因此我们在 5% 显著性水平下拒绝”序列是白噪声”的原假设。这意味着该序列不仅平稳,而且具有内在的相关结构,值得进一步建立时间序列模型进行分析预测。
📝 动手练一练
白噪声识别练习 使用以下代码生成三个序列,分别判断哪些是白噪声序列,并解释你的判断依据:
import numpy as np np.random.seed(2024) # 序列A:标准正态白噪声 series_a = np.random.normal(0, 1, 100) # 序列B:带线性趋势的序列 series_b = 0.5 + 0.02*np.arange(100) + np.random.normal(0, 0.5, 100) # 序列C:MA(1)过程,θ=0.5 eps = np.random.normal(0, 1, 101) series_c = eps[1:] + 0.5*eps[:-1]检验结果解读练习 某时间序列的Ljung-Box检验结果如下:
滞后6期: LB统计量=15.82, p值=0.0146 滞后12期: LB统计量=22.37, p值=0.0338在显著性水平α=0.05下:
- 应接受还是拒绝”序列是白噪声”的原假设?
- 如果α=0.01,结论会改变吗?
- 这个序列是否适合进行时间序列建模?
参考答案:
- 序列A是白噪声(纯随机波动),序列B非平稳(有明显趋势),序列C是平稳非白噪声(MA(1)过程)。判断依据:序列A的自相关系数应全部不显著,序列B的时序图显示明显趋势,序列C的一阶自相关系数应显著不为零。
- α=0.05时,两个p值均小于0.05,应拒绝原假设,认为序列非白噪声,适合建模。α=0.01时,p值均大于0.01,无法拒绝原假设,但此时犯第二类错误(漏报)的风险较高,通常仍会认为序列有弱相关性。
本章小结
本节系统介绍了时间序列预处理中的纯随机性检验(白噪声检验),这是判断一个平稳序列是否具有分析价值的关键步骤。
核心要点回顾
白噪声序列的定义:同时满足常数均值、常数方差和序列值互不相关三个条件的特殊平稳序列。
检验的必要性:所有白噪声都是平稳的,但并非所有平稳序列都有研究价值。纯随机性检验帮助我们从平稳序列中筛选出具有内在相关结构的序列。
检验原理:基于Bartlett定理,检验延迟期自相关系数是否显著不为零。
检验方法:Ljung-Box检验(LB统计量)是当前最常用的纯随机性检验方法,对小样本情况更稳健。
决策规则:当p值小于显著性水平(通常0.05)时,拒绝”序列是白噪声”的原假设,认为序列具有建模价值。
行动清单
学完本节内容,你可以立即开始:
建立系统分析流程:对任何时间序列数据,先进行平稳性检验,再对平稳序列进行纯随机性检验,形成”平稳性→纯随机性”的两步预处理框架。
Python实战应用:使用
statsmodels.stats.diagnostic.acorr_ljungbox函数对实际数据(如股票收益率、气温变化、销售数据等)进行白噪声检验,并根据p值做出统计决策。结果可视化解读:结合时序图和自相关图,从图形和统计检验两个角度综合判断序列性质,培养数据直觉与统计思维并重的分析能力。
通过本节学习,你已经掌握了判断时间序列是否”值得分析”的关键技术。下一节我们将开始学习时间序列建模的核心内容——AR、MA、ARMA等经典模型,开启从数据预处理到模型构建的完整分析之旅。
— 小象教研组
领取《小象 11GB VIP 课件资料包与大厂真题手册》
包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。
- ✔完整 Python / 数据分析 Jupyter 实战源码
- ✔大厂真实业务数据集与练习题
- ✔微信扫码添加顾问免费领取;想学什么,直接告诉顾问
微信扫码添加顾问