第三章 金融时间序列分析:从基础到ARIMA实战

各位同学好,我是老张。今天咱们聊聊时间序列分析。说实话,这玩意儿在量化里太重要了。你想想看,股票价格、交易量、宏观经济指标,哪个不是时间序列?我当年刚入行时,觉得这东西就是画个折线图,后来被市场狠狠教育了一顿,才明白里面的门道有多深。

好,咱们直接进入正题。

3.1 时间序列基础概念

时间序列,说白了就是按时间顺序排列的数据点。比如你每天收盘后记录的上证指数,就是一个典型的时间序列。

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

  • 趋势:长期上升或下降的走向。比如A股长期看是震荡向上的,但中间有牛熊。
  • 季节性:固定周期内的规律波动。比如每年春节前消费股会涨一波。
  • 随机波动:无法预测的噪声。嗯,这部分最让人头疼。

我在项目中遇到过一个问题:某次做商品期货的套利策略,发现模型总是失效。后来一查,原来是没考虑季节性因素——农产品在收获季节前后价格波动规律完全不同。所以啊,拿到数据先别急着建模,先看看有没有明显的趋势和周期。

核心要点:时间序列分析的前提是数据按固定时间间隔采样。如果数据有缺失,记得先做插值或重采样。

3.2 平稳性检验

平稳性,这是时间序列分析里最基础也最容易被忽视的概念。什么叫平稳?简单说就是统计性质不随时间变化——均值恒定、方差恒定、自协方差只与时间间隔有关。

你可能会问:「股票价格明显不是平稳的啊,它一直在涨涨跌跌。」没错,所以我们要做差分,把非平稳序列变成平稳序列。

检验平稳性最常用的方法是ADF检验(Augmented Dickey-Fuller test)。我直接上代码:

import pandas as pd
import numpy as np
from statsmodels.tsa.stattools import adfuller

# 模拟一个非平稳序列(随机游走)
np.random.seed(42)
n = 200
random_walk = np.cumsum(np.random.randn(n))

# ADF检验
result = adfuller(random_walk)
print(f'ADF统计量: {result[0]:.4f}')
print(f'p值: {result[1]:.4f}')
print(f'临界值:')
for key, value in result[4].items():
    print(f'  {key}: {value:.4f}')

# 判断:如果p值 > 0.05,说明序列非平稳
if result[1] > 0.05:
    print('序列非平稳,需要差分')
    # 一阶差分
    diff_series = np.diff(random_walk)
    result_diff = adfuller(diff_series)
    print(f'差分后p值: {result_diff[1]:.4f}')
    if result_diff[1] < 0.05:
        print('差分后序列平稳')

避坑指南:我曾经犯过一个错误——直接用原始价格序列建模,结果模型预测出来全是直线。后来才意识到,非平稳序列会导致伪回归问题。记住:先检验,后建模。

3.3 自相关与偏自相关

这两个概念是ARIMA模型的核心。自相关函数(ACF)衡量的是当前值与过去值之间的相关性。偏自相关函数(PACF)则是在剔除中间变量影响后,当前值与特定滞后值之间的相关性。

怎么用?我教你一个口诀:

  • 如果ACF拖尾(缓慢衰减),PACF在p阶后截尾(突然降到0附近)→ 用AR(p)模型
  • 如果PACF拖尾,ACF在q阶后截尾 → 用MA(q)模型
  • 如果两者都拖尾 → 用ARMA模型

来看代码怎么画ACF和PACF图:

import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

# 使用平稳后的序列
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8))

plot_acf(diff_series, lags=20, ax=ax1)
ax1.set_title('自相关函数 (ACF)')

plot_pacf(diff_series, lags=20, ax=ax2)
ax2.set_title('偏自相关函数 (PACF)')

plt.tight_layout()
plt.show()

