2. 金融时间序列基础:数据特性与预处理

金融时间序列是压力测试建模的原始输入。与普通横截面数据不同,时间序列数据在时间维度上存在复杂的依赖结构。忽略这些特性,特征工程将产生严重偏差。本节系统梳理金融数据的核心统计特性、分解方法、平稳性检验与差分处理,为后续特征构建奠定基础。

2.1 金融数据三大核心特性

金融资产收益率序列普遍呈现三个偏离经典正态假设的统计特征,这些特征直接影响特征工程中的窗口设计、变换选择和模型假设检验。

特性 定义 对特征工程的影响
自相关 当前观测值与历史观测值之间存在线性或非线性依赖 滑动窗口特征(如移动平均、动量)必须考虑滞后阶数选择;残差自相关会导致模型误设
异方差 收益率的条件方差随时间变化,波动聚集 特征缩放不能使用全局方差;需引入波动率归一化或GARCH类特征
尖峰厚尾 极端值出现概率高于正态分布预测,峰度 > 3 均值/方差类特征对极端值敏感;需使用稳健统计量(中位数、MAD)或分位数特征

实践要点: 在压力测试场景中,异方差和厚尾特性意味着“正常时期”的统计关系在极端市场条件下可能完全失效。特征工程必须包含对尾部行为和波动率状态的显式建模。

2.2 时间序列分解:趋势、季节与残差

时间序列分解将原始序列拆解为三个可解释成分,帮助特征工程识别不同时间尺度的驱动因素。经典分解模型有两种:加法模型(Y = T + S + R)和乘法模型(Y = T × S × R)。金融序列通常使用加法模型,或对收益率取对数后使用加法模型。

分解选择建议: 当序列波动幅度随时间增长时(如股价水平),优先使用乘法模型或对数变换后加法分解;当序列波动幅度稳定时(如对数收益率),直接使用加法分解。

时间序列分解结构图 原始序列 Y 趋势 T 季节 S 残差 R 成分含义与特征工程应用 趋势:长期方向性运动(宏观经济因子、 低通滤波特征、多项式拟合) 季节:周期性重复模式(日历效应、 周内效应、月份效应虚拟变量) 残差:随机波动(波动率特征、跳跃检测) STL 分解 X-13ARIMA-SEATS 移动平均分解 HP 滤波 稳健局部加权回归 官方季节调整标准 简单快速,适合EDA 趋势提取,需调λ

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 差分阶数的确定

通常金融收益率序列本身已接近平稳(一阶差分后的价格序列),但部分宏观指标可能需要二阶差分。确定方法:

  1. 对原始序列进行 ADF + KPSS 联合检验
  2. 若判定非平稳,进行一阶差分,再次检验
  3. 重复直到序列平稳,记录差分阶数 d
  4. 避免过度差分(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 综合流程:金融时间序列预处理管线

将上述步骤整合为可复用的预处理管线,是特征工程自动化的基础。

金融时间序列预处理管线 原始序列 缺失值处理 异常值检测 对数变换 ADF + KPSS 差分处理 平稳性确认 特征工程 关键检查点 ① 缺失值比例 < 5% 用前向填充;> 5% 需评估数据可用性 ② 异常值使用中位数绝对偏差(MAD)或分位数法识别 ③ 差分阶数 d 通常为 0 或 1;d=2 极少见,需谨慎

压力测试场景提示: 在压力测试中,预处理管线必须对历史极端时期(如2008年、2020年)进行单独验证。某些在正常时期表现良好的插值或异常值处理方法,在极端波动下可能引入严重偏差。建议对压力时期使用更保守的处理策略(如保留原始极端值,而非平滑处理)。