Modele VAR — wektorowa autoregresja i prognozowanie

Streszczenie

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:

  1. Sprawdź stacjonarność każdego szeregu (test ADF)
  2. 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

ModelZastosowanie
VECMZmienne skointegrowane (relacja długookresowa)
SVARStrukturalny VAR — restrykcje ekonomiczne na szoki
VARXVAR ze zmiennymi egzogenicznymi
Bayesian VARWiele zmiennych, mało danych (priory Minnesota)
TVP-VARWspółczynniki zmienne w czasie

Podsumowanie

  1. Sprawdź stacjonarność → różnicuj lub VECM przy kointegracji
  2. Dobierz rząd $p$ kryteriami informacyjnymi
  3. Estymuj i zdiagnozuj reszty
  4. Interpretuj przez IRF, FEVD i przyczynowość Grangera — nie surowe współczynniki
  5. Prognozuj z przedziałami ufności

Powiązane: Szeregi czasowe (ARIMA) · Autokorelacja

📚 Zasoby do nauki
  • Hamilton, Time Series Analysis, rozdz. 11
  • Lütkepohl, New Introduction to Multiple Time Series Analysis
  • Pakiet R: vars, tsDyn
  • Python: statsmodels.tsa.api.VAR
💻 Kod źródłowy

Wymagane pakiety:

install.packages(c("vars", "urca", "tseries"))
library(vars)
from statsmodels.tsa.api import VAR
import pandas as pd