从零构建ARIMA模型前必须完成的4步平稳化处理,R代码全解析

第一章:ARIMA模型与时间序列平稳性概述

在时间序列分析中,ARIMA(AutoRegressive Integrated Moving Average)模型是预测未来值的重要工具,广泛应用于金融、气象、销售等领域。该模型结合了自回归(AR)、差分(I)和移动平均(MA)三个部分,能够有效处理非平稳时间序列数据。

ARIMA模型的基本构成

ARIMA(p, d, q) 模型由三个参数决定:
  • p:自回归项的阶数,表示当前值依赖于前p个历史值
  • d:差分次数,用于将原始序列转换为平稳序列
  • q:移动平均项的阶数,表示当前误差依赖于前q个误差项

时间序列的平稳性

平稳性是应用ARIMA模型的前提条件。一个平稳的时间序列需满足均值、方差和自协方差不随时间变化。常见的检验方法包括:
  1. 观察时序图判断趋势与波动
  2. 使用单位根检验(如ADF检验)进行统计验证
检验方法原假设显著性表现
ADF检验序列存在单位根(非平稳)p值小于0.05则拒绝原假设,认为平稳

差分操作示例

当序列非平稳时,需通过差分使其平稳。以下为Python中的一阶差分实现:

import pandas as pd

# 假设data是时间序列数据
data_diff = data.diff().dropna()  # 一阶差分并移除缺失值

# 输出差分后结果
print(data_diff.head())

# ADF检验
from statsmodels.tsa.stattools import adfuller
result = adfuller(data_diff)
print(f'ADF Statistic: {result[0]}')
print(f'p-value: {result[1]}')
graph LR A[原始时间序列] --> B{是否平稳?} B -- 否 --> C[进行差分] C --> D[再次检验平稳性] D --> B B -- 是 --> E[拟合ARIMA模型]

第二章:时间序列数据的初步探索与诊断

2.1 平稳性的定义与三要素解析

在时间序列分析中,平稳性是建模的基础前提。一个平稳序列的统计特性不随时间变化而改变,其核心体现在三个要素:均值恒定、方差不变和协方差仅与时间间隔相关。
平稳性的三要素
  • 均值恒定:任意时刻的期望值保持一致,即 $E[X_t] = \mu$ 对所有 $t$ 成立;
  • 方差不变:序列波动幅度稳定,$\text{Var}(X_t) = \sigma^2$ 不随时间改变;
  • 自协方差仅依赖于滞后:$\text{Cov}(X_t, X_{t-k})$ 只与时间差 $k$ 有关。
代码示例:生成平稳序列
import numpy as np
np.random.seed(42)
# 生成白噪声序列(典型平稳序列)
stationary_series = np.random.normal(loc=0.0, scale=1.0, size=1000)
该代码生成均值为0、标准差为1的高斯白噪声序列。其均值与方差长期稳定,且不同时间点间的协方差为零(仅当滞后为0时非零),满足严平稳条件,常用于基准测试。

2.2 时序图可视化识别趋势与季节性

时序图是分析时间序列数据的基础工具,能够直观展现数据随时间变化的趋势与周期性模式。通过观察折线图中的长期上升或下降方向,可识别**趋势成分**;而规律性重复的波峰波谷则暗示着**季节性特征**。
常用可视化方法
  • 折线图:展示原始数据走势
  • 分解图:将时间序列拆解为趋势、季节性和残差三部分
Python 示例代码

from statsmodels.tsa.seasonal import seasonal_decompose
import matplotlib.pyplot as plt

result = seasonal_decompose(series, model='additive', period=12)
result.plot()
plt.show()
该代码使用 seasonal_decompose 函数对序列进行成分分离,period=12 指定年度季节性周期,适用于月度数据。分解后可通过子图分别观察趋势项的缓慢变动与季节项的重复模式。

2.3 自相关函数(ACF)与偏自相关函数(PACF)解读

