写在前面:所写仅为个人理解,请各位读者指正。
1 向量自回归 VAR
1.1 简述
向量自回归(Vector Autoregression,简称VAR)模型是一种常用的多变量时间序列分析模型,由Christopher A. Sims在1980年提出。用于预测相互关联的时间序列变量,并探究它们之间的动态关系。
- 多元时间序列:VAR模型处理的是多个同时收集的时间序列数据,
- 自回归结构:每个变量的当前值由自身过去值以及其他变量的过去值共同预测。
- 模型估计:通常使用最小二乘法(OLS)来估计VAR模型的参数。
1.2 时间序列
首先我们要知道时间序列长什么样子:
1.3 术语概念
内生变量:受影响的变量。可以理解为真实存在数据集中的数据
外生变量:不受模型中变量的影响,但可以影响内生变量。可以理解为未被采集到的数据。
1.3 公式
- y y y 表示一个标量
- y \mathbf{y} y 表示一个样本向量
- A \mathbf{A} A 表示一个矩阵
一个基本的VAR模型可以表示为:
y
t
=
c
+
A
1
y
t
−
1
+
A
2
y
t
−
2
+
…
+
A
p
y
t
−
p
+
ε
t
\mathbf{y}_t=\mathbf{c}+\mathbf{A}_1\mathbf{y}_{t-1}+\mathbf{A}_2\mathbf{y}_{t-2}+\ldots+\mathbf{A}_p\mathbf{y}_{t-p}+ \mathbf{\varepsilon_t}
yt=c+A1yt−1+A2yt−2+…+Apyt−p+εt
- y t ∈ R k \mathbf{y}_t \in \mathbb{R}^k yt∈Rk是 k k k个内生变量在时间 t t t的观测值。
- c ∈ R k \mathbf{c} \in \mathbb{R}^k c∈Rk是常数向量。
- A i ∈ R k × k \mathbf{A}_i \in \mathbb{R}^{k \times k} Ai∈Rk×k是系数矩阵,表示 t − i t-i t−i 时刻的 y t − i \mathbf{y}_{t-i} yt−i 对 y t \mathbf{y}_t yt的影响。
- ε t ∈ R k \varepsilon_t \in \mathbb{R}^k εt∈Rk是误差项向量,通常假设其满足经典的高斯白噪声过程。
- p p p为阶数(可以理解为步长),即 t t t时刻的预测值通过需要 t − 1 t-1 t−1 ~ t − p t-p t−p 时刻的数据进行预测。
1.4 理解
由上面的公式可以看出:标准的VAR模型就是一个多元线性回归模型。只不过用当前时间步的样本作为标签,之前p个时间步的样本整体作为新的样本。
具体线性模型可以看我的动手学深度学习pytorch
专栏
2 结构向量自回归 SVAR
在SVAR模型中,假设误差项
ε
t
\varepsilon_t
εt 可以被分解为两个部分:一个反映同期结构性影响的
B
η
t
B\eta_t
Bηt,和一个表示简化VAR模型中误差项的
u
t
u_t
ut。即:
ε
t
=
B
η
t
+
u
t
\varepsilon_t = \mathbf{B}\eta_t + u_t
εt=Bηt+ut
其中,
B
∈
R
k
×
m
\mathbf{B} \in \mathbb{R}^{k \times m}
B∈Rk×m,
m
≤
k
m \leq k
m≤k,
η
t
∈
R
m
\eta_t \in \mathbb{R}^{m}
ηt∈Rm 是结构性冲击向量,
u
t
∈
R
k
u_t \in \mathbb{R}^{k}
ut∈Rk 是简化误差项向量。
代入VAR模型,我们得到SVAR模型:
A
0
Y
t
=
c
+
A
1
Y
t
−
1
+
A
2
Y
t
−
2
+
…
+
A
p
Y
t
−
p
+
B
η
t
+
u
t
\mathbf{A}_0\mathbf{Y}_t = \mathbf{c} + \mathbf{A}_1\mathbf{Y}_{t-1} + \mathbf{A}_2\mathbf{Y}_{t-2} + \ldots + \mathbf{A}_p\mathbf{Y}_{t-p} + \mathbf{B}\mathbf{\eta}_t + \mathbf{u}_t
A0Yt=c+A1Yt−1+A2Yt−2+…+ApYt−p+Bηt+ut
其中, A 0 ∈ R k × k \mathbf{A}_0 \in \mathbb{R}^{k \times k} A0∈Rk×k 用于反映同期结构性影响。
代码
由GPT生成
import numpy as np
import pandas as pd
import statsmodels.api as sm
# 假设我们有一个包含两个变量的数据集
# 这里我们使用随机数据作为示例
np.random.seed(0)
data = pd.DataFrame(np.random.randn(100, 2), columns=['X', 'Y'])
# 创建VAR模型
model_var = sm.tsa.VAR(data)
results_var = model_var.fit()
# 创建SVAR模型
# 假设我们有一个外生变量Z
np.random.seed(0)
z = pd.DataFrame(np.random.randn(100, 1), columns=['Z'])
data['Z'] = z
# 创建SVAR模型,并假设Z是外生变量
model_svar = sm.tsa.SVAR(data, {'Z': 'endog'})
results_svar = model_svar.fit()
# 打印VAR和SVAR模型的结果
print(results_var.summary())
print(results_svar.summary())