在时间序列分析领域,评估数据的平稳性是构建准确模型的基础。ADF(Augmented Dickey-Fuller,增广迪基-富勒检验)和KPSS(Kwiatkowski-Phillips-Schmidt-Shin)检验是用于评估时间序列数据平稳性的两种关键统计假设检验方法。当我们遇到ADF检验失败而KPSS检验通过的情况时,这表明我们面对的是一个平稳但具有确定性趋势的时间序列。这种诊断结果引发了一个重要问题:我们是否应当系统性地去除这种趋势?这个表面上简单的问题实际上蕴含着相当复杂的技术考量。

ADF ❌ 与 KPSS ✅ 诊断结果的解读

这种特定的检验结果组合表明序列具有确定性趋势特性。从统计学角度看,这意味着序列沿着可预测的方向变化,但围绕该趋势的波动表现出统计稳定性的特征。

增广迪基-富勒(ADF)检验失败,是因为在存在趋势的情况下拒绝了平稳性假设,而Kwiatkowski-Phillips-Schmidt-Shin(KPSS)检验确认该序列在确定性趋势周围是平稳的。

处理策略:差分、去趋势与分解技术比较

去趋势技术

去趋势方法专注于移除序列中的线性趋势(如线性回归、HP滤波器)或非线性趋势(如STL、小波、SSA等方法)。如果去趋势后ADF检验通过,则可认为序列已达到平稳状态。若去趋势后ADF检验仍表明非平稳性,则可能需要实施多次连续差分(在计量经济学中称为积分阶数)。

应用场景: 金融分析中,去除市场整体趋势以专注分析短期价格波动(如高频交易策略)。输出结果: 不含趋势成分的时间序列。

差分技术

差分方法通过计算相邻时间点数值之间的差值,将非平稳序列转换为平稳序列,从而捕获数据的连续变化特征(这对ARIMA等模型尤为重要)。该方法有效隔离了周期间的变化,而非关注绝对数值水平。

应用场景: 将股票价格数据转换为收益率以消除市场增长偏差,或通过关注变化率而非总体交易量来检测渐进式网络攻击(如缓慢数据泄露)。输出结果: 平稳序列,仅保留周期间变化,便于建模与异常分析。

经过差分处理后,分析重点从绝对值转向变化率。

分解技术

分解方法将时间序列分离为趋势、季节性和残差等多个组成部分(如STL、SSA、小波分析等)。与去趋势不同,分解技术保留了所有成分,只是将它们分离以便单独分析。

应用场景: 企业需要将销售数据的长期趋势与季节性因素(如12月销售高峰)及随机波动分开分析。输出结果: 三个相互独立的数据组成部分。

去趋势技术详解

基于线性回归的确定性趋势处理

当时间序列呈现确定性趋势时,最基本的处理方法是估计并移除线性趋势:

 # filepath: 不适用
 import numpy as np
 import statsmodels.api as sm
 # Modélisation de la tendance  # 趋势建模
 X = sm.add_constant(np.arange(len(data)))
 model = sm.OLS(data, X).fit()
 trend = model.predict(X)
 # Extraction de la série détrendée  # 提取去趋势序列
 detrended_series = data - trend

此方法对简单线性趋势处理效果显著,但面对更复杂的趋势模式则效果有限。

基于差分的随机趋势处理

当趋势呈现随机性(不可预测)而非确定性时,差分方法则更为适用:

 # filepath: 不适用
 # Différenciation première  # 一阶差分
 diff_series = np.diff(data)

这种技术是ARIMA模型的核心组成部分,能有效将非平稳序列转换为平稳序列,但代价是部分信息的损失。

Hodrick-Prescott滤波器 (HP)处理

对于复杂的非线性趋势,HP滤波器在提取平滑趋势方面表现出色:

 # filepath: 不适用
 from statsmodels.tsa.filters.hp_filter import hpfilter
 # Décomposition avec filtre HP  # 使用HP滤波器分解
 cycle, trend = hpfilter(data, lamb=1600)  # λ=1600 pour données trimestrielles  # λ=1600 适用于季度数据

HP滤波器中的λ参数调控滤波器对趋势变化的敏感程度:

  • λ = 1600 适用于季度频率数据
  • λ ≈ 14400 适用于月度频率数据
  • λ ≈ 100 适用于年度频率数据

季节性-趋势分解 (STL)

