4. 时间序列数据的特殊性:自相关性、波动率聚集、非平稳性对切分的影响
金融时间序列数据与独立同分布(i.i.d.)的横截面数据存在本质区别。若忽视其自相关性、波动率聚集及非平稳性,直接套用随机切分或简单滚动窗口,将导致VaR模型严重低估尾部风险,产生“伪回归”与“伪预测”问题。本节深入剖析这三种特性对样本切分的具体影响,并给出对应的切分策略。
4.1 自相关性:破坏样本独立性,导致信息泄漏
金融收益率序列通常呈现低阶自相关(如日收益率对前一日收益率的微弱依赖),而波动率序列(如绝对值收益率、平方收益率)则呈现显著的高阶自相关。在切分训练集与测试集时,若切分点落在自相关结构内部,会造成未来信息“泄漏”到训练集,或训练集信息“污染”测试集。
核心影响: 自相关导致相邻样本不独立。若使用随机切分(如K折交叉验证),同一段序列的相邻观测可能被分到训练集和测试集,使模型在测试集上“看到”了训练集的信息,造成VaR回测通过率虚高。
切分应对策略:
- 禁止随机切分: 对时间序列数据,严禁使用K折、留出法等随机切分方式。
- 强制序列切分: 必须按时间顺序划分,训练集时间必须早于测试集时间。
- 引入“缓冲带”(Burn-in Period): 在训练集与测试集之间,剔除若干观测(通常为最大自相关滞后阶数),切断信息传递。
4.2 波动率聚集:VaR模型失效的“重灾区”
波动率聚集(Volatility Clustering)是金融时间序列最显著的特征之一:大波动后往往跟随大波动,小波动后跟随小波动。这一特性直接导致VaR模型在训练集与测试集波动率结构不一致时,产生系统性偏差。
| 切分场景 | 训练集波动率特征 | 测试集波动率特征 | VaR模型表现 |
|---|---|---|---|
| 低波动→高波动 | 低波动率(平静期) | 高波动率(危机期) | 严重低估VaR,突破次数远超预期 |
| 高波动→低波动 | 高波动率(危机期) | 低波动率(平静期) | 高估VaR,模型过于保守,资本占用过高 |
| 波动率结构相似 | 与测试集波动率水平接近 | 与训练集波动率水平接近 | 回测通过率较高,但需警惕过拟合 |
实践警示: 若训练集包含2008年金融危机期间的数据,而测试集为2009-2010年复苏期,模型会“记住”高波动,导致在低波动测试集上VaR值偏高。反之,若训练集为平静期,测试集包含2020年COVID-19冲击,VaR将严重不足。
应对策略:
- 波动率加权切分: 在切分时,确保训练集与测试集的波动率分布(如标准差、偏度)在统计上无显著差异。
- 使用GARCH类模型预处理: 先对收益率序列拟合GARCH(1,1)模型,提取标准化残差(近似i.i.d.),再对残差进行切分。
- 多周期滚动验证: 采用多个不同波动率水平的训练-测试窗口,综合评估VaR模型表现。
4.3 非平稳性:模型假设的“致命伤”
VaR模型通常假设收益率序列是弱平稳的(均值、方差为常数)。然而,金融时间序列常呈现非平稳特征:趋势性(如长期牛市)、结构性突变(如监管政策变化)、周期性(如经济周期)。非平稳性导致模型参数在训练集与测试集之间不一致,切分失去意义。
关键判断: 在切分前,必须对收益率序列进行单位根检验(ADF检验、PP检验)。若p值大于0.05,则序列非平稳,需先进行差分或对数差分处理。
非平稳性的三种类型及切分影响:
- 均值非平稳(趋势性): 长期上涨或下跌趋势。切分后,训练集均值与测试集均值差异显著,VaR的期望值(均值)估计失效。
- 方差非平稳(异方差): 波动率随时间变化(与波动率聚集相关但更长期)。切分后,方差结构不一致,VaR的分位数估计偏差。
- 结构性突变: 在某个时间点,序列的统计特性发生永久性改变(如2008年雷曼兄弟倒闭)。切分点若跨越突变点,模型将“混淆”两种不同的数据生成过程。
| 非平稳类型 | 检测方法 | 切分前处理 | 切分策略调整 |
|---|---|---|---|
| 均值非平稳 | ADF检验、KPSS检验 | 一阶差分或对数差分 | 对差分序列切分,再还原VaR |
| 方差非平稳 | White检验、Breusch-Pagan检验 | GARCH模型标准化 | 对标准化残差切分 |
| 结构性突变 | Chow检验、Bai-Perron检验 | 分段建模 | 以突变点为界,分别切分验证 |
最佳实践: 建议在切分前,对全序列进行“滚动平稳性检验”。若发现某段时间窗口内序列变为非平稳,则将该窗口标记为“不稳定期”,在切分时单独处理或剔除。
4.4 综合切分策略:应对“三座大山”
面对自相关性、波动率聚集和非平稳性的叠加影响,单一策略往往失效。推荐采用以下分层切分框架:
- 第一层:平稳性预处理 — 对原始收益率序列进行ADF检验。若非平稳,先差分或对数差分,得到平稳序列。
- 第二层:波动率解耦 — 对平稳序列拟合GARCH(1,1)模型,提取标准化残差。残差序列近似i.i.d.,消除波动率聚集。
- 第三层:序列切分 — 对标准化残差按时间顺序切分(保留时间顺序,但已无自相关和异方差)。
- 第四层:VaR计算与还原 — 在残差切分集上计算VaR,再通过GARCH模型还原为原始收益率尺度上的VaR。
重要提醒: 上述分层框架虽然理论上最优,但GARCH模型本身存在模型风险(如参数估计误差、分布假设错误)。在实际应用中,建议同时使用“原始收益率直接切分”作为基准对照,避免因模型过度复杂引入新的偏差。
4.5 代码示例:Python中的平稳性与波动率预处理
import numpy as np
import pandas as pd
from statsmodels.tsa.stattools import adfuller
from arch import arch_model
# 假设 returns 为 pandas Series,包含日收益率
def preprocess_for_var_cutting(returns, lags=5):
"""
对收益率序列进行平稳性检验和GARCH预处理
返回:标准化残差序列(可用于切分)
"""
# 1. 平稳性检验
adf_stat, p_value = adfuller(returns.dropna(), maxlag=lags)
if p_value > 0.05:
print(f"序列非平稳 (p={p_value:.4f}),进行一阶差分")
diff_returns = returns.diff().dropna()
else:
print(f"序列平稳 (p={p_value:.4f})")
diff_returns = returns.dropna()
# 2. GARCH(1,1)建模
model = arch_model(diff_returns * 100, vol='Garch', p=1, q=1,
dist='normal', mean='Zero')
res = model.fit(disp='off')
# 3. 提取标准化残差
standardized_residuals = res.resid / res.conditional_volatility
standardized_residuals = standardized_residuals.dropna()
# 4. 再次检验残差的平稳性和自相关
adf_res, p_res = adfuller(standardized_residuals, maxlag=lags)
print(f"标准化残差平稳性检验 p={p_res:.4f}")
return standardized_residuals, res
# 使用示例
# std_resid, garch_model = preprocess_for_var_cutting(returns)
# 对 std_resid 进行时间序列切分,再通过 garch_model 还原VaR
切分还原公式: 若在标准化残差上计算得到VaR_resid,则原始收益率尺度上的VaR为:
VaR_original = VaR_resid × σ_t + μ_t
其中σ_t为GARCH模型预测的条件波动率,μ_t为条件均值(若使用Zero均值模型则μ_t=0)。
VaR_original = VaR_resid × σ_t + μ_t
其中σ_t为GARCH模型预测的条件波动率,μ_t为条件均值(若使用Zero均值模型则μ_t=0)。