最强总结,十大时间序列算法 - 向量自回归!!

文摘   2024-11-15 11:26   北京  

哈喽,我是小白~

今儿和大家详细的聊聊时间序列中的向量自回归~

之前总结了十大时间序列法的内容,大家有空可以看看,这里跳转

后面,会细化每一个时间序列算法的内容,大家可以关注起来~

如果需要本文PDF版本的同学,文末获取~

另外,文末有总结性的干货~

一起来看下具体细化内容~

向量自回归 是什么?

向量自回归(Vector AutoRegression,简称VAR)是一种常用的时间序列分析算法,特别适合用来分析多个时间序列之间的相互关系。

假设我们有多个时间序列数据,彼此之间可能存在某种关联。VAR模型的核心是:每个时间序列的当前值可以通过它自身过去的值和其他时间序列的过去值来预测。

比如,假设我们想预测某个城市的房价失业率这两个指标。很可能房价会受到之前房价的影响(房价趋势),也会受到失业率的影响(经济因素);同时,失业率也可能受到之前失业率的影响,还会受房价的影响(生活成本因素)。这时,我们就可以使用VAR模型来捕捉这两个指标的互相影响关系。

VAR的数学公式

在VAR模型中,如果有两个时间序列  和 ,那么模型可以表示为:

其中:

  •  和 :在时间  的两个时间序列值(比如房价和失业率)。
  • :常数项。
  • :回归系数,用来表示各个变量的影响程度。
  • :误差项,表示一些不可预测的随机因素。

简单来说,当前的房价和失业率,都会受到它们之前的房价和失业率的影响。

简单案例:房价和失业率

假设我们有一组数据:

时间房价(万元)失业率(%)
11005.0
21024.8
31015.1
41035.0
5??

我们的目标是用VAR模型来预测时间点5的房价和失业率。

VAR模型的计算步骤

1. 设定模型参数:假设我们已经计算出回归系数(这里的系数只是虚拟的示例,实际情况需要使用统计软件进行拟合):

2. 建立方程:根据这些系数,模型的方程可以写为:

3. 代入数值:使用时间点4的数据(房价=103,失业率=5.0),代入上面的方程,计算时间点5的预测值:

  • 房价预测:
  • 失业率预测:

在这个例子里,VAR模型通过时间点4的房价和失业率数据,预测了时间点5的房价为80.9万元,失业率为-25.9%。显然,这个例子数据简单,实际预测结果有些异常(失业率不可能为负),这可能是因为我们假设的系数不够合理。实际应用中,需要更多数据和更精确的系数才能得到真实的结果。

VAR模型适合用于分析多个时间序列之间的关系。它的关键在于利用多个时间序列的历史信息,互相之间的动态关系,为未来的各个时间序列值做出预测。

公式解析

给定  个时间序列变量 ,它们组成了一个 -维向量时间序列 。VAR(p) 模型的形式为:

其中:

  •  是  的常数项向量。
  •  是  的系数矩阵,表示第  阶滞后时间的系数。
  •  是  的误差项向量(噪声),假设  满足独立同分布,即 ,其中  是  的协方差矩阵。

对于 VAR(1) 模型,假设 ,即我们有两个变量  和 ,则模型可以展开为:

其中:

  •  是常数项。
  •  是 VAR(1) 模型的系数。
  •  是误差项。

VAR 模型的矩阵形式推导

将上述 VAR(1) 模型写成矩阵形式,我们得到:

因此,模型可以写为:

VAR(p) 模型的推广

对于更高阶的模型(VAR(p)),当前时刻的值不仅与上一个时刻的值相关,还与前  个时刻的值相关。具体形式为:

其中, 是每个滞后阶的系数矩阵。

参数估计

VAR 模型的参数估计通常通过最小二乘法(Ordinary Least Squares, OLS)来进行。对于 VAR(p) 模型,可以将模型转换为多元线性回归问题,利用 OLS 得到系数矩阵的估计值。

构造滞后矩阵

对于样本  和滞后阶数 ,构造滞后矩阵  为:

VAR 系数的估计

我们定义  为 VAR(p) 模型的参数矩阵。为了估计参数,可以使用以下公式:

预测公式

一旦我们估计出模型参数 ,就可以通过以下公式来进行预测:

其中  表示预测的步长。

优缺点和适用场景

向量自回归(VAR)模型在时间序列分析中非常重要,尤其在分析多个变量相互关系时。相比其他时间序列模型,VAR 有其独特的优势和局限性。