嗯,这里要注意:ACF和PACF的解读需要经验。我刚开始学的时候,看着那些柱状图一头雾水。后来带我的老前辈说了一句话:「别纠结于精确的截尾点,看个大概范围就行,模型选择可以靠AIC/BIC来辅助判断。」这句话让我少走了很多弯路。

3.4 ARIMA模型原理与实战

ARIMA模型,全称是自回归积分滑动平均模型。它由三部分组成:

  • AR(自回归):用过去值预测当前值。参数p表示用几个过去值。
  • I(差分):使非平稳序列变平稳。参数d表示差分阶数。
  • MA(滑动平均):用过去预测误差来修正当前预测。参数q表示用几个误差项。

说白了,ARIMA(p,d,q)就是先做d阶差分让数据平稳,然后用AR和MA的组合来建模。

下面是一个完整的实战案例,我用的是真实股票数据(这里用模拟数据代替):

from statsmodels.tsa.arima.model import ARIMA
import warnings
warnings.filterwarnings('ignore')

# 模拟一个ARIMA(1,1,1)过程
np.random.seed(123)
ar_params = np.array([0.6])
ma_params = np.array([-0.3])
from statsmodels.tsa.arima_process import ArmaProcess
ar = np.r_[1, -ar_params]
ma = np.r_[1, ma_params]
arma_process = ArmaProcess(ar, ma)
simulated_data = arma_process.generate_sample(nsample=200)

# 划分训练集和测试集
train = simulated_data[:150]
test = simulated_data[150:]

# 拟合ARIMA模型
model = ARIMA(train, order=(1, 1, 1))
model_fit = model.fit()

# 模型摘要
print(model_fit.summary())

# 预测
forecast = model_fit.forecast(steps=len(test))
print(f'预测值前5个: {forecast[:5]}')
print(f'真实值前5个: {test[:5]}')

# 评估
from sklearn.metrics import mean_squared_error
mse = mean_squared_error(test, forecast)
print(f'均方误差: {mse:.4f}')

重要提醒:ARIMA模型假设残差是白噪声。建模后一定要做残差检验——如果残差还有自相关,说明模型没捕捉到所有信息,需要调整参数。

我个人习惯用「网格搜索+信息准则」来选择最优的(p,d,q)组合。比如这样:

import itertools

# 参数范围
p = range(0, 4)
d = range(0, 2)
q = range(0, 4)

best_aic = float('inf')
best_params = None

for pdq in itertools.product(p, d, q):
    try:
        model = ARIMA(train, order=pdq)
        model_fit = model.fit()
        if model_fit.aic < best_aic:
            best_aic = model_fit.aic
            best_params = pdq
    except:
        continue

print(f'最优参数: p={best_params[0]}, d={best_params[1]}, q={best_params[2]}')
print(f'最优AIC: {best_aic:.2f}')

你想想看,如果手动一个个试参数,得试到什么时候?自动化搜索才是正道。

3.5 知识体系总览

为了让你更直观地理解本章的知识结构,我画了一张流程图:

时间序列分析知识体系 原始时间序列数据 平稳性检验 (ADF检验) 非平稳 → 差分处理 平稳 → 分析ACF/PACF ARIMA(p,d,q) 建模与预测 预测结果与模型评估

这张图把整个流程串起来了。你从原始数据出发,先做平稳性检验,如果不平稳就差分,平稳了就分析ACF/PACF确定p和q,最后建模预测。每一步都有对应的Python代码实现。

我的经验:实际项目中,很少有数据能一次通过平稳性检验。别灰心,多试几次差分,或者考虑对数变换、Box-Cox变换。我曾经处理过一只股票的日收益率数据,做了两次差分才平稳——后来发现是因为有结构性突变,用了分段处理才搞定。

好了,这一章的内容就到这里。时间序列分析是量化投资的基石,ARIMA模型虽然经典,但理解透彻了,后面学GARCH、状态空间模型都会轻松很多。记住:理论要懂,代码要练,坑要自己踩过才记得牢。

专注资料整理