2. 金融时间序列基础:数据特性与预处理
金融时间序列是压力测试建模的原始输入。与普通横截面数据不同,时间序列数据在时间维度上存在复杂的依赖结构。忽略这些特性,特征工程将产生严重偏差。本节系统梳理金融数据的核心统计特性、分解方法、平稳性检验与差分处理,为后续特征构建奠定基础。
2.1 金融数据三大核心特性
金融资产收益率序列普遍呈现三个偏离经典正态假设的统计特征,这些特征直接影响特征工程中的窗口设计、变换选择和模型假设检验。
| 特性 | 定义 | 对特征工程的影响 |
|---|---|---|
| 自相关 | 当前观测值与历史观测值之间存在线性或非线性依赖 | 滑动窗口特征(如移动平均、动量)必须考虑滞后阶数选择;残差自相关会导致模型误设 |
| 异方差 | 收益率的条件方差随时间变化,波动聚集 | 特征缩放不能使用全局方差;需引入波动率归一化或GARCH类特征 |
| 尖峰厚尾 | 极端值出现概率高于正态分布预测,峰度 > 3 | 均值/方差类特征对极端值敏感;需使用稳健统计量(中位数、MAD)或分位数特征 |
实践要点: 在压力测试场景中,异方差和厚尾特性意味着“正常时期”的统计关系在极端市场条件下可能完全失效。特征工程必须包含对尾部行为和波动率状态的显式建模。
2.2 时间序列分解:趋势、季节与残差
时间序列分解将原始序列拆解为三个可解释成分,帮助特征工程识别不同时间尺度的驱动因素。经典分解模型有两种:加法模型(Y = T + S + R)和乘法模型(Y = T × S × R)。金融序列通常使用加法模型,或对收益率取对数后使用加法模型。
分解选择建议: 当序列波动幅度随时间增长时(如股价水平),优先使用乘法模型或对数变换后加法分解;当序列波动幅度稳定时(如对数收益率),直接使用加法分解。
2.3 平稳性:时间序列建模的前提
平稳性是大多数时间序列模型(ARIMA、GARCH、状态空间模型)的核心假设。严格平稳要求联合分布对时间平移不变;实际应用中我们通常要求弱平稳:均值恒定、方差有限且恒定、自协方差仅依赖于滞后阶数。
2.3.1 非平稳的常见形式
- 趋势平稳: 围绕确定性趋势波动,去趋势后平稳(如GDP对数序列)。
- 差分平稳: 随机游走,方差随时间增长,需差分后平稳(如股价对数序列)。
- 结构突变: 均值或方差在某个时间点发生跳跃(如政策变化、市场崩盘)。
2.3.2 平稳性检验:ADF 与 KPSS
单一检验存在低功效问题,业界标准是同时使用 ADF(原假设:非平稳)和 KPSS(原假设:平稳)进行联合确认。
| 检验方法 | 原假设 H₀ | 统计量含义 | 决策规则 |
|---|---|---|---|
| ADF | 序列存在单位根(非平稳) | 检验回归系数是否显著为负 | p < 0.05 → 拒绝H₀,序列平稳 |
| KPSS | 序列是平稳的 | 基于OLS残差的LM统计量 | p < 0.05 → 拒绝H₀,序列非平稳 |
联合判断逻辑:
- ADF 显著 + KPSS 不显著 → 序列平稳 ✅
- ADF 不显著 + KPSS 显著 → 序列非平稳,需差分
- 两者都显著 → 可能为趋势平稳或存在结构突变
- 两者都不显著 → 样本量不足或序列为长记忆过程
2.4 差分处理与特征工程
差分是消除单位根、使序列平稳的标准操作。在特征工程中,差分不仅用于预处理,本身也是一种重要的特征变换。
2.4.1 差分阶数的确定
通常金融收益率序列本身已接近平稳(一阶差分后的价格序列),但部分宏观指标可能需要二阶差分。确定方法:
- 对原始序列进行 ADF + KPSS 联合检验
- 若判定非平稳,进行一阶差分,再次检验
- 重复直到序列平稳,记录差分阶数 d
- 避免过度差分(d > 2 在金融中极少见)
2.4.2 差分作为特征
差分变换可以生成多种具有经济含义的特征:
| 特征类型 | 计算公式 | 金融含义 |
|---|---|---|
| 一阶差分 | Δy_t = y_t - y_{t-1} | 绝对变化量(如价格变动) |
| 对数差分 | r_t = ln(y_t) - ln(y_{t-1}) | 连续复合收益率 |
| 百分比差分 | (y_t - y_{t-1}) / y_{t-1} | 简单收益率 |
| 季节性差分 | Δ_s y_t = y_t - y_{t-s} | 同比变化(s=12 月度同比) |
# Python 示例:ADF + KPSS 联合检验与差分
import numpy as np
import pandas as pd
from statsmodels.tsa.stattools import adfuller, kpss
def check_stationarity(series, name='series'):
"""联合平稳性检验"""
# ADF 检验
adf_stat, adf_pval, _, _, crit_vals, _ = adfuller(series.dropna(), autolag='AIC')
# KPSS 检验
kpss_stat, kpss_pval, _, _ = kpss(series.dropna(), regression='c', nlags='auto')
print(f'--- {name} ---')
print(f'ADF: stat={adf_stat:.4f}, p-value={adf_pval:.4f}')
print(f'KPSS: stat={kpss_stat:.4f}, p-value={kpss_pval:.4f}')
# 联合判断
if adf_pval < 0.05 and kpss_pval >= 0.05:
print('结论:序列平稳')
return 0
elif adf_pval >= 0.05 and kpss_pval < 0.05:
print('结论:非平稳,建议差分')
return 1
else:
print('结论:不确定,需进一步分析')
return -1
# 示例:对股价序列进行检验
prices = pd.Series([100, 102, 101, 105, 110, 108, 115, 120, 118, 122])
d_order = check_stationarity(prices, '股价序列')
if d_order > 0:
# 一阶差分
returns = prices.diff().dropna()
check_stationarity(returns, '收益率序列')
2.5 综合流程:金融时间序列预处理管线
将上述步骤整合为可复用的预处理管线,是特征工程自动化的基础。
压力测试场景提示: 在压力测试中,预处理管线必须对历史极端时期(如2008年、2020年)进行单独验证。某些在正常时期表现良好的插值或异常值处理方法,在极端波动下可能引入严重偏差。建议对压力时期使用更保守的处理策略(如保留原始极端值,而非平滑处理)。