所有文章 > AI驱动 > 突破最强时间序列模型,向量自回归!!

突破最强时间序列模型,向量自回归!!

首先来说,时间序列模型是用来分析和预测数据随时间变化的模型。所谓“时间序列”,就是一个随着时间推移而记录下来的数据,比如股票价格、气温、销售额等。时间序列模型的目标是利用过去的数据(历史记录)来预测未来的值。

比如说,你每天都记录你体重的变化,形成了一组“体重数据”,这个数据就是时间序列。通过时间序列模型,你可以根据过去几天的体重变化,预测明天的体重可能是多少。

什么是向量自回归(VAR)模型?

向量自回归模型(VAR,全称Vector Autoregression)是一种特殊的时间序列模型,它不仅考虑了一个变量的过去值对自身未来的影响,还考虑了多个变量之间的相互影响。简单来说,VAR 模型用来处理多个时间序列之间的相互作用,预测不仅仅是一个变量,而是多个变量。

自回归这个词的意思是:模型使用变量过去的值(也就是“自己”)来预测它未来的值。而“向量”说明我们不只是处理一个变量,而是多个变量。

举个例子:

假设我们有两个时间序列数据:

  1. A公司股票价格(变量A)
  2. B公司股票价格(变量B)

我们知道这两个公司有合作关系,因此它们的股价是相互影响的:A公司股票涨了,可能会带动B公司股票也涨,反之亦然。我们想要预测未来几天这两家公司股票的价格。

在这种情况下,我们可以用向量自回归模型(VAR)来建模。VAR模型不仅考虑A公司股价过去几天对A公司未来股价的影响,还会考虑A公司股价对B公司未来股价的影响,反之亦然。

更具体的步骤:

  1. 输入数据:过去一段时间的A公司和B公司的股票价格数据。
  2. 预测未来值:模型会根据A和B公司过去的价格,预测未来几天它们各自的股票价格。

数学层面:

  • 假设你想用今天A和B的股价预测明天的价格。
    • 明天A公司的股价 = A公司过去股价的一些加权平均 + B公司过去股价的一些加权平均 + 噪音(误差)
    • 明天B公司的股价 = B公司过去股价的一些加权平均 + A公司过去股价的一些加权平均 + 噪音(误差)

通过不断更新这些系数(即加权平均的权重),VAR模型能够帮助我们捕捉A公司和B公司之间的复杂关系,并用于未来预测。

一个简单的例子

假设你开了一家饮料店,你每天记录:

  • 天气温度(变量A)
  • 当天销售额(变量B)

你发现天气对你的销售有一定的影响:天气越热,买饮料的人越多,销售额就越高。于是你希望能根据过去几天的天气和销售情况,预测未来几天的销售额。

你可以用向量自回归(VAR)模型来建模:

  1. 变量A:天气温度(过去几天的温度数据)
  2. 变量B:饮料店的销售额(过去几天的销售数据)

VAR模型会分析过去几天温度和销售的关系,比如:

  • 昨天温度上升,销售额也上升;
  • 前天温度很低,销售额下降。

模型会考虑:

今天的销售额不仅与昨天的销售额有关,还与昨天的温度有关。

然后,模型可以帮助你预测未来几天的销售额。

总结2点:

  • 时间序列模型主要用于分析一个变量随时间的变化,比如预测股票价格、销售额等。
  • 向量自回归(VAR)模型是一个高级的时间序列模型,它可以处理多个变量之间的相互影响,帮助我们理解和预测多个相关变量的未来变化。

通过向量自回归模型,你不仅可以根据过去的某个变量来预测它的未来,还能捕捉多个变量之间的互动,从而做出更准确的预测。

那么,在介绍完基本的概念之后,咱们从原理方面好好唠唠~

向量自回归(VAR)模型

时间序列模型基础

时间序列模型假设某一变量的未来值是其过去值的函数。一个典型的自回归(AR)模型表示为:

其中:

  •  是时间点  的变量值(例如,某公司当天的股票价格)。
  •  是模型参数,它们描述了过去  个时间点对当前时刻的影响。
  •  是白噪声(误差项)。

向量自回归(VAR)模型的推导

VAR 模型扩展了自回归模型的思路,用来处理多个相互关联的时间序列。假设我们有  个变量(如多个公司的股票价格或不同地区的气温),则这些变量不仅仅是受自身过去的影响,还受到其他变量的历史值影响。

对于一个VAR(p)模型,可以表示为:

其中:

  •  是一个  的向量,包含  个变量的值(比如当天多个公司股票的价格)。
  •  是一个常数项向量。
  •  是  的矩阵,表示过去第  天各个变量对当前的影响。
  •  是  的白噪声向量。

这样,对于多个变量,VAR模型考虑了它们之间的交互影响。我们要根据历史数据估计这些  矩阵中的系数。

最小二乘法估计参数

为了估计 VAR 模型中的参数矩阵 ,我们通常使用最小二乘法。这涉及将历史数据表示为线性方程组,并通过最小化误差项  来估计模型系数。