ACF 与 PACF 的基本概念
自相关函数(ACF)衡量时间序列与其滞后版本之间的线性相关性,包含间接依赖。偏自相关函数(PACF)则剔除中间滞后项的影响,仅保留直接相关性,用于识别 AR 模型的阶数。
可视化判别模型阶数
通过 ACF 和 PACF 图可初步判断 ARIMA 模型参数:
  • ACF 拖尾 + PACF 在滞后 p 阶后截尾 → AR(p) 模型
  • ACF 在滞后 q 阶后截尾 + PACF 拖尾 → MA(q) 模型
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import matplotlib.pyplot as plt

fig, ax = plt.subplots(2, 1)
plot_acf(data, ax=ax[0], lags=20)
plot_pacf(data, ax=ax[1], lags=20)
plt.show()
上述代码绘制前 20 阶的 ACF 与 PACF 图。lags 参数控制最大滞后阶数,ax 指定子图位置,便于对比分析。

2.4 单位根检验原理与ADF检验R实现

时间序列的平稳性是构建可靠计量模型的前提。单位根检验用于判断序列是否具有随机趋势,其中扩展迪基-福勒(ADF)检验应用最为广泛。
ADF检验基本原理
ADF检验通过检验回归模型中自回归系数是否为1(即存在单位根)来判断平稳性。原假设为序列非平稳,若检验统计量小于临界值,则拒绝原假设。
R语言实现

library(tseries)
# 生成非平稳序列
set.seed(123)
ts_data <- cumsum(rnorm(100))

# 执行ADF检验
adf_result <- adf.test(ts_data, alternative = "stationary", k = 1)
print(adf_result)
代码中 adf.test() 函数对序列进行ADF检验,参数 k=1 指定滞后阶数,alternative = "stationary" 表示备择假设为平稳过程。
输出项含义
Dickey-Fuller检验统计量
p-value显著性概率,小于0.05拒绝单位根

2.5 KPSS检验与多种检验结果对比分析

KPSS检验用于判断时间序列是否具有趋势平稳性,其原假设为序列平稳,与ADF、PP等检验形成互补。
常见单位根检验方法对比
  • ADF检验:假设存在单位根(非平稳),适用于检测差分平稳序列;
  • PP检验:与ADF类似,但对异方差性更具鲁棒性;
  • KPSS检验:原假设为平稳,常用于验证ADF结果的稳健性。
检验结果对照表
检验类型原假设备择假设结论方向
KPSS平稳存在单位根p值<0.05 → 非平稳
ADF存在单位根平稳p值<0.05 → 平稳

from statsmodels.tsa.stattools import kpss
stat, p_val, lags, crit_vals = kpss(series, regression='ct')
print(f"KPSS Statistic: {stat}, p-value: {p_val}")
# regression='ct' 表示包含趋势项;'c' 仅含截距
该代码执行KPSS检验,输出统计量与p值。当p值小于显著性水平时,拒绝平稳原假设,提示序列可能非平稳。结合ADF结果可综合判断序列特性。

第三章:非平稳序列的成因识别与分解

3.1 趋势性来源识别与确定性趋势建模

在时间序列分析中,识别趋势性来源是构建预测模型的首要步骤。常见趋势来源包括政策变化、用户增长和季节性活动。
趋势成分分解
使用加法模型将序列分解为趋势、周期和残差项:
from statsmodels.tsa.seasonal import seasonal_decompose
result = seasonal_decompose(series, model='additive', period=12)
trend_component = result.trend.dropna()
该代码提取出长期趋势项,period=12 适用于月度数据的年度周期,dropna() 处理边缘缺失值。
确定性趋势建模方法
常用线性与多项式拟合捕捉趋势形态:
  • 线性回归:适用于稳定增长场景
  • 二次项模型:捕捉加速或减速趋势
  • 分段线性回归:响应结构断点变化