1. VAR 模型的优缺点

优点

  • 多变量动态关系:VAR 模型适合处理多个时间序列变量之间的相互影响。它不仅可以描述一个变量的变化,还能捕捉多个变量之间的交互关系,适合于具有因果联系的多元时间序列数据。
  • 相对简单的建模和解释:VAR 模型结构简单,便于解释。每个变量的值通过滞后期的自己和其他变量的值线性组合表示,这在解释时更直观。
  • 灵活性:VAR 模型允许每个变量使用不同的滞后项组合,适应性较强,尤其在研究变量间短期动态关系时表现优异。

缺点

  • 参数估计复杂度高:当变量较多或滞后阶数较高时,参数的数量会急剧增加,导致模型可能过于复杂、难以解释,且易产生过拟合。
  • 线性关系假设:VAR 是线性模型,无法捕捉变量之间的非线性关系,可能不适合存在显著非线性关系的时间序列。
  • 对平稳性的要求:VAR 模型假设数据是平稳的,不平稳数据需进行差分处理,否则可能导致虚假回归。

2. VAR 模型与其他时间序列模型的对比

模型优点缺点适用场景
VAR适用于多变量关系分析,简单易解释参数多、难以处理非线性、需平稳数据多变量系统,如经济、金融数据
ARIMA适合单变量预测,处理趋势和季节性仅适合单变量,难以描述变量间的相互影响单变量预测,如温度、销售量
SARIMAARIMA的扩展,适用于季节性数据仅适合单变量预测,建模复杂度高季节性数据分析,如季节性需求
GARCH擅长处理波动性较大的数据,常用于金融领域仅适合单变量,难以分析多个变量间的关系金融数据中的波动率预测
Prophet自动化程度高,适合带有趋势和季节性的单变量参数灵活性较低,对非周期数据效果较差销售、流量等周期性数据预测
LSTM能捕捉长时依赖,适合处理非线性关系需要大量数据,训练时间长,难以解释非线性、复杂依赖的时间序列,如股票、物联网数据
  • ARIMA:适合单变量时间序列预测,特别是可以处理带有趋势和季节性的单变量时间序列。但是,对于多变量时间序列(如多种经济指标之间的关系),ARIMA 适用性有限。
  • GARCH:常用于金融数据(如股价、汇率)的波动率预测,GARCH 能很好地处理金融时间序列中的异方差现象。VAR 不考虑异方差性,因此不适合此类波动性较高的数据。
  • LSTM(Long Short-Term Memory):一种神经网络模型,适合长时间依赖的非线性时间序列。LSTM 可以捕捉复杂的非线性依赖关系,但训练过程较慢,对大数据量依赖强。

3. VAR 模型的适用场景

VAR 模型适合用于分析和预测多个时间序列之间的相互关系,尤其是在经济学和金融学领域得到广泛应用。适用的场景包括:

  • 宏观经济分析:用于研究各项经济指标(如 GDP、利率、通货膨胀率、失业率)之间的相互关系,捕捉经济体系内的动态结构。
  • 金融市场分析:用于分析多个金融市场指标(如股票指数、汇率、利率)之间的动态关系,特别是在风险管理和投资组合分析中。
  • 能源市场分析:用于分析油价、电价、天然气价格之间的相互影响,有助于能源领域的定价和风险管理。
  • 区域经济分析:在区域经济研究中,可以使用 VAR 模型分析区域间的经济依赖关系,如各省市的 GDP 增长率与其他经济变量的关系。
  • 医疗和流行病分析:可用于分析多个健康指标(如感染率、住院率、疫苗接种率)之间的关系,以预测疫情发展。

完整案例

在此案例中,我们生成了模拟数据来展示 VAR 模型的工作原理。代码实现了模型的拟合和预测,并绘制以下数据分析图:

  1. 时间序列图:显示每个经济指标的历史趋势。
  2. 预测图:显示未来若干期的预测结果。
  3. 残差热力图:展示模型的残差相关性。
  4. 相关矩阵图:显示不同指标之间的相关性。

完整代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from statsmodels.tsa.api import VAR
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

# 设置随机种子和时间序列长度
np.random.seed(42)
n_obs = 1000

# 生成模拟数据:GDP、失业率、通货膨胀率和利率
dates = pd.date_range("2021-01-01", periods=n_obs, freq="M")
data = {
    "GDP": np.cumsum(np.random.normal(01, n_obs)) + 100,
    "Unemployment": np.cumsum(np.random.normal(00.5, n_obs)) + 5,
    "Inflation": np.cumsum(np.random.normal(00.3, n_obs)) + 2,
    "Interest_Rate": np.cumsum(np.random.normal(00.2, n_obs)) + 3,
}
df = pd.DataFrame(data, index=dates)

