突破最强时间序列模型,向量自回归!!
首先来说,时间序列模型是用来分析和预测数据随时间变化的模型。所谓“时间序列”,就是一个随着时间推移而记录下来的数据,比如股票价格、气温、销售额等。时间序列模型的目标是利用过去的数据(历史记录)来预测未来的值。
比如说,你每天都记录你体重的变化,形成了一组“体重数据”,这个数据就是时间序列。通过时间序列模型,你可以根据过去几天的体重变化,预测明天的体重可能是多少。
什么是向量自回归(VAR)模型?
向量自回归模型(VAR,全称Vector Autoregression)是一种特殊的时间序列模型,它不仅考虑了一个变量的过去值对自身未来的影响,还考虑了多个变量之间的相互影响。简单来说,VAR 模型用来处理多个时间序列之间的相互作用,预测不仅仅是一个变量,而是多个变量。
自回归这个词的意思是:模型使用变量过去的值(也就是“自己”)来预测它未来的值。而“向量”说明我们不只是处理一个变量,而是多个变量。
举个例子:
假设我们有两个时间序列数据:
- A公司股票价格(变量A)
- B公司股票价格(变量B)
我们知道这两个公司有合作关系,因此它们的股价是相互影响的:A公司股票涨了,可能会带动B公司股票也涨,反之亦然。我们想要预测未来几天这两家公司股票的价格。
在这种情况下,我们可以用向量自回归模型(VAR)来建模。VAR模型不仅考虑A公司股价过去几天对A公司未来股价的影响,还会考虑A公司股价对B公司未来股价的影响,反之亦然。
更具体的步骤:
- 输入数据:过去一段时间的A公司和B公司的股票价格数据。
- 预测未来值:模型会根据A和B公司过去的价格,预测未来几天它们各自的股票价格。
数学层面:
- 假设你想用今天A和B的股价预测明天的价格。
- 明天A公司的股价 = A公司过去股价的一些加权平均 + B公司过去股价的一些加权平均 + 噪音(误差)
- 明天B公司的股价 = B公司过去股价的一些加权平均 + A公司过去股价的一些加权平均 + 噪音(误差)
通过不断更新这些系数(即加权平均的权重),VAR模型能够帮助我们捕捉A公司和B公司之间的复杂关系,并用于未来预测。
一个简单的例子
假设你开了一家饮料店,你每天记录:
- 天气温度(变量A)
- 当天销售额(变量B)
你发现天气对你的销售有一定的影响:天气越热,买饮料的人越多,销售额就越高。于是你希望能根据过去几天的天气和销售情况,预测未来几天的销售额。
你可以用向量自回归(VAR)模型来建模:
- 变量A:天气温度(过去几天的温度数据)
- 变量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