VAR — 서로를 예측하는 여러 시계열
지금까지 다룬 AR·ARIMA·ETS·GARCH는 모두 하나의 시계열을 그 자신의 과거로 설명했습니다. 하지만 현실의 변수들은 혼자 움직이지 않습니다. 금리를 올리면 몇 분기 뒤 성장률이 흔들리고, 성장률이 과열되면 물가가 오르고, 물가가 오르면 다시 금리가 반응합니다. 서로가 서로의 과거에 반응하는 이 얽힘을 단변량 모형은 담을 수 없습니다.
VAR(Vector Autoregression, 벡터자기회귀)는 AR을 여러 변수로 확장해, 이 얽힘 자체를 모델링합니다. 이 글에서는 AR에서 VAR로 넘어가는 발상, 정상성 전제, 그리고 실제 미국 거시데이터로 차수 선택 → Granger 인과성 → 충격반응 → 분산분해 → 예측까지 한 바퀴 돌아봅니다.
1. AR에서 VAR로 — 왜 다변량인가
AR 모형은 한 변수 $y_t$를 자기 과거로 설명했습니다.
\[y_t = c + \phi_1 y_{t-1} + \cdots + \phi_p y_{t-p} + \epsilon_t\]변수가 둘이라면 어떻게 할까요? 소박한 방법은 각각 따로 AR을 돌리는 것입니다. 하지만 그러면 “금리의 과거가 성장률을 예측하는가” 같은 변수 간 상호작용을 통째로 버리게 됩니다.
VAR의 발상은 단순합니다. 각 변수를, 모든 변수의 과거로 회귀한다. 변수가 성장률 $g_t$와 금리 $r_t$ 둘이고 시차가 1이라면:
\[\begin{aligned} g_t &= c_1 + \phi_{11} g_{t-1} + \phi_{12} r_{t-1} + \epsilon_{1,t} \\ r_t &= c_2 + \phi_{21} g_{t-1} + \phi_{22} r_{t-1} + \epsilon_{2,t} \end{aligned}\]첫 식은 “오늘 성장률”을 어제 성장률뿐 아니라 어제 금리로도 설명하고, 둘째 식은 “오늘 금리”를 어제 금리와 어제 성장률로 설명합니다. 두 변수가 서로의 방정식에 들어간다는 것이 핵심입니다.
여기서 모든 변수는 대등하게 내생변수(endogenous)로 취급됩니다. “무엇이 원인이고 무엇이 결과인가”를 미리 정하지 않습니다. Sims(1980)가 VAR을 제안한 동기가 바로 이것이었습니다.1 당시 거시계량경제학은 이론에 근거해 “이 변수는 외생, 저 변수는 내생” 같은 제약을 잔뜩 부과했는데, Sims는 그 제약들이 “믿을 수 없는(incredible)” 가정이라 비판하며 모든 변수를 대칭으로 두고 데이터가 말하게 하자고 주장했습니다.
2. VAR(p)의 수식과 구조
변수 $k$개를 벡터 $\mathbf{y}t = (y{1,t}, \ldots, y_{k,t})^\top$로 묶으면, VAR($p$)는 행렬 형태로 깔끔하게 써집니다.
\[\mathbf{y}_t = \mathbf{c} + A_1 \mathbf{y}_{t-1} + A_2 \mathbf{y}_{t-2} + \cdots + A_p \mathbf{y}_{t-p} + \boldsymbol{\epsilon}_t\]- $\mathbf{c}$: $k \times 1$ 절편 벡터
- $A_i$: $k \times k$ 계수 행렬 — $i$번째 시차의 변수들이 오늘에 미치는 영향
- $\boldsymbol{\epsilon}_t$: $k \times 1$ 오차 벡터, 평균 0에 공분산 $\Sigma$. 시점 간에는 독립이지만 같은 시점의 성분끼리는 상관될 수 있습니다 ($\Sigma$가 대각이 아님).
$A_i$의 비대각 원소가 바로 “변수 사이의 시차 파급”입니다. $A_1$의 $(1,2)$ 원소는 “어제 2번 변수가 오늘 1번 변수에 주는 영향”이죠.
이 유연함에는 대가가 있습니다. 파라미터 수가 빠르게 폭발합니다. VAR($p$)의 계수 개수는
\[\underbrace{k}_{\text{절편}} + \underbrace{p \cdot k^2}_{\text{계수 행렬}}\]예컨대 $k=3$, $p=3$이면 $3 + 3\times 9 = 30$개입니다. 변수가 하나만 늘어도 $k^2$이 커지므로, VAR은 보통 적은 수의 변수(3~6개)로 씁니다. 이 문제를 사전분포로 억제한 것이 베이지안 VAR(BVAR)입니다.
3. 전제조건 — 정상성과 안정성
VAR을 적합하기 전에 두 가지를 확인해야 합니다.
① 정상성. VAR은 각 시계열이 정상(stationary)이라고 가정합니다. 추세가 있는 원계열(GDP 수준, 물가 수준)은 그대로 넣으면 안 되고, 로그차분·차분으로 정상화한 뒤 사용합니다. 만약 변수들이 비정상이면서 장기 균형을 공유한다면(공적분), 차분으로 정보를 버리는 대신 VECM을 써야 하는데 — 그건 다음 글의 주제입니다.
② 안정성(stability). 추정된 VAR이 발산하지 않고 충격이 시간이 지나면 사그라드는 조건입니다. 동반행렬(companion matrix)의 모든 고윳값이 단위원 안(절댓값 < 1)에 있어야 합니다. statsmodels의 is_stable()로 확인할 수 있습니다. 안정적이지 않으면 IRF·예측이 무의미해집니다.
4. Python 실전 ① — 데이터 준비
미국 분기별 거시데이터(statsmodels 내장 macrodata, 1959–2009)로 실제 VAR을 세워봅니다. 세 변수를 고릅니다.
- 실질 GDP 성장률:
realgdp의 로그차분 - 인플레이션:
cpi(소비자물가)의 로그차분 - 3개월 국채금리 변화:
tbilrate의 차분
원계열은 모두 추세를 가진 비정상 시계열이라, 정상화를 거쳐야 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.tsa.api import VAR
from statsmodels.tsa.stattools import adfuller
mdata = sm.datasets.macrodata.load_pandas().data
idx = pd.period_range("1959Q1", periods=len(mdata), freq="Q").to_timestamp()
mdata.index = idx
df = pd.DataFrame(index=mdata.index)
df["gdp_growth"] = np.log(mdata["realgdp"]).diff() * 100 # 성장률(%)
df["inflation"] = np.log(mdata["cpi"]).diff() * 100 # 인플레이션(%)
df["d_tbill"] = mdata["tbilrate"].diff() # 금리 변화(%p)
df = df.dropna()
# 정상성 확인 — 세 변수 모두 p < 0.05 면 정상
for c in df.columns:
stat, p, *_ = adfuller(df[c])
print(f"{c:12s} ADF={stat:7.3f} p={p:.4f}")
1
2
3
gdp_growth ADF= -6.973 p=0.0000
inflation ADF= -3.093 p=0.0271
d_tbill ADF= -6.035 p=0.0000
세 변수 모두 ADF 검정 p-value가 0.05 미만이라 정상성을 만족합니다. 정상화한 시계열은 이렇게 생겼습니다.
세 변수 모두 0을 중심으로 오르내리는 정상 시계열이다. 1980년 전후 오일쇼크·볼커 긴축 구간에서 금리 변화(맨 아래)가 격렬하게 요동치는 것이 눈에 띈다.
5. 차수 선택과 적합
시차 $p$는 정보량 기준(AIC/BIC/HQIC)으로 고릅니다. AIC가 모형 적합도와 복잡도를 함께 저울질한다는 점은 단변량 때와 같습니다.
1
2
3
4
5
6
model = VAR(df)
print(model.select_order(maxlags=8).summary())
res = model.fit(maxlags=8, ic="aic") # AIC 최소 차수로 자동 적합
print("선택된 차수 p =", res.k_ar)
print("안정적인가:", res.is_stable())
1
2
3
4
5
6
7
8
AIC BIC FPE HQIC
0 -1.132 -1.082 0.3224 -1.112
1 -1.822 -1.620 0.1617 -1.740
2 -2.022 -1.669* 0.1323 -1.879
3 -2.127* -1.621 0.1193* -1.922*
...
선택된 차수 p = 3
안정적인가: True
AIC·FPE·HQIC는 $p=3$을, 더 인색한 BIC는 $p=2$를 고릅니다. 여기서는 AIC를 따라 VAR(3)로 진행합니다. 동반행렬 고윳값이 모두 단위원 안에 있어 안정적입니다.
VAR(3)의 계수는 30개라 하나하나 해석하기 어렵습니다. 그래서 VAR은 개별 계수 대신 세 가지 요약 도구로 읽습니다: Granger 인과성, 충격반응함수, 분산분해.
6. Granger 인과성 — 과거가 예측에 도움이 되는가
“$X$가 $Y$를 Granger-cause한다”는 것은, $Y$의 과거만 쓸 때보다 $X$의 과거를 함께 쓸 때 $Y$를 더 잘 예측한다는 뜻입니다. 주의할 점은 이름과 달리 이것이 철학적 의미의 “인과”가 아니라 예측 가능성(predictive causality)이라는 것입니다. $X$가 $Y$에 선행할 뿐, 진짜 원인이라는 보장은 없습니다.
검정은 “$Y$ 방정식에서 $X$의 모든 시차 계수가 0”이라는 귀무가설의 F-검정입니다.
1
2
3
4
5
pairs = [("gdp_growth", "d_tbill"), ("d_tbill", "gdp_growth"),
("gdp_growth", "inflation"), ("inflation", "d_tbill")]
for caused, causing in pairs:
r = res.test_causality(caused, [causing], kind="f")
print(f"{causing:11s} -> {caused:11s} F={r.test_statistic:5.2f} p={r.pvalue:.4f}")
주요 결과를 정리하면:
| 방향 | F | p-value | 판정 |
|---|---|---|---|
| 금리변화 → GDP성장 | 4.38 | 0.005 | 유의 |
| GDP성장 → 금리변화 | 3.62 | 0.013 | 유의 |
| 금리변화 → 인플레이션 | 3.49 | 0.016 | 유의 |
| 인플레이션 → GDP성장 | 2.15 | 0.093 | - |
| GDP성장 → 인플레이션 | 1.32 | 0.268 | - |
| 인플레이션 → 금리변화 | 0.78 | 0.504 | - |
금리와 성장률은 양방향으로 서로를 예측합니다(통화정책 ↔ 경기의 피드백). 금리는 인플레이션도 예측합니다. 반면 이 표본·시차에서 인플레이션이 다른 변수를 앞서 예측하는 관계는 약하게 나타납니다. Granger 인과성은 “누가 누구에 선행하는가”의 지도를 그려주지만, 그 반응이 어떤 모양으로 얼마나 지속되는지는 말해주지 않습니다. 그건 충격반응함수의 몫입니다.
7. 충격반응함수(IRF) — 시스템을 흔들어 보기
충격반응함수(Impulse Response Function)는 VAR 해석의 핵심 도구입니다. “한 변수에 순간적인 충격을 한 번 줬을 때, 시스템의 모든 변수가 이후 몇 분기에 걸쳐 어떻게 반응하는가”를 그립니다.
한 가지 걸림돌이 있습니다. 앞서 오차 $\boldsymbol{\epsilon}_t$의 성분들이 서로 상관되어 있다고 했습니다(공분산 $\Sigma$가 비대각). 실제로 이 데이터의 잔차 상관은 성장률–금리 0.28, 인플레이션–금리 0.33 수준입니다. 그러면 “금리에만 충격을 준다”는 것이 애매해집니다 — 금리 충격은 이미 성장률 충격과 뒤섞여 있으니까요.
이를 풀기 위해 직교화(orthogonalization)를 씁니다. 촐레스키 분해로 오차를 서로 독립인 충격들로 바꾼 뒤, 각 충격을 1 표준편차 크기로 준 반응을 봅니다. 다만 촐레스키는 변수 순서에 의존합니다. 여기서는 [성장률, 인플레이션, 금리] 순서로, “같은 분기 안에서는 성장률→인플레이션→금리 방향으로만 즉각 영향을 준다”는 가정을 깔았습니다. 순서를 바꾸면 IRF도 달라지므로, 순서는 경제 논리로 정당화해야 합니다.
1
2
3
irf = res.irf(20) # 20분기 IRF
irf.plot(orth=True) # 직교화(1 표준편차 충격)
# 격자 그림은 irf.orth_irfs[h, response, impulse] 를 직접 그려도 된다
각 칸은 “열 변수에 1 표준편차 충격 → 행 변수의 반응”. 대각선은 자기 자신에 대한 반응(충격 순간이 가장 크고 감쇠). 안정적인 VAR이라 모든 반응이 결국 0으로 수렴한다.
읽는 법을 하나만 짚어보면 — 맨 아랫줄 가운데(인플레이션 충격 → 금리 반응): 물가가 튀면 다음 몇 분기에 걸쳐 금리가 들썩이며 반응합니다. 통화당국이 물가에 대응하는 모습으로 해석할 수 있습니다. 오른쪽 위(금리 충격 → 성장률 반응)를 보면, 금리를 올린 직후 성장률이 잠깐 반등했다가($h{=}1$에서 $+0.12$) 이내 마이너스로 돌아섭니다($h{=}2$에서 $-0.12$). 긴축의 시차 효과를 시각적으로 확인할 수 있습니다.
주의: IRF의 모양은 촐레스키 순서·차수·표본에 민감합니다. 부호와 크기를 단정하기보다 “충격이 얼마나 오래, 어떤 방향으로 파급되는가”라는 정성적 패턴으로 읽는 편이 안전합니다.
8. 예측오차 분산분해(FEVD) — 불확실성의 출처
IRF가 “한 충격의 파급”을 본다면, 분산분해(Forecast Error Variance Decomposition)는 반대 방향의 질문에 답합니다. “$h$분기 뒤 어떤 변수를 예측할 때, 그 예측오차의 분산을 각 충격이 몇 %씩 설명하는가?”
1
2
3
fevd = res.fevd(20)
fevd.plot()
print(fevd.summary())
각 패널은 한 변수의 예측오차 분산을 세 충격의 기여도(%)로 쌓아 보여준다. 예측 시계가 길어질수록 다른 변수의 기여가 서서히 스며든다.
20분기 시점의 기여도를 보면:
| 예측 대상 | GDP성장 충격 | 인플레이션 충격 | 금리 충격 |
|---|---|---|---|
| GDP성장 | 87.9% | 7.3% | 4.8% |
| 인플레이션 | 9.7% | 83.6% | 6.7% |
| 금리변화 | 11.0% | 9.4% | 79.5% |
세 변수 모두 자기 자신의 충격이 예측오차의 대부분(80~88%)을 설명합니다. 이 표본에서 세 거시변수는 서로 영향을 주고받되, 각자의 고유 동학이 여전히 지배적이라는 뜻입니다. FEVD도 IRF와 마찬가지로 촐레스키 순서에 의존한다는 점은 기억해 둬야 합니다.
9. 예측
VAR은 모든 변수를 동시에 예측합니다. 각 변수의 예측이 다른 변수의 예측된 미래값을 되먹임으로 사용하기 때문에, 단변량 모형 여러 개를 따로 돌리는 것과는 다릅니다.
1
2
3
p = res.k_ar
mid, low, upp = res.forecast_interval(df.values[-p:], steps=12, alpha=0.05)
res.plot_forecast(12)
세 변수의 12분기 예측(점선)과 95% 예측구간(음영). 정상 시계열이라 예측은 빠르게 각 변수의 평균 수준으로 수렴하고, 불확실성 구간은 시계가 길어질수록 벌어진다.
예측값이 금세 평평해지는 것은 실패가 아니라 정상 시계열의 자연스러운 성질입니다. 정상 과정의 최적 장기 예측은 무조건 평균이고, VAR이 담아내는 정보는 주로 단기(수 분기)의 동적 상호작용에 있습니다. 그래서 VAR은 “먼 미래의 점 예측”보다 단기 예측과 IRF·분산분해를 통한 구조 이해에 강점이 있습니다.
10. 한계와 확장
| 한계 | 설명 | 확장 |
|---|---|---|
| 파라미터 폭발 | 변수·차수가 늘면 $pk^2$로 급증, 과적합 위험 | 베이지안 VAR(BVAR) |
| 정상성 요구 | 비정상·공적분 변수는 부적절 | VECM(다음 글) |
| 식별 문제 | IRF·FEVD가 촐레스키 순서에 의존 | 구조적 VAR(SVAR) |
| 선형·상수 계수 | 체제 전환·비선형 미포착 | TVP-VAR, MS-VAR |
특히 정상성 요구가 다음 이야기로 이어집니다. 이번 글에서는 GDP·물가를 차분해 억지로 정상화했지만, 그 과정에서 “장기적으로 함께 움직이는” 관계(예: 소비와 소득의 균형)를 잃어버렸을 수 있습니다. 비정상 변수들이 공유하는 이 장기 균형을 살리면서 단기 동학까지 담는 모형이 공적분과 VECM입니다.
마치며
VAR은 AR을 벡터로 확장한 것뿐이지만, 그 확장이 “변수들이 서로를 예측하는 시스템”이라는 완전히 새로운 관점을 엽니다. 정리하면:
- 각 변수를 모든 변수의 과거로 회귀 — 대칭적 내생변수, 이론 제약 최소화.
- 정상성·안정성을 먼저 확인하고, 차수는 정보량 기준으로 선택.
- 30개 계수를 직접 읽는 대신 Granger 인과성·IRF·FEVD로 시스템을 해석.
- IRF·FEVD는 촐레스키 순서에 의존하므로 순서를 경제 논리로 정당화.
다음 글에서는 여기서 남겨둔 숙제 — 비정상 변수들의 장기 균형을 다루는 공적분과 VECM으로 이어가겠습니다.
참고문헌
- Sims, C. A. (1980). Macroeconomics and Reality. Econometrica, 48(1), 1–48.
- Lütkepohl, H. (2005). New Introduction to Multiple Time Series Analysis. Springer.
- Hamilton, J. D. (1994). Time Series Analysis. Princeton University Press.
AI의 도움을 받아 작성되었으며 최대한 레퍼런스를 밝히려 노력했으나 오류가 있을 수 있으니 정확한 정보를 다시 한번 확인하시기 바랍니다.
Sims, C. A. (1980). Macroeconomics and Reality. Econometrica, 48(1), 1–48. ↩︎