3.2 季节性检测:STL分解与周期成分提取

STL分解原理
STL(Seasonal and Trend decomposition using Loess)是一种鲁棒的时序分解方法,能将时间序列拆解为趋势(Trend)、季节性(Seasonal)和残差(Residual)三部分。其核心优势在于对异常值不敏感,并支持可变季节模式。
Python实现示例
from statsmodels.tsa.seasonal import STL
import pandas as pd

# 假设data是包含'value'列的时间序列数据
stl = STL(data['value'], seasonal=13, robust=True)
result = stl.fit()

# 提取各成分
trend = result.trend
seasonal = result.seasonal
resid = result.resid
上述代码中,seasonal=13 表示季节周期长度,通常为奇数以保证Loess平滑效果;robust=True 启用异常值鲁棒性处理,提升分解稳定性。
分解结果应用
  • 季节性成分可用于识别周期规律,如月度、季度波动;
  • 趋势成分辅助长期走势分析;
  • 残差用于异常检测或建模误差评估。

3.3 随机波动与条件异方差初步判断

在金融时间序列分析中,随机波动常表现为方差随时间变化的非恒定特性。识别条件异方差性是建模前的关键步骤。
可视化波动聚集现象
观察收益率序列是否存在“波动聚集”——即大幅波动后倾向于跟随大幅波动,小幅波动后跟随小幅波动。这是条件异方差的典型特征。
自相关检验辅助判断
对平方收益率序列进行自相关函数(ACF)检验,若存在显著滞后相关性,则表明存在GARCH效应。

import statsmodels.api as sm
from scipy import stats

# 检验平方收益的自相关性
acf, qstat, pval = sm.stats.acorr_ljungbox(resid**2, lags=10)
print("Ljung-Box Q统计量p值:", pval)
上述代码使用Ljung-Box检验判断残差平方是否存在显著自相关。若多数p值小于0.05,说明应拒绝无自相关的原假设,支持引入GARCH类模型。
常见判别流程总结
  • 绘制收益率时序图,观察波动聚集性
  • 检验序列均值是否平稳(ADF检验)
  • 对残差平方进行自相关检验
  • 初步判断是否需采用ARCH/GARCH模型

第四章:平稳化处理的核心技术与R实践

4.1 差分操作:一阶与季节性差分R代码详解

在时间序列建模中,差分是消除趋势与季节性、实现平稳性的关键步骤。通过一阶差分可去除线性趋势,而季节性差分则针对周期性波动。
一阶差分实现
# 对时间序列x进行一阶差分
diff_x <- diff(x, differences = 1)
diff() 函数中,differences = 1 表示执行一阶差分,即当前值减去前一时刻值,适用于消除趋势成分。
季节性差分实现
# 对月度数据执行周期为12的季节性差分
seasonal_diff <- diff(x, lag = 12, differences = 1)
参数 lag = 12 指定按年周期进行差分,常用于消除年度季节模式,如零售销售额中的节假日效应。
组合差分策略
实际应用中常先进行季节性差分,再进行一阶差分,以同时消除周期与趋势。该顺序有助于更准确识别ARIMA模型参数。

4.2 对数变换与Box-Cox变换稳定方差

在时间序列和回归分析中,异方差性会严重影响模型的稳定性与预测精度。对数变换是一种简单有效的方差稳定手段,适用于正值且右偏的数据。通过将原始数据 $ y $ 转换为 $ \log(y) $,可压缩数量级差异,使波动趋于平稳。
常用变换方式对比
  • 对数变换:适用于乘法关系转加法,如 $ y' = \log(y + 1) $
  • Box-Cox变换:更通用的幂变换族,定义为:
    from scipy.stats import boxcox
    import numpy as np
    
    # 示例数据(必须为正)
    data = np.array([1, 2, 4, 8, 16])
    transformed_data, lambda_opt = boxcox(data)
    print(f"最优λ: {lambda_opt:.2f}")
        
    参数说明:当 $\lambda = 0$ 时等价于对数变换;否则为 $(y^\lambda - 1)/\lambda$。