步骤概述

  • 数据预处理:准备好时间序列数据,创建滞后变量(即之前时间点的数据)。
  • 构建方程:将历史数据表达为线性回归方程,并使用矩阵形式进行计算。
  • 参数估计:利用最小二乘法解出参数矩阵。
  • 预测:使用估计出来的参数矩阵进行未来数据的预测。

完整案例

我们生成一个简单的时间序列虚拟数据集~

接下来,我们将逐步实现VAR模型的核心步骤。

数据预处理

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 1. 生成虚拟数据作为案例数据集
np.random.seed(42)

# 定义时间长度
n = 500 # 我们生成500个时间点的数据

# 初始化变量
gdp_growth = np.zeros(n)
unemployment_rate = np.zeros(n)
cpi = np.zeros(n)

# 随机初始值
gdp_growth[0] = np.random.normal(2, 0.5) # 初始GDP增长率
unemployment_rate[0] = np.random.normal(5, 0.5) # 初始失业率
cpi[0] = np.random.normal(100, 2) # 初始CPI

# 人为设置数据生成的规则(根据上一期的值和一些噪声)
for t in range(1, n):
gdp_growth[t] = 0.8 * gdp_growth[t-1] - 0.2 * cpi[t-1] + np.random.normal(0, 0.5)
unemployment_rate[t] = 0.7 * unemployment_rate[t-1] - 0.1 * gdp_growth[t-1] + np.random.normal(0, 0.2)
cpi[t] = 0.5 * cpi[t-1] + 0.3 * gdp_growth[t-1] + np.random.normal(0, 1)

# 将生成的数据整理为DataFrame
data = pd.DataFrame({
'GDP_growth': gdp_growth,
'unemployment_rate': unemployment_rate,
'CPI': cpi
})
variables = ['GDP_growth', 'unemployment_rate', 'CPI']
data = data[variables].dropna()
data = (data - data.mean()) / data.std()

# 查看数据
print(data.head())

创建滞后变量

# 定义滞后变量的生成函数
def create_lagged_data(data, max_lag):
lagged_data = []
for lag in range(1, max_lag + 1):
lagged_data.append(data.shift(lag))
return pd.concat(lagged_data, axis=1)

# 假设我们使用2个滞后变量
max_lag = 2
lagged_data = create_lagged_data(data, max_lag)

# 将滞后变量与原始数据拼接,去掉缺失的初始行
lagged_data = lagged_data.dropna()
X = lagged_data.values
Y = data[max_lag:].values

参数估计(最小二乘法)

# 使用最小二乘法估计VAR模型参数
def estimate_var(X, Y):
# 增加常数项(拦截项)
X = np.hstack([np.ones((X.shape[0], 1)), X])

# OLS公式: B = (X^T X)^(-1) X^T Y
B = np.linalg.inv(X.T @ X) @ X.T @ Y
return B

# 估计参数矩阵
B = estimate_var(X, Y)
print("估计的系数矩阵:\n", B)

预测未来值

# 进行预测
def predict(X, B):
X = np.hstack([np.ones((X.shape[0], 1)), X]) # 加入常数项
return X @ B

# 预测未来值
predicted_values = predict(X, B)

绘制数据分析图

图1:变量趋势图

plt.figure(figsize=(10, 6))
for col in data.columns:
plt.plot(data.index, data[col], label=col)
plt.title("Trends of Variables Over Time") # 标题改为英文
plt.xlabel("Time") # x轴标签改为英文
plt.ylabel("Standardized Value") # y轴标签改为英文
plt.legend()
plt.show()

图2:滞后相关性图

from pandas.plotting import lag_plot
plt.figure(figsize=(10, 6))
for i, var in enumerate(variables):
plt.subplot(2, 2, i+1)
lag_plot(data[var], lag=1)
plt.title(f'{var} Lag Relationship')
plt.tight_layout()
plt.show()

图3:残差分析图

residuals = Y - predicted_values
plt.figure(figsize=(10, 6))
plt.plot(residuals)
plt.title("Residual Analysis")
plt.xlabel("Time")
plt.ylabel("Residuals")
plt.show()

图4:预测结果对比图

plt.figure(figsize=(10, 6))
plt.plot(Y[:, 0], label="True Values")
plt.plot(predicted_values[:, 0], label="Predicted Values", linestyle="--")
plt.title("Comparison of Predicted and True Values (GDP Growth Rate)")
plt.xlabel("Time")
plt.ylabel("Value")
plt.legend()
plt.show()

通过这个案例,我们从零实现了向量自回归模型(VAR)的核心步骤,并进行了多种数据分析和图形展示,大家可以依照理论进行学习~

最后

通过手动实现 ARMA 模型,可以深刻理解其数学推导和实现细节,同时通过图形直观地理解模型的拟合效果和残差分布。

本文章转载微信公众号@深夜努力写Python