第3章:金融时间序列基础

做量化这几年,我越来越觉得时间序列分析是基本功。就像盖房子要打地基,时序分析不过关,后面那些花哨的模型都是空中楼阁。今天咱们就聊聊金融时间序列的那些核心概念。

3.1 时间序列的定义

说白了,时间序列就是按时间顺序排列的数据点。股票每日收盘价、每分钟成交量、每笔交易的买卖价差——这些都是时间序列。

一个完整的时间序列包含两个要素:时间戳和观测值。比如:

2024-01-01, 收盘价 100.5
2024-01-02, 收盘价 102.3
2024-01-03, 收盘价 101.8
...

我个人习惯把时间序列分成三类:

  • 单变量时间序列:只有一个变量随时间变化,比如仅看收盘价
  • 多变量时间序列:多个变量同时观测,比如同时看开盘价、最高价、最低价、收盘价
  • 面板数据:多个个体在多个时间点的数据,比如沪深300所有成分股的历史日线
我的经验:刚开始做量化时,我总喜欢用多变量模型,觉得信息越多越好。后来发现,很多时候单变量模型反而更稳健。别贪多,先吃透一个变量。

3.2 平稳性与非平稳性

平稳性这个概念,我当年学的时候绕了不少弯路。其实理解起来不难——平稳序列的统计性质不随时间变化。

严格来说,平稳性分两种:

  • 严平稳:整个序列的联合分布不随时间平移而变化。这个条件太强,现实中几乎不存在
  • 弱平稳:均值恒定、方差恒定、协方差只与时间间隔有关。这是咱们实际用的

为什么非要平稳?因为大多数统计模型都假设数据是平稳的。非平稳数据直接建模,会出现「伪回归」——两个毫无关系的序列,相关系数却很高。

避坑指南:我曾经用非平稳的股价直接做回归分析,结果R²高达0.9,兴奋得不行。后来发现两个股票都是长期上涨趋势,根本没关系。这就是典型的伪回归。

判断平稳性,我常用两种方法:

  1. ADF检验:原假设是序列存在单位根(非平稳)。p值小于0.05,就拒绝原假设,认为序列平稳
  2. KPSS检验:原假设是序列平稳。正好和ADF反过来
from statsmodels.tsa.stattools import adfuller, kpss

# ADF检验
result = adfuller(price_series)
print(f'ADF统计量: {result[0]:.4f}')
print(f'p值: {result[1]:.4f}')

# KPSS检验
result = kpss(price_series)
print(f'KPSS统计量: {result[0]:.4f}')
print(f'p值: {result[1]:.4f}')

如果序列非平稳怎么办?差分是最常用的方法。一阶差分后,大多数金融时间序列就平稳了。

3.3 自相关与偏自相关

自相关,就是序列和它自己滞后版本的相关性。比如今天的收盘价和昨天的收盘价有没有关系?

偏自相关呢?它剔除了中间变量的影响。比如今天和3天前的相关性,要去掉今天和昨天、今天和前天的影响。

这两个概念有什么用?

  • 自相关函数(ACF):判断MA模型的阶数
  • 偏自相关函数(PACF):判断AR模型的阶数
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

# 画ACF和PACF图
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6))
plot_acf(returns, lags=30, ax=ax1)
plot_pacf(returns, lags=30, ax=ax2)
plt.show()
我的习惯:看ACF和PACF图时,我一般先看有没有明显的截尾或拖尾。ACF在滞后k阶后突然截断,可能是MA(k);PACF在滞后k阶后截断,可能是AR(k)。当然,这只是初步判断。

3.4 白噪声检验

白噪声,就是纯随机序列。均值0,方差恒定,不同时间点之间没有相关性。

为什么要检验白噪声?因为如果残差是白噪声,说明模型已经把信息提取干净了。如果残差还有自相关,说明模型没做好。

常用的检验方法是Ljung-Box检验:

from statsmodels.stats.diagnostic import acorr_ljungbox

# Ljung-Box检验
result = acorr_ljungbox(residuals, lags=[10, 20, 30], return_df=True)
print(result)

p值大于0.05,说明残差是白噪声,模型OK。p值小于0.05,说明残差还有信息没被提取,需要改进模型。

我曾经踩过的坑:有一次做高频数据建模,残差的Ljung-Box检验一直通不过。后来发现是数据有微观结构噪声,比如买卖价差、交易量离散性。这些噪声不是模型能解释的,需要先做数据清洗。

3.5 金融数据典型特征

金融时间序列有几个典型特征,和普通时间序列很不一样。你想想看,股票收益率和气温数据,能一样吗?

3.5.1 波动率聚集

大的波动后面跟着大的波动,小的波动后面跟着小的波动。这就是波动率聚集。

为什么会这样?因为信息是成堆来的。一个坏消息引发恐慌,恐慌又引发更多抛售,波动就持续放大。等市场消化完,波动才慢慢变小。

波动率聚集意味着:

  • 收益率序列不是独立同分布的
  • 方差随时间变化,存在条件异方差
  • GARCH类模型就是专门处理这个的

3.5.2 厚尾分布

如果收益率服从正态分布,那极端值出现的概率应该很小。但现实中,金融市场的极端波动比正态分布预测的多得多。

举个例子:正态分布下,超过3个标准差的概率只有0.3%。但在A股市场,这种极端波动几乎每个月都能见到。

厚尾分布意味着:

  • 用正态分布做风险管理会低估风险
  • VaR模型需要调整,比如用t分布或极值理论
  • 回测时要特别关注极端行情下的表现
我的做法:做风险模型时,我一般先用正态分布算一遍,再用t分布算一遍。如果两者差异很大,说明数据厚尾严重,需要谨慎对待。

3.6 本章知识体系

下面这张图是我梳理的本章知识结构,方便你对照复习:

金融时间序列基础 时间序列定义 单变量 / 多变量 / 面板数据 平稳性与非平稳性 严平稳 / 弱平稳 / ADF检验 自相关与偏自相关 ACF / PACF / 模型定阶 白噪声检验 Ljung-Box检验 / 残差诊断 金融数据典型特征 波动率聚集 / 厚尾分布 实际应用 模型选择 / 风险管理 核心要点 平稳性是建模前提 → 差分处理非平稳 → ACF/PACF定阶 → 残差白噪声检验 公众号:蓝海资料掘金营,微信deep3321

嗯,这一章的内容就这些。时间序列的基础概念虽然看起来简单,但实际用起来门道很多。我建议你拿真实数据跑一遍上面的代码,感受一下平稳性检验、ACF/PACF图是什么样的。光看理论,永远学不会量化。