当处理同时包含季节性和趋势成分的时间序列时,STL分解提供了一个高效解决方案:

 # filepath: 不适用
 from statsmodels.tsa.seasonal import STL
 stl = STL(data, seasonal=11)
 result = stl.fit()
 detrended = data - result.trend

该方法将序列分解为不同成分(趋势、季节性、残差),支持更为精细的数据分析。

高级时间序列分解技术

我们不仅仅关注于"去除"时间序列中的趋势,还应该致力于将其分解为具有丰富信息价值的组成部分:

小波分析

小波分析将信号分解为多个频率尺度,从而能够揭示不同时间域上的结构特征:

 # filepath: 不适用
 import pywt
 coeffs = pywt.wavedec(data, 'db8', level=3)

这种技术在识别多尺度时间现象方面表现突出,例如金融市场操纵行为或网络安全中的隐蔽攻击模式。

奇异谱分析 (SSA)

SSA技术将时间序列分解为正交分量,而无需对其结构做出先验假设:

 # filepath: 不适用
 from pyssa import SSA
 ssa = SSA(data, window=20)
 ssa.decompose()
 components = ssa.reconstruct(groups=[[0], [1, 2], [3, 4]])

尽管计算复杂度较高,但SSA能够发现其他方法难以检测的隐藏模式。

卡尔曼滤波

与传统去趋势方法不同,卡尔曼滤波器专注于估计动态系统的隐藏状态。

卡尔曼滤波器通过预测和更新两个步骤运行:

  • 预测阶段: 基于当前状态估计下一时刻的值
  • 更新阶段: 随新观测数据的获得,通过综合考虑新数据及相关不确定性来校正预测值

技术特性:

卡尔曼滤波器能够对趋势突变(如市场崩盘、网络攻击)做出动态调整。与静态回归不同,它会持续更新系数估计,而非假设趋势或均值在长时间内保持不变,而是追踪变化并逐步调整参数,更符合动态系统的实际特性。

 # filepath: 不适用
 from pykalman import KalmanFilter
 kf = KalmanFilter(initial_state_mean=0, n_dim_obs=1)
 filtered_state_means, _ = kf.filter(data)

在金融领域,此方法可用于估计资产的"内在"价值,尽管存在市场噪声干扰;在网络安全领域,它有助于识别被正常波动掩盖的异常行为模式。

金融领域的去趋势应用考量

在金融分析中,盲目地移除趋势可能导致分析偏差:

  • 趋势交易策略: 动量投资策略正是利用了简单去趋势方法可能消除的趋势特性
  • 收益率分析: 对数差分(对数收益率)本身已经是一种适用于金融序列的去趋势处理
  • 市场动态机制: 金融市场通常在趋势形成阶段和均值回归阶段之间交替运行——系统性去趋势可能忽略这一基本特性

量化分析师通常倾向于同时保留同一数据序列的多种并行表示形式:

 # filepath: 不适用
 # Analyse multi-échelle  # 多尺度分析
 raw_data = get_price_data()
 returns = np.diff(np.log(raw_data))
 hp_cycle, hp_trend = hpfilter(raw_data, lamb=1600)
 stl_result = STL(raw_data, seasonal=20).fit()

网络安全领域中的时间趋势与季节性分析

与普遍认知不同,网络安全数据通常呈现明显的时间结构特征:

  • 渐进式攻击:APT(高级持续性威胁)往往呈现逐步增加活动强度的特征,以规避安全检测
  • 攻击的季节性模式:某些攻击行为遵循特定周期(日夜交替、工作日/周末差异、节假日特征)
  • 数据泄露行为:可疑数据传输可能呈现先增后减的趋势特征

面对这些复杂模式,盲目应用去趋势处理可能会掩盖而非揭示潜在的攻击特征。

处理策略选择决策框架

实现方法

总结

当面对ADF检验失败而KPSS检验通过的时间序列时,处理策略不应简单归结为"去趋势",而应基于以下考量做出综合决策:

  • 深入理解趋势的本质特性(确定性趋势或随机趋势)
  • 明确分析目标(预测、异常检测或模型构建)
  • 在差分、简单去趋势和高级分解方法之间做出适当选择
  • 评估不同处理方法对最终模型性能的实际影响

时间序列处理不应机械地遵循固定方法,而需要根据具体应用场景进行方法选择和参数调整,在降低噪声的同时保留关键信号特征。

https://avoid.overfit.cn/post/b155b34e07594264a14554c0b55f9854

作者:Sirine Amrane


deephub
122 声望100 粉丝