时间序列分析基础:概念、特性与表示 | Foundations of Time Series Analysis: Concepts, Properties, and Representations
时间序列分析基础:概念、特性与表示
导言
时间序列数据无处不在:从金融市场的日收盘价到心电图的连续采样,从工业传感器的温度读数到社交媒体平台的用户活跃度计数。然而,这些看似简单的数字序列背后,隐藏着普通横截面数据所不具备的复杂结构与依赖关系。一个根本性的问题是:如何从数学上严格定义时间序列,并系统性地刻画其核心统计特性?本章将围绕这一核心问题展开,首先从随机过程的角度建立时间序列的严格数学定义,然后依次深入平稳性理论、自相关结构、时域与频域分解方法,最终通过 Python 实践展示完整的探索性分析框架。这些内容不仅构成时间序列分析的基石,也为后续各章的建模与预测方法提供了不可或缺的理论基础。
随机过程视角下的时间序列定义
从数据表到随机过程
在横截面数据分析中,我们观察 $n$ 个独立个体在某一时刻的状态,每个观测值被视为来自同一分布的独立抽样。这种分析的数学基础是独立同分布(i.i.d.)随机变量序列。然而,时间序列数据具有本质不同的结构——序列中相邻观测值之间通常存在相关性,且这种相关性不能简单地被视为随机噪声。
从数学上讲,时间序列(Time Series)是一个随机过程(Stochastic Process)的样本实现。设 $(\Omega, \mathcal{F}, \mathbb{P})$ 为概率空间,$\mathcal{T}$ 为索引集合(通常为 $\mathbb{Z}$ 或 $\mathbb{R}$ 表示离散或连续时间),则时间序列可定义为映射:
$$X: \mathcal{T} \times \Omega \to \mathbb{R}, \quad X(t, \omega) = X_t(\omega)$$
对于固定的时间 $t$,$X_t$ 是一个随机变量;对于固定的样本路径 $\omega$,$\{X_t(\omega) : t \in \mathcal{T}\}$ 是一个确定性的时间序列函数,我们实际观测到的就是其中一条样本路径。这一数学框架揭示了时间序列分析的核心困难:我们只能从单条样本路径中推断整个随机过程的统计特性,而这要求随机过程具有某些良好的性质。
时间序列的分类
根据索引集合和样本空间的性质,时间序列可分为多种类型:
离散时间序列(Discrete-Time Series)是最常见的形式,其索引集合 $\mathcal{T} = \{\ldots, -1, 0, 1, \ldots\}$ 或 $\mathcal{T} = \{1, 2, \ldots, n\}$。每日股价、月度 CPI 同比增长率、季度 GDP 增速等均属于此类。连续时间序列则对应物理系统的连续监测,其数学处理涉及随机微分方程理论,超出本书的讨论范围。
从统计特性角度,时间序列可分为平稳时间序列(Stationary Time Series)和非平稳时间序列(Non-Stationary Time Series)。平稳序列的统计特性不随时间推移而改变,而非平稳序列则包含趋势、季节性或单位根等随时间变化的成分。这一划分是时间序列建模中最重要的分类决策,直接影响模型的选择策略。
从数据生成机制角度,时间序列还可依据是否服从线性模型分为线性时间序列(如 ARMA 过程)和非线性时间序列(如 ARCH 过程、状态空间模型)。高斯时间序列假设 $\{X_t\}$ 服从联合正态分布,这一假设虽在理论上便于分析,但在实际应用中常因金融收益率的厚尾特性而失效。
有限维分布与Kolmogorov扩展
随机过程理论的一条基本定理是 Kolmogorov 扩展定理:给定所有有限维分布 $\{F_{t_1, \ldots, t_k}(x_1, \ldots, x_k) : k \in \mathbb{N}, t_i \in \mathcal{T}\}$,只要这些分布满足一致性条件(即边缘化和对称性条件),就存在唯一的概率空间和其上的随机过程 $\{X_t\}$ 以这些为有限维分布。这一结论保证了我们可以通过指定有限维分布来完整定义一个随机过程。
在时间序列实践中,我们通常不直接指定有限维分布,而是通过规定低阶矩(如均值函数、自协方差函数)来刻画过程的主要特征。这一策略的可行性取决于我们感兴趣的统计推断问题是否主要由低阶矩决定——在大多数经济和金融时间序列分析中,情况确实如此,因为中心极限定理使得渐近分布主要由一阶和二阶矩决定。
平稳性:时间序列分析的理论基石
严格平稳与弱平稳
严格平稳(Strict Stationarity)要求所有有限维分布在时间平移下保持不变。对于所有 $k \in \mathbb{N}$、所有时间点 $t_1, \ldots, t_k$ 和所有整数 $h$,必须满足:
$$F_{X}(x_1, \ldots, x_k; t_1, \ldots, t_k) = F_{X}(x_1, \ldots, x_k; t_1+h, \ldots, t_k+h)$$
严格平稳是一个极强的条件。在实际应用中,我们通常依赖更宽松但更有用的弱平稳(Weak Stationarity)概念,也称为协方差平稳(Covariance Stationarity)或广义平稳(Wide-Sense Stationary)。一个时间序列 $\{X_t\}$ 是弱平稳的,当且仅当它满足以下三个条件:
1. 均值常数性:对所有 $t$,$\mathbb{E}[X_t] = \mu$,其中 $\mu$ 为有限常数; 2. 方差有限性:对所有 $t$,$\mathbb{V}\text{ar}(X_t) = \mathbb{E}[(X_t - \mu)^2] = \sigma^2 < \infty$; 3. 协方差平移不变性:对所有 $t$ 和所有滞后 $k$,$\gamma(k) = \mathbb{C}\text{ov}(X_t, X_{t+k})$ 仅依赖于滞后 $k$,而与时间 $t$ 无关。
第三条中的 $\gamma(k)$ 称为自协方差函数(Autocovariance Function, ACVF),其在滞后 $k$ 处的值衡量序列相隔 $k$ 个时间单位的线性相关程度。特别地,$\gamma(0) = \sigma^2$ 是序列的方差。弱平稳的核心含义是:序列的均值、方差和任意滞后阶的协方差均不随时间变化。
需要注意的是,严格平稳和弱平稳在一般情况下不等价。然而,当时间序列服从正态分布时,由于正态分布由其一阶和二阶矩完全确定,弱平稳必然推出严格平稳。这一事实在高斯时间序列的理论和应用中具有重要意义。
白噪声:平稳性的基准模型
白噪声(White Noise)是时间序列分析中最基础的概念之一,作为许多模型残差的基准假设。一个离散时间序列 $\{\varepsilon_t\}$ 被称为白噪声,如果它满足:
$$\mathbb{E}[\varepsilon_t] = 0, \quad \mathbb{V}\text{ar}(\varepsilon_t) = \sigma^2, \quad \mathbb{C}\text{ov}(\varepsilon_t, \varepsilon_{t+k}) = 0, \quad \forall k \neq 0$$
即:均值为零、方差常数、相隔任意非零滞后的协方差为零。如果白噪声进一步服从正态分布,则称为高斯白噪声(Gaussian White Noise)。白噪声的特征完全由其二阶矩描述——它意味着序列中不存在任何可预测的线性结构,任何基于历史信息的预测都无法优于无条件均值。
白噪声在时间序列建模中扮演着双重角色。一方面,它是检验残差是否已充分提取序列中可用信息的重要基准——如果模型残差仍呈现显著的自相关,则说明模型设定不够充分。另一方面,白噪声也是构造更复杂时间序列模型的基本构件,例如 ARMA 模型就是白噪声通过线性滤波器的输出。
平稳性的经济含义与建模意义
为什么平稳性如此重要?这一概念的经济学和统计学含义可以从几个层面理解。首先,在经济系统中,许多变量的水平值往往呈现随机游走或趋势变化特征(如GDP的对数序列),直接对其建模会导致“伪回归”(Spurious Regression)问题——两个完全无关的非平稳序列可能呈现出高统计显著性的回归关系。其次,平稳性保证了统计量的渐近分布理论可以直接应用,使得基于有限样本的推断具有可靠性。
从建模实践的角度看,平稳性决定了我们可以使用哪些分析工具。对于平稳序列,可以直接应用 ARMA 模型的渐近理论、构建置信区间、执行假设检验等。对于非平稳序列,必须首先通过差分、 detrending 或季节性调整等方法将其转化为平稳序列,或者直接使用专门针对非平稳数据设计的模型(如单位根过程、协整模型)。
平稳性检验方法
在实践中,判断一个时间序列是否平稳需要进行统计检验。最广泛使用的检验方法是 Augmented Dickey-Fuller (ADF) 检验,其原假设为序列存在单位根(即非平稳),备择假设为序列是平稳的(或不存在单位根)。ADF 检验基于以下回归方程:
$$\Delta y_t = \alpha + \beta t + \gamma y_{t-1} + \sum_{i=1}^{p} \delta_i \Delta y_{t-i} + \varepsilon_t$$
其中 $\Delta$ 为一阶差分算子,$\alpha$ 为常数项,$\beta t$ 为时间趋势项(可选),$\gamma$ 的系数是核心检验对象。若 $\gamma = 0$,则序列存在单位根。检验统计量为 $\tau$ 统计量,其临界值由 MacKinnon 通过蒙特卡洛模拟确定。
另一种常用的检验是 KPSS 检验(Kwiatkowski-Phillips-Schmidt-Shin Test),其原假设与 ADF 相反——原假设为序列是平稳的,备择假设为序列存在单位根。因此,当 ADF 和 KPSS 检验的结论一致时(前者拒绝单位根、后者不拒绝平稳性),我们对序列平稳性的判断最为可信。Phillips-Perron (PP) 检验 则是对 ADF 检验的另一种改进,通过非参数方法修正异方差和自相关问题。
ADF 检验的 Python 实现如下:
```python import numpy as np import pandas as pd from statsmodels.tsa.stattools import adfuller, kpss
def stationarity_test(series, regression='c', autolag='AIC'): """ 综合使用ADF和KPSS检验评估序列平稳性。
Parameters ---------- series : array-like 待检验的时间序列 regression : str ADF回归类型:'c'常数项, 'ct'常数项+趋势, 'n'无常数项无趋势 autolag : str 自动选择滞后阶数的准则
Returns ------- dict : 包含两种检验结果的字典 """
ADF检验
adf_result = adfuller(series, regression=regression, autolag=autolag) adf_output = { 'ADF Statistic': adf_result[0], 'p-value': adf_result[1], 'Lags Used': adf_result[2], 'Critical Values': adf_result[4] }
KPSS检验(趋势平稳)
try: kpss_result = kpss(series, regression='c', nlags='auto') kpss_output = { 'KPSS Statistic': kpss_result[0], 'p-value': kpss_result[1], 'Lags Used': kpss_result[2], 'Critical Values': kpss_result[3] } except Exception as e: kpss_output = {'Error': str(e)}
return {'ADF': adf_output, 'KPSS': kpss_output} ```
在实际应用中,需要特别注意滞后阶数 $p$ 的选择。滞后阶数过少可能无法充分处理序列的高阶自相关(导致检验功效降低),而过多则会降低检验的自由度。常用的选择准则包括 AIC、BIC 和修正的赤池信息准则(AICc)。此外,差分阶数 $d$ 的确定也是建模前的重要步骤——可以通过检验 $\Delta y_t$ 的平稳性来判断 $y_t$ 是否需要一阶差分。
时间序列的分解方法
经典时间序列分解模型
时间序列的可分解性假设是许多分析方法的隐含前提。该假设认为,任何时间序列都可以表示为若干不可观测成分的叠加,其中最基本的两类分解模型是加法模型和乘法模型:
$$X_t = T_t + S_t + R_t \quad \text{(加法模型)}$$
$$X_t = T_t \times S_t \times R_t \quad \text{(乘法模型)}$$
其中 $T_t$ 表示趋势成分(Trend),反映序列的长期变化方向;$S_t$ 表示季节成分(Seasonality),反映具有固定周期的规则性波动;$R_t$ 表示残差成分(Residual/Irregular),代表无法被趋势和季节解释的随机波动。
加法模型适用于季节波动幅度不随趋势水平变化的情形,例如某些服务业的月度客流量数据。乘法模型则适用于季节波动与趋势成比例的场景,这在宏观经济数据(如零售销售额)中更为常见——当经济繁荣时期,季节性波动的绝对量级通常也更大。通过对数变换,乘法模型可以转化为加法模型:
$$\log X_t = \log T_t + \log S_t + \log R_t$$
这提供了一种统一处理两类模型的实用策略。
趋势提取与分解方法
趋势成分的提取是时间序列分解的核心环节。历史上,移动平均法(Moving Average, MA)是最直观的趋势提取方法。对于偶数长度 $2k$ 的中心移动平均,其定义为:
$$\hat{T}_t = \frac{1}{2k} \sum_{j=-k}^{k-1} X_{t+j}$$
这一方法的核心思想是:通过平滑操作消除季节性和随机波动,保留缓慢变化的趋势成分。对于奇数长度 $2k+1$ 的移动平均,公式相应调整为:
$$\hat{T}_t = \frac{1}{2k+1} \sum_{j=-k}^{k} X_{t+j}$$
然而,简单的移动平均对趋势的转折点反应迟钝,且无法处理趋势中的结构性断点。Hodrick-Prescott (HP) 滤波 提供了一种更灵活的分解方法,通过最小化以下目标函数来同时提取趋势和周期成分:
$$\min_{\{T_t\}} \sum_{t=1}^{T} (X_t - T_t)^2 + \lambda \sum_{t=2}^{T-1} \left[(T_{t+1} - T_t) - (T_t - T_{t-1})\right]^2$$
其中 $\lambda$ 为平滑参数,控制趋势的光滑程度与拟合优度之间的权衡。$\lambda$ 的取值因数据频率而异:对于季度数据通常取 1600,月度数据取 129600,日度数据取更高的值。HP 滤波在宏观经济学中应用广泛,但其存在“端点伪影”问题——在序列两端提取的趋势往往不可靠,需要谨慎解读。
近年来,STL 分解(Seasonal and Trend decomposition using Loess)因其灵活性和鲁棒性而受到青睐。STL 使用局部加权回归(Loess)对趋势和季节成分进行迭代估计,能够处理任何频率的季节性模式,且对异常值具有较好的抵抗力:
```python from statsmodels.tsa.seasonal import STL, seasonal_decompose import pandas as pd import numpy as np
读取时间序列数据
data = pd.read_csv('time_series_data.csv', parse_dates=['date'], index_col='date')
series = data['value']
STL分解:更灵活的处理方式
stl = STL(series, period=12, # 季节周期(月度数据为12) robust=True, # 鲁棒估计,处理异常值 seasonal=7) # 季节平滑窗口长度(必须为奇数) result = stl.fit()
提取各成分
trend = result.trend seasonal = result.seasonal residual = result.resid
经典加法分解(用于对比)
classical = seasonal_decompose(series, model='additive', period=12) ```
分解质量的评估
对分解结果进行质量评估是实践中的重要步骤。残差的白噪声检验是核心诊断手段:若残差序列存在显著的自相关,说明趋势或季节成分的提取不充分,仍有系统性信息未被解释。常用的检验方法包括 Ljung-Box Q 统计量:
$$Q(n) = T(T+2) \sum_{k=1}^{n} \frac{\hat{\rho}_k^2