适用场景选择
方法数据要求优势
对数变换正值,指数增长解释性强,计算简便
Box-Cox严格正值自动优化参数,适应性广

4.3 去趋势与去季节性的完整流程实现

在时间序列分析中,去除趋势和季节性是建模前的关键预处理步骤。通过差分、滤波或模型拟合方法可有效提取平稳成分。
去趋势处理
使用线性回归拟合原始序列中的趋势项,再从原序列中减去该趋势。适用于缓慢变化的长期趋势。

import numpy as np
from sklearn.linear_model import LinearRegression

# 构造时间变量
t = np.arange(len(series)).reshape(-1, 1)
model = LinearRegression().fit(t, series)
trend = model.predict(t)
detrended = series - trend
上述代码利用线性模型提取趋势,series为输入时间序列,detrended为去趋势后结果。
去季节性处理
采用周期性均值法:计算每个周期(如每月)的平均偏差,逐点减去对应周期的季节因子。
  1. 识别季节周期长度(如12个月)
  2. 计算各周期位置的平均值
  3. 构造季节因子序列并从原序列中扣除

4.4 平稳化后检验:联合验证平稳性达标

在完成时间序列的差分或变换处理后,需通过联合检验确认其平稳性是否达标。单一检验方法可能受数据特征影响产生误判,因此建议结合多种统计检验进行交叉验证。
常用平稳性检验方法对比
  • ADF检验:检验是否存在单位根,原假设为非平稳;
  • KPSS检验:原假设为平稳,适用于趋势平稳序列;
  • PP检验:对自相关性鲁棒,适合高阶序列相关场景。
联合验证代码实现
from statsmodels.tsa.stattools import adfuller, kpss

def joint_stationarity_test(series):
    adf_result = adfuller(series)
    kpss_result = kpss(series, regression='c')
    
    is_adf_stationary = adf_result[1] < 0.05  # p-value < 0.05 拒绝非平稳
    is_kpss_stationary = kpss_result[1] > 0.05  # p-value > 0.05 接受平稳
    
    return is_adf_stationary and is_kpss_stationary
该函数通过ADF与KPSS双检验逻辑“与”操作提升判断可靠性。仅当序列同时通过两种检验时,才认定其平稳性达标,有效降低误判风险。

第五章:迈向ARIMA建模的关键一步

数据平稳性检验
在构建ARIMA模型前,必须确保时间序列具备平稳性。常用的方法是ADF(Augmented Dickey-Fuller)检验。若p值大于0.05,则序列非平稳,需进行差分处理。
  • 原始序列趋势明显,存在季节性波动
  • 一阶差分后,ADF检验p值降至0.01以下
  • ACF图显示拖尾特性,符合ARIMA建模前提
参数选择与模型识别
通过观察ACF和PACF图,初步判断ARIMA(p,d,q)中的p与q值。d由差分次数确定,本例中d=1。
模型组合AIC值BIC值
ARIMA(1,1,1)643.2653.8
ARIMA(2,1,1)639.5652.7
ARIMA(1,1,2)641.1654.3
最终选定ARIMA(2,1,1),因其AIC最低且残差接近白噪声。
模型拟合与预测实现
使用Python的statsmodels库完成建模过程:

import pandas as pd
from statsmodels.tsa.arima.model import ARIMA

# 拟合模型
model = ARIMA(data, order=(2,1,1))
fitted_model = model.fit()

# 输出摘要
print(fitted_model.summary())

# 向前预测5期
forecast = fitted_model.forecast(steps=5)
残差分析图示: [残差时序图] — 波动均匀 [Q-Q图] — 点近直线,正态性良好 [Ljung-Box检验] — p > 0.05,无自相关
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值