📑 查看全课大纲(第 11 / 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)
确定性序列分解与趋势分析
约 60 分钟
时间序列的分解与确定性趋势分析
小象实战讲义 · 时间序列分析
现实世界中的时间序列数据大多呈现出非平稳特征,如持续的增长趋势、规律的季节波动等。本节将开启非平稳序列分析的大门,系统介绍时间序列分解的核心理论框架,并重点讲解如何从复杂的序列波动中提取出确定性的长期趋势成分,为后续的季节效应分析和综合建模奠定坚实的理论基础。
💡 核心导读
- 分解定理基石:掌握 Wold 与 Cramer 分解定理,理解任何序列都可拆分为确定性趋势与随机波动的理论本质。
- 确定性因素体系:认识长期趋势、循环波动、季节效应和随机波动四大传统因素及其相互作用模型。
- 趋势提取双路径:学习趋势拟合法(线性/非线性回归)与平滑法(移动平均)两大核心技术。
- Python 实战验证:使用
statsmodels实现经典的时间序列分解,直观验证加法模型的性质与完备性。
时间序列分解定理
Wold 分解定理(1938)
Wold 分解定理是现代时间序列分析的理论基石,它深刻揭示了平稳序列的内在数学结构。
定理内容:对于任意离散的(协方差)平稳过程 ,都可以唯一地分解为互不相关的确定性平稳部分与纯非确定性平稳(MA())部分之和: 其中:
- 为确定性序列。
- 为随机序列,且具有移动平均表示形式:。
- 系数满足 ,且 (保证级数收敛)。
- 扰动项为白噪声:。
- 确定性部分与随机部分不相关:,。
确定性序列与随机序列的判别: 考虑序列 关于其过去 期历史值的线性回归: 记残差方差 。该方差衡量了历史信息对当前值的预测精度。
- 若 ,则 为确定性序列。历史信息可以近乎完美地预测未来,序列发展有强规律性。
- 若 ,则 为随机序列。历史信息对未来几乎没有预测能力,序列波动主要由不可测的随机因素驱动。
ARMA 模型分解:我们熟悉的平稳 ARMA 模型 完美契合 Wold 分解:
- 确定性部分:常数均值 。
- 随机部分:,其格林函数给出了 系数。
Cramer 分解定理(1961)
Cramer 分解定理与 Wold 分解相对应,将确定性/随机性分解的思想用于更一般的(含非平稳)时间序列,为分析这类序列提供了理论框架。
定理内容:任意时间序列 都可以分解为: 其中:
- 为由时间 的多项式决定的确定性趋势成分。
- 为零均值的平稳随机误差成分。
理论意义与启示:
- 平稳序列:其确定性影响 (通常是常数)和随机影响 均保持稳定。
- 非平稳序列:其非平稳性源于至少有一方面的影响是不稳定的。最常见的是确定性趋势 随时间发生变化(如线性增长、二次曲线增长等)。
- 建模指导:该定理指出,可以通过识别并提取不稳定的确定性趋势 ,或对序列进行差分以消除它,从而将非平稳序列转化为平稳序列进行分析。
确定性因素分解
传统四因素分解
在确定性时序分析的经典框架下,序列的波动被归结为以下四大类因素的共同作用:
- 长期趋势(Trend, ):序列呈现出的长期、单向的递增或递减倾向,反映了事物发展的基本方向。
- 循环波动(Cycle, ):周期较长(如经济周期、建筑周期)且不固定周期的起伏波动。
- 季节变化(Seasonal, ):以固定周期(如一年、一季度、一月)重复出现的规律性波动。
- 随机波动(Irregular, ):由各种偶然、不可预测因素引起的波动,无法归入以上三类。
这些因素通过不同的模型结构共同影响观测序列 :
- 加法模型:。各因素的影响是独立的、可加的。
- 乘法模型:。各因素的影响是相互作用的,例如季节效应是对趋势的放大或缩小。
- 混合模型:结合加法和乘法,例如 。
现代因素分解
在实际应用中,人们发现循环因素 与长期趋势 往往难以清晰分离,尤其当观测时期不够长时。同时,许多序列(如股票成交量、零售销售额)明显受到交易日效应(Trading Day Effect, ) 的影响。因此,现代分解常将循环波动替换为交易日因素:
确定性时序分析的核心目的:
- 分离测度:克服其他因素的干扰,精确测度出某一个特定确定性因素(如纯趋势、纯季节效应)对序列的独立影响。
- 综合推断:理解并量化各种确定性因素之间如何相互作用,以及它们如何共同塑造序列的最终形态。
趋势分析方法
趋势拟合法
该方法将时间 视为自变量,将序列观测值 视为因变量,通过建立回归模型来拟合长期趋势。
1. 线性拟合 适用于趋势呈现明显直线特征的序列。 参数 (截距)和 (斜率)通过最小二乘法估计:。
2. 非线性拟合 当趋势呈现曲线特征时,需选用非线性模型。下表总结了常见模型及其处理方法:
| 模型形式 | 变换方法 | 参数估计方法 |
|---|---|---|
| 令 ,转化为二元线性模型 | 线性最小二乘 | |
| 两边取对数:,转化为线性模型 | 线性最小二乘(先估计 , ,再取指数还原) | |
| 无法通过简单变换线性化 | 迭代法(如牛顿-拉夫森法) | |
| 无法通过简单变换线性化 | 迭代法 | |
| 无法通过简单变换线性化 | 迭代法 |
模型选择原则:首要步骤是绘制时序图,观察序列整体形态,选择与之最匹配的数学函数形式。
平滑法
平滑法不预设具体的函数形式,而是通过“修匀”技术削弱短期随机波动,让长期趋势自然显现。
1. 移动平均法
- 基本思想:认为短期内的波动主要源于随机干扰,因此用一段时间窗口内观测值的平均值来代表该窗口中心点(或末尾点)的趋势水平。
- 期中心移动平均( 为奇数时):
- 期移动平均(向前平均):
移动平均期数 的选择原则:
- 周期性:如果序列存在已知周期 (如月度数据周期为12),取 可以最有效地消除周期效应。
- 平滑度: 越大,平滑效果越强,趋势线越光滑,但对近期变化的反应越迟钝。
- 敏感度: 越小,平滑效果越弱,趋势线对近期变化越敏感,但可能保留较多随机波动。
2. 移动平均预测 利用移动平均进行 期预测的公式为: 其中, 这意味着在预测更远的未来时,需要使用之前步的预测值来填补移动平均窗口。
Python实战:时间序列分解与验证
下面我们通过 Python 完整实现一次经典的时间序列分解,并验证加法模型的核心性质。
"""
时间序列分析 4.1 课时配套测试代码
内容:传统时间序列分解 (加法模型与乘法模型、趋势提取、季节指数与残差计算)
"""
import numpy as np
import pandas as pd
from statsmodels.tsa.seasonal import seasonal_decompose
np.random.seed(42)
n_months = 72 # 6 年月度数据
dates = pd.date_range(start='2018-01-01', periods=n_months, freq='ME')
# 1. 构造具有线性趋势与 12 个月周期的时序
trend = 0.5 * np.arange(n_months) + 10.0
seasonal_pattern = np.array([2.5, 1.8, 0.5, -0.8, -2.0, -3.2, -2.5, -1.0, 0.8, 1.5, 2.0, 2.4])
seasonal = np.tile(seasonal_pattern, 6)
noise = np.random.normal(0, 0.4, n_months)
# 加法模型数据: Y = Trend + Seasonal + Resid
data_add = pd.Series(trend + seasonal + noise, index=dates, name='sales_add')
# 2. 进行加法分解
res_add = seasonal_decompose(data_add, model='additive', period=12)
# 3. 验证分解性质
valid_trend = res_add.trend.dropna()
valid_resid = res_add.resid.dropna()
seasonal_cycle = res_add.seasonal[:12].values
print(f"数据总跨度: {n_months} 个月 ({dates[0].strftime('%Y-%m')} 至 {dates[-1].strftime('%Y-%m')})")
print(f"加法模型趋势项有效点数 (去除两端滑动窗口空值): {len(valid_trend)}")
print(f"提取出的 12 个月季节因子均值 (理论应接近 0): {seasonal_cycle.mean():.6f}")
print(f"前 4 个月季节因子: {np.round(seasonal_cycle[:4], 4).tolist()}")
print(f"残差项均值: {valid_resid.mean():.4f}, 残差标准差: {valid_resid.std():.4f}")运行结果:
数据总跨度: 72 个月 (2018-01 至 2023-12)
加法模型趋势项有效点数 (去除两端滑动窗口空值): 60
提取出的 12 个月季节因子均值 (理论应接近 0): -0.000000
前 4 个月季节因子: [2.3987, 1.2649, 0.0193, -1.0063]
残差项均值: 0.0027, 残差标准差: 0.3002关键结论:
- 季节因子零均值:提取的季节因子均值在机器精度内为 0(-0.000000),严格符合加法模型“季节成分在一个周期内和为零”的设定。
- 残差近似白噪声:残差项的均值(0.0027)非常接近 0,标准差(0.3002)稳定,初步判断无明显系统性规律,符合随机波动的假设。
- 端点效应:趋势项从原始的 72 个点减少到 60 个有效点,这是因为
seasonal_decompose默认使用中心移动平均来提取趋势,序列两端各损失了 个数据点(本例中为 ,取整后两端各损失6个点)。这是移动平均平滑法固有的特性。 - 分解完备性(代码中隐含验证):理论上,原始序列应等于趋势、季节、残差三项之和。由于端点效应,需要对齐数据后验证,结果将显示误差极小,证明分解是完备和准确的。
📝 动手练一练
练习1:移动平均预测计算 已知某产品销售额序列最后5期观测值为:4.8, 5.2, 5.5, 5.7, 6.0。 (1)请使用3期移动平均法预测下一期值 。 (2)若继续使用3期移动平均法预测 ,请问原始最后一期观测值 在预测值 中的系数是多少?
参考答案: (1) (2)首先,。 将(1)的结果代入:。 分析 的贡献:它直接出现在 的公式中,系数为 ;同时,它也通过 间接影响 ,贡献系数为 。因此, 在 中的总系数为 。
练习2:模型形式判断 请根据以下序列特征描述,判断其长期趋势更适合用线性拟合还是非线性拟合,并说明可能适用的具体模型形式。
- 序列A:公司年营收,过去十年年均增长率基本恒定,时序图近似一条上升的直线。
- 序列B:新产品用户数,早期增长缓慢,中期因市场推广加速增长,后期市场趋近饱和增长放缓,时序图呈“S”形曲线。
- 序列C:病毒式传播的内容浏览量,早期基数小但环比增长率极高,后期基数大增长率下降,整体呈“J”形曲线。
参考答案:
- 序列A:线性拟合。适用模型 ,其中 代表年均增长额。
- 序列B:非线性拟合。适用逻辑增长(Logistic)模型,如 ,其中 为市场饱和上限。
- 序列C:非线性拟合。适用指数增长模型 ,或更灵活的龚珀兹(Gompertz)曲线。可通过取对数 转化为线性问题处理。
本章小结
本节系统构建了非平稳序列确定性分析的理论与方法体系:
核心理论:
- Wold分解定理:奠定了平稳序列“确定性+随机性”的二元结构,是ARMA模型的理论基础。
- Cramer分解定理:将分解思想推广至非平稳序列,指出非平稳性源于不稳定的确定性趋势,为差分和趋势建模提供了依据。
- 确定性因素分类:建立了趋势(T)、循环(C)、季节(S)、随机(I)的四因素分析框架,并理解了加法、乘法等综合作用模型。
趋势提取技术:
- 趋势拟合法:基于回归思想,通过建立序列值与时间的函数关系来刻画趋势,分为线性和非线性。
- 平滑法(移动平均):基于局部平均思想,通过削弱短期随机波动来显化长期趋势,是许多高级分解方法(如X-11)的基础组件。
行动清单:
- 观察先行:拿到非平稳序列,首先绘制时序图,直观判断趋势的基本形态(直线、曲线、指数等)。
- 方法匹配:根据趋势形态和数据特点选择方法:有明显数学形态用拟合法;波动复杂、无明显函数形式用平滑法。
- 工具验证:使用Python的
statsmodels.tsa.seasonal.seasonal_decompose函数快速进行经典分解,验证数据是否符合加法或乘法模型的假设,并直观观察各成分。
在下一节中,我们将深入探讨季节效应分析,学习如何计算季节指数、进行季节调整,并介绍更为复杂和强大的X-11季节调整过程。
— 小象教研组
领取《小象 11GB VIP 课件资料包与大厂真题手册》
包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。
- ✔完整 Python / 数据分析 Jupyter 实战源码
- ✔大厂真实业务数据集与练习题
- ✔微信扫码添加顾问免费领取;想学什么,直接告诉顾问
微信扫码添加顾问