VAR·VECM과 공적분으로 다변량 시계열 해석하기

VAR, VECM, 공적분의 선택 기준과 Johansen 검정, 충격반응함수 해석, 운영 검증 절차를 다변량 시계열 관점에서 정리한다.

2026-08-14 · 최초 발행 2024-04-29

상호작용하는 시계열은 장기 관계까지 확인해야 한다

거시경제, 금융, 수요 예측처럼 여러 시계열이 맞물린 문제에서는 각 변수의 과거만 보는 방식으로는 부족하다. 변수 간 단기 반응과 장기 균형을 함께 다뤄야 하며, 이때 VAR(Vector Autoregression), VECM(Vector Error Correction Model), 공적분(Cointegration)이 선택 기준을 제공한다.

VAR은 각 변수의 현재값을 모든 변수의 과거값 선형결합으로 나타내는 다변량 자기회귀 모형이다. 대체로 정상성(I(0))을 전제로 수준(level) 변수에서 단기 동학을 추정한다.

공적분은 개별 변수는 비정상 I(1)이지만 특정 선형결합은 정상성을 보이는 장기 균형 관계를 뜻한다. 공적분 랭크 r이 0보다 크다면 장기 관계를 포함하는 모형화가 필요하다.

VECM은 VAR을 차분과 오류수정항으로 다시 표현한 모형이다. 비정상 I(1) 변수에 공적분 관계(r>0)가 있을 때 사용하며, 장기 균형을 나타내는 β와 균형으로 돌아가는 조정 속도 α를 함께 추정한다.

진단부터 운영까지 이어지는 모형 선택

데이터를 맞추기 전에 정상성 및 적분 차수를 판정한다. ADF, KPSS, PP 같은 검정을 함께 적용하고 구조변화 반영 여부도 점검한다. 모든 변수는 동일 빈도와 동일 샘플 구간으로 정렬해야 하며, 결측값 보간 규칙과 이상치 탐지·완화 절차도 명시해야 한다.

지연차수 p는 AIC, BIC, HQIC 최소화 결과를 참고하되 Ljung-Box 잔차 독립성과 고유값의 단위원 내 위치도 확인한다. 상수, 추세, 계절 더미 같은 결정적 성분은 공적분 랭크 추정에 영향을 주므로 일관된 설정 규칙이 필요하다.

방향성은 그랜저 인과성 검정으로 예측력 관점에서 확인할 수 있다. 충격반응함수(IRF)와 예측오차분산분해(FEVD)는 충격이 시간에 따라 남기는 경로와 변수별 기여도를 보여 준다. 충격 식별에는 Cholesky 또는 Generalized 방식을 선택한다.

공적분 랭크는 Johansen 검정의 trace와 max-eig 통계량으로 추정한다. 이 과정에서 β(장기계수)와 α(조정속도)를 함께 추정한다. 오류수정항 ECT는 β′y_{t-1}이며, 장기 균형에서 벗어난 정도를 α를 통해 단기에 조정하는 구조다.

VAR은 방정식별 OLS로 추정하고, VECM은 Johansen ML 추정을 사용한다. 추정 뒤에는 잔차 정규성·이분산성·자기상관, 안정성, out-of-sample 성능을 롤링 또는 확장 윈도우로 검토한다. 운영 단계에서는 재귀적 재추정 스케줄을 두고, 체 regime 변화에 대비한 재식별 규칙과 변수 셋·p의 주기적 점검을 이어간다.

거시·금융·수요 문제에서의 해석 방식

거시경제 분석에서는 GDP, 물가, 금리, 환율을 함께 두고 정책 충격의 IRF와 FEVD 기여도를 평가할 수 있다. 금리 50bp 충격이 성장과 물가 경로에 미치는 영향도 시나리오로 추정한다.

금융 포트폴리오나 스프레드 트레이딩에서는 페어 또는 바스켓에 공적분 검정을 적용해 평균회귀 스프레드를 구성한다. 헤지비율은 β로 산출하며, ECT 임계치를 기준으로 진입·청산 규칙을 두고 잔차 정상성이 유지되는지 관찰한다.

전력 수요·온도·가격처럼 연동된 예측 문제에는 다변량 모형으로 상호작용을 반영할 수 있다. VECM은 장기 가격-수요 균형을 유지하는 구조와 단기 수급 쇼크의 조정 속도를 함께 추정한다.

다변량 정보를 통합하면 단변량 대비 예측오차(MAPE/RMSE)를 5~20% 개선할 수 있으며, 이는 도메인과 데이터 품질에 의존한다. IRF와 FEVD를 이용하면 정책·충격 해석 정확도와 예측구간(PI) 적중률도 개선할 수 있다. 장단기 분해는 경로 의존적 정책 효과의 설명력을 높이고, 공적분 기반 헤지는 전략의 견고성과 리스크 관리 체계화에 기여한다.

VAR과 VECM이 갈리는 지점

항목 VAR VECM
성능 정상성(I(0)) 변수에 적합, 단기 예측력 우수 I(1)·공적분 존재 시 우수, 장단기 동시 설명
확장성 변수·지연 증가 시 매개변수 급증, 정규화 필요 동일 문제 존재, β·α 추정으로 계산 복잡도 증가
일관성 수준 VAR의 추세오염 가능성 공적분 제약으로 장기 관계 반영, 추정 일관성 제고
안정성 고유값 안정성 검사 필수 공적분 랭크·결정적 성분 설정 민감
운영 편의 구현 용이, 해석 직관 설정 의존성 높음, 운영 규칙 수립 필요

