Modele VAR — wektorowa autoregresja i prognozowanie
Wektorowe modele autoregresyjne (VAR): estymacja, wybór rzędu, funkcje odpowiedzi na impuls (IRF), dekompozycja wariancji, przyczynowość Grangera — R i Python
Zastosowanie modeli VAR
Modele jednorównaniowe (ARIMA) opisują jeden szereg. Ale zmienne makroekonomiczne wzajemnie na siebie oddziałują:
- Stopa procentowa wpływa na inflację, a inflacja na stopę
- PKB i bezrobocie zależą od siebie nawzajem (prawo Okuna)
- Kurs walutowy i bilans handlowy
VAR (Vector AutoRegression) traktuje wszystkie zmienne symetrycznie — każda jest funkcją własnych opóźnień ORAZ opóźnień pozostałych. Wprowadzony przez Christophera Simsa (Nobel 2011) jako krytyka „nierealistycznych" restrykcji modeli strukturalnych.
Struktura modelu VAR(p)
Dla $k$ zmiennych i $p$ opóźnień, VAR(p) to układ $k$ równań:
$$ \mathbf{y}_t = \mathbf{c} + \mathbf{A}_1 \mathbf{y}_{t-1} + \mathbf{A}_2 \mathbf{y}_{t-2} + \dots + \mathbf{A}_p \mathbf{y}_{t-p} + \boldsymbol{\varepsilon}_t $$gdzie $\mathbf{y}_t$ to wektor $k \times 1$, a $\mathbf{A}_i$ to macierze współczynników $k \times k$.
Przykład VAR(1) dla dwóch zmiennych
$$ \begin{aligned} y_{1,t} &= c_1 + a_{11} y_{1,t-1} + a_{12} y_{2,t-1} + \varepsilon_{1,t} \\ y_{2,t} &= c_2 + a_{21} y_{1,t-1} + a_{22} y_{2,t-1} + \varepsilon_{2,t} \end{aligned} $$Każda zmienna zależy od opóźnień obu zmiennych. Współczynnik $a_{12}$ mówi, jak przeszłość $y_2$ wpływa na obecne $y_1$.
Warunek wstępny: stacjonarność
VAR wymaga stacjonarnych szeregów. Procedura:
- Sprawdź stacjonarność każdego szeregu (test ADF)
- Jeśli niestacjonarne → różnicuj (lub sprawdź kointegrację → model VECM)
library(urca)
library(vars)
# Test stacjonarności (ADF) dla każdej zmiennej
summary(ur.df(dane$pkb, type = "trend", lags = 4))
summary(ur.df(dane$inflacja, type = "drift", lags = 4))
# Jeśli niestacjonarne — różnicowanie
dane_diff <- diff(as.matrix(dane))
Jeśli zmienne są skointegrowane (mają wspólny trend stochastyczny), NIE różnicuj — użyj VECM (Vector Error Correction Model), który zachowuje relację długookresową.
Wybór rzędu opóźnień
Liczbę opóźnień $p$ dobieramy kryteriami informacyjnymi:
library(vars)
# Automatyczny wybór p wg AIC, BIC, HQ, FPE
VARselect(dane, lag.max = 10, type = "const")
# Zwraca rekomendowane p dla każdego kryterium
- AIC — skłonny do większego p (lepsze prognozy)
- BIC (SC) — bardziej oszczędny (mniejsze p)
- Przy konflikcie → kompromis, sprawdź autokorelację reszt
Estymacja
# Estymacja VAR(2)
model <- VAR(dane, p = 2, type = "const")
summary(model)
# Diagnostyka reszt
serial.test(model, lags.pt = 12) # autokorelacja (Portmanteau)
normality.test(model) # normalność
arch.test(model) # heteroskedastyczność (ARCH)
from statsmodels.tsa.api import VAR
model = VAR(dane)
# Wybór rzędu
print(model.select_order(maxlags=10).summary())
# Estymacja
results = model.fit(2)
print(results.summary())
Interpretacja: trzy narzędzia
Pojedyncze współczynniki VAR są trudne do interpretacji (dużo parametrów). Zamiast tego analizujemy:
1. Funkcje odpowiedzi na impuls (IRF)
Pokazują, jak szok w jednej zmiennej wpływa na pozostałe w czasie:
# Jak szok inflacji wpływa na PKB przez 10 okresów?
irf_wynik <- irf(model, impulse = "inflacja", response = "pkb",
n.ahead = 10, boot = TRUE)
plot(irf_wynik)
To najważniejsze narzędzie VAR — odpowiada na pytanie „co się stanie, gdy…".
2. Dekompozycja wariancji (FEVD)
Pokazuje, jaki procent zmienności prognozy danej zmiennej wynika z szoków poszczególnych zmiennych:
fevd_wynik <- fevd(model, n.ahead = 10)
plot(fevd_wynik)
# Np. "60% wariancji PKB w horyzoncie 10 wynika z szoków własnych, 40% z inflacji"
3. Przyczynowość Grangera
Testuje, czy przeszłość $X$ pomaga prognozować $Y$ (ponad własną przeszłość $Y$):
causality(model, cause = "inflacja")$Granger
# H0: inflacja NIE jest przyczyną Grangera dla pozostałych
Uwaga: „przyczynowość Grangera" to predykcyjność, NIE przyczynowość w sensie strukturalnym. X może „granger-powodować" Y bez bycia jego rzeczywistą przyczyną (np. przez wspólną trzecią zmienną lub oczekiwania).
Prognozowanie
# Prognoza na 8 okresów do przodu z przedziałami ufności
prognoza <- predict(model, n.ahead = 8, ci = 0.95)
plot(prognoza)
fanchart(prognoza) # wykres wachlarzowy
# Python
lag_order = results.k_ar
prognoza = results.forecast(dane.values[-lag_order:], steps=8)
results.plot_forecast(8)
Kolejność zmiennych ma znaczenie (dekompozycja Choleskiego)
IRF i FEVD zależą od kolejności zmiennych (przy ortogonalizacji Choleskiego). Założenie: zmienne wcześniejsze wpływają na późniejsze natychmiast, ale nie odwrotnie.
Zasada: uporządkuj od „najbardziej egzogenicznej" do „najbardziej endogenicznej". Np. polityka pieniężna często ostatnia (reaguje na wszystko). Sprawdź wrażliwość wyników na zmianę kolejności.
Rozszerzenia
| Model | Zastosowanie |
|---|---|
| VECM | Zmienne skointegrowane (relacja długookresowa) |
| SVAR | Strukturalny VAR — restrykcje ekonomiczne na szoki |
| VARX | VAR ze zmiennymi egzogenicznymi |
| Bayesian VAR | Wiele zmiennych, mało danych (priory Minnesota) |
| TVP-VAR | Współczynniki zmienne w czasie |
Podsumowanie
- Sprawdź stacjonarność → różnicuj lub VECM przy kointegracji
- Dobierz rząd $p$ kryteriami informacyjnymi
- Estymuj i zdiagnozuj reszty
- Interpretuj przez IRF, FEVD i przyczynowość Grangera — nie surowe współczynniki
- Prognozuj z przedziałami ufności
Powiązane: Szeregi czasowe (ARIMA) · Autokorelacja
- Hamilton, Time Series Analysis, rozdz. 11
- Lütkepohl, New Introduction to Multiple Time Series Analysis
- Pakiet R:
vars,tsDyn - Python:
statsmodels.tsa.api.VAR
Wymagane pakiety:
install.packages(c("vars", "urca", "tseries"))
library(vars)
from statsmodels.tsa.api import VAR
import pandas as pd