# 创建并拟合 VAR 模型
model = VAR(df)
results = model.fit(4)

# 预测未来12期
lag_order = results.k_ar
forecast = results.forecast(df.values[-lag_order:], steps=12)
forecast_index = pd.date_range(df.index[-1] + pd.DateOffset(1), periods=12, freq="M")
df_forecast = pd.DataFrame(forecast, index=forecast_index, columns=df.columns)

# 使用 Seaborn 的样式来美化图表
sns.set(style="whitegrid")

# 1. 绘制原始时间序列数据
plt.figure(figsize=(128))
for i, col in enumerate(df.columns):
    plt.plot(df.index, df[col], label=col, linewidth=1.5)
plt.legend(loc="upper left", fontsize=12)
plt.title("Historical Time Series Data of Economic Indicators", fontsize=16, weight="bold")
plt.xlabel("Year", fontsize=14)
plt.ylabel("Values", fontsize=14)
plt.grid(True, linestyle='--', alpha=0.7)
plt.show()

# 2. 预测结果图
plt.figure(figsize=(128))
for col in df.columns:
    plt.plot(df.index, df[col], label=f"Historical {col}", color="blue", linewidth=1.5)
    plt.plot(df_forecast.index, df_forecast[col], label=f"Forecasted {col}", linestyle="--", color="red", linewidth=1.5)
plt.legend(loc="upper left", fontsize=12)
plt.title("Forecasted Economic Indicators using VAR Model", fontsize=16, weight="bold")
plt.xlabel("Year", fontsize=14)
plt.ylabel("Values", fontsize=14)
plt.grid(True, linestyle='--', alpha=0.7)
plt.show()

# 3. 残差相关性热力图
residuals = results.resid
plt.figure(figsize=(86))
sns.heatmap(residuals.corr(), annot=True, cmap="coolwarm", center=0, fmt=".2f", linewidths=0.5)
plt.title("Residual Correlation Heatmap", fontsize=16, weight="bold")
plt.show()

# 4. 经济指标之间的相关性矩阵热力图
plt.figure(figsize=(86))
sns.heatmap(df.corr(), annot=True, cmap="viridis", center=0, fmt=".2f", linewidths=0.5)
plt.title("Correlation Matrix of Economic Indicators", fontsize=16, weight="bold")
plt.show()

# 5. 残差的自相关图(以GDP残差为例)
plt.figure(figsize=(104))
plot_acf(residuals["GDP"], lags=20)
plt.title("Autocorrelation of GDP Residuals", fontsize=16, weight="bold")
plt.grid(True, linestyle='--', alpha=0.7)
plt.show()

# 6. 残差的偏自相关图(以GDP残差为例)
plt.figure(figsize=(104))
plot_pacf(residuals["GDP"], lags=20)
plt.title("Partial Autocorrelation of GDP Residuals", fontsize=16, weight="bold")
plt.grid(True, linestyle='--', alpha=0.7)
plt.show()

1. 时间序列图:展示了 GDPUnemploymentInflation 和 Interest_Rate 的历史趋势,帮助观察不同经济指标的变化情况。

2. 预测结果图:蓝色实线表示历史数据,红色虚线表示未来12期的预测数据,便于对未来趋势的可视化分析。

3. 残差相关性热力图:显示不同指标残差间的相关性,帮助评估模型的拟合效果。

4. 经济指标的相关性矩阵热力图:展示不同经济指标之间的相关性,便于理解变量间的关系。

5. 残差的自相关图(以GDP残差为例):用于检验残差的自相关性,评估模型拟合的残差特性。

6. 残差的偏自相关图(以GDP残差为例):进一步分析残差的偏自相关性,提供模型诊断依据。

综合上述可视化分析,我们能够深入理解 VAR 模型对宏观经济指标的分析效果,并通过残差分析评估模型的可靠性。

最后

以上就是今天所有的内容了。
获取本文PDF,点击名片回复「基础算法模型」即可~
 
另外, 我们整理了机器学习算法册子,总共16大块的内容,124个问题的总结点击领取!
如果对你来说比较有用,记得点赞、转发,收藏起来慢慢学习~
下期会有更多干货等着你!~

Python和机器学习初学者
Python和机器学习分享,只写干货,一起学习~
 最新文章