데이터 상태에 따라 이어지는 분석 경로

모두 I(0)I(1) 포함rank r=0rank r 0안정불안정결측 과다잔차 자기상관이분산/비정규성능 저하데이터 수집/정렬결측/이상치 처리적분 차수 판정 ADF/KPSSVAR 후보공적분 검정 Johansen차분 VARVECM(α,β) 추정라그 p 선택 AIC/BIC추정 안정성 체크(고유값)검증: 잔차 진단, IRF/FEVD모형 재식별(p/결정적 성분조정)롤링 예측/백테스트운영 배포 모니터링데이터 품질 개선/대체 데이터라그 증가/변수 변환강건추정/부트스트랩변수 셋/랭크 재평가,regime 점검

설정 민감도를 다루는 방법

변수와 차수가 늘어나면 매개변수는 p·k^2로 빠르게 증가한다. LASSO/리짓이나 베이지안 VAR(SV priors)로 축소를 적용할 수 있으며, 변수 선택은 경제·도메인 이론과 정보기준을 함께 고려한다.

Cholesky 식별은 변수 순서에 민감하다. Generalized IRF로 순서 민감도를 완화하거나 표식 변수·기저 제약(SVAR)을 적용할 수 있다.

공적분 랭크는 상수와 추세를 포함하는 방식에 크게 좌우된다. 여러 사양을 교차 검증하고 경제적 타당성도 검정해야 한다. 안정성이 무너지면 구간별 추정, 롤링·재귀 추정, 체 regime 전환(TVP-VAR)을 고려하고 Quandt-Andrews, Bai-Perron 브레이크 검정으로 레짐 전환을 탐지한다.

Python으로 VAR과 VECM 추정하기

전제조건은 다음과 같다.

  • Python 3.10+, pandas 2.x, statsmodels 0.14+, numpy
  • 동일 빈도, 동시 관측, 결측 처리 완료

설치:

pip install pandas numpy statsmodels matplotlib

정상성 점검, 라그 선택, 예측과 IRF는 다음처럼 수행할 수 있다.

import pandas as pd
from statsmodels.tsa.api import VAR
from statsmodels.tsa.stattools import adfuller

# 예시 데이터: y1, y2, y3 컬럼
df = pd.read_csv("multivariate.csv", parse_dates=["date"], index_col="date").asfreq("M").ffill()

# 정상성 점검(간단 예)
for c in df.columns:
    pval = adfuller(df[c].dropna(), autolag="AIC")[1]
    print(c, "ADF p-value:", round(pval, 4))

# 라그 선택
model = VAR(df)
sel = model.select_order(maxlags=12)
p = sel.selected_orders["aic"]
res = model.fit(p)
print("Selected lag(p):", p)

# 예측 및 IRF
forecast = res.forecast(df.values[-p:], steps=12)
irf = res.irf(12)
irf.plot(orth=True)  # Cholesky 기반

I(1) 변수라고 가정한 데이터에서는 Johansen 검정으로 랭크를 고른 뒤 VECM을 적합한다.

import numpy as np
from statsmodels.tsa.vector_ar.vecm import coint_johansen, VECM

# I(1) 가정 하 공적분 검정
jres = coint_johansen(df, det_order=0, k_ar_diff=2)  # det_order: 결정적 성분, k_ar_diff: 차분 라그
trace_stats = jres.lr1
crit_vals = jres.cvt  # 90/95/99%
print("Trace stats:", trace_stats)
print("Critical(95%):", crit_vals[:,1])

# 랭크 선택(보수적 선택)
rank = int(np.sum(trace_stats > crit_vals[:,1]))
print("Cointegration rank:", rank)

# VECM 추정
vecm = VECM(df, k_ar_diff=2, coint_rank=rank, deterministic="n")  # 필요시 "ci", "lt" 등 조정
vres = vecm.fit()
print("Alpha (조정속도):\n", vres.alpha)
print("Beta (장기계수):\n", vres.beta)

# 예측
fcast = vres.predict(steps=12)
# 충격·해석: VECM을 VAR 수준 표현으로 변환 가능

운영 환경에서는 분기·월간 데이터의 모형을 최소 연 1회 재검토한다. 롤링 윈도우 sMAPE/RMSE, IRF 안정성, 잔차 진단을 대시보드로 관리하고, 변수 추가·삭제, p 변경, 결정적 성분 변경은 릴리즈 노트에 남긴다.

장기 균형을 모형에 반영할 때

비정상 변수 사이에 장기 균형이 존재하면 VECM이 적합하며, 그렇지 않으면 VAR 또는 차분 VAR을 적용한다. 공적분 랭크, 결정적 성분, 라그 선택은 예측 성능뿐 아니라 해석의 방향도 좌우한다. IRF, FEVD, 그랜저 인과성, ECT를 함께 읽어야 정책과 전략 의사결정에서 설명력과 일관성을 확보할 수 있다.

시계열 분석VARVECM공적분계량경제