Learning Hub · 개념 배움터

단위근부터 베이지언 VARX까지 — 개념 배움터

이 배움터는 우리가 푸는 문제(69개 산업 시나리오 전망)의 다운사이즈 버전입니다. 3개 신산업(반도체·이차전지·신재생)만으로, 핵심 개념을 그림과 짧은 코드로 하나씩 익힙니다. 아래 미니 실습팩을 내려받아 python learn.py로 직접 확인할 수 있습니다.

미니 실습팩 (데이터 + 프로그램)
mini_va.csv · mini_exog.csv · learn.py — 단위근·공적분·VAR·VARX·미네소타·MH를 numpy+pandas만으로. CSV는 UTF-8(BOM).
⬇ learn-lab.zip
시계열 기초
단위근 · Unit Root

계속 떠도는 계열 vs 제자리로 돌아오는 계열

직관: φ=1이면 충격이 영원히 남아 값이 표류한다(단위근·비정상). φ<1이면 평균으로 되돌아온다(정상).

AR(1): yt = φ·yt-1 + et. 식을 말로 풀면, 이번 분기 값(yt)은 지난 분기 값(yt-1)에 계수 φ를 곱한 만큼 이어받고, 거기에 미리 예측하지 못한 새 충격(et)이 더해진 것이다. 즉 φ는 "어제를 얼마나 물려받는가", et는 "이번에 새로 튀는 부분"을 뜻한다. 산업 실질부가가치의 로그 수준은 대개 단위근(계속 성장·표류)이라, 우리는 로그 차분(성장률)으로 모형을 세운다. 차분하면 정상이 되기 때문이다. 아래 슬라이더로 φ를 바꿔 보라.

def adf_t(y, p=4):        # Δy_t = a + ρ·y_{t-1} + ΣγΔy_{t-i} + e
    # ρ의 t-통계량이 -2.9보다 더 음수면 "정상"(단위근 아님)
    ...
adf_t(logVA)         # 수준: 0에 가까움  → 단위근(비정상)
adf_t(logVA.diff())  # 차분: 크게 음수    → 정상
공적분 · Cointegration

둘 다 떠돌지만, 나란히 떠돈다면?

직관: 각각은 비정상인데 둘의 차이(잔차)가 정상이면, 장기적으로 붙어 다닌다 = 공적분.

산업 부가가치와 총량GDP가 장기균형을 이루면, 그 이탈(오차수정항 ECT)이 다음 기 성장을 되돌린다. 이것이 VECM의 근거다.

산업GDP둘의 간격(ECT)이 일정 → 공적분
# Engle–Granger 2단계
resid = logVA_i - (b0 + b1*logGDP)
adf_t(resid)   # 정상이면 공적분 → ECT 사용(VECM)
ECT

오차수정항

직관: 장기균형에서 벗어난 만큼, 다음 기에 되돌아온다.

ECTt-1 = logVAi,t-1 − logGDPt-1. VECM은 성장식에 이 항을 넣어 "장기균형으로의 복귀"를 반영한다. 우리 검정에서는 차분·VARX가 더 안정적이었지만, 공적분이 강한 경우 VECM이 유용하다.

Δy_t = c + A·Δy_{t-1} + γ·ECT_{t-1} + e_t
#            γ<0 : 균형 이탈을 되돌림
다변량 모형
VAR

서로의 과거로 서로를 설명

직관: 반도체·이차전지·신재생이 서로의 지난 분기에 영향을 준다.

각 산업 성장을 모든 산업의 과거 성장으로 회귀한다(자기+교차). 산업 간 파급을 담지만, 계수가 많아 과적합에 약하다 → 사전분포로 수축한다.

반도체이차전지신재생
Yt = c + A1·Y_{t-1} + ... + e_t   # Y=[반도체,이차전지,신재생] 성장
VARX

바깥 조건(외생)을 함께

직관: 유가·세계수요·실질금리·실질환율·고용·우리경기 같은 바깥 조건을 함께 넣어야 시나리오 전망을 할 수 있다.

내생변수(내부 조건)는 모형이 함께 예측하는 대상, 곧 62·69개 산업의 실질부가가치(성장률) 그 자체이다. 이들이 서로의 과거로 서로를 설명한다. 여기에 외생변수 X(바깥 조건)를 더한 것이 VARX이다. BOKDPM이 만든 S1~S5 외생경로를 넣으면 산업별 시나리오 전망이 나온다. 외생이 없는 순수 VAR로는 시나리오 조건화가 불가능하다 — 그래서 우리는 VARX를 채택했다.

Yt = c + A·Y_{t-1} + B·X_t + e_t   # X=외생 6종(유가·세계수요·실질금리·실질환율·고용·우리경기)
VECM

차분 + 균형 복귀

직관: 성장(차분)을 모형화하되, 장기균형 이탈(ECT)도 되돌린다.

공적분이 있으면 차분만으로는 장기정보를 버리게 된다. VECM은 ECT를 넣어 이를 살린다. 외생을 더하면 VECMX. 우리 12옵션 격자에 함께 넣어 비교했다.

ΔYt = c + Γ·ΔY_{t-1} + α·(β'·Y_{t-1}) + e_t
12옵션 격자

무엇을 고를까 — 실측으로 비교

직관: 3×2×2 = 12개 조합을 train/valid/test로 실제 견줘 고른다.

(차분/수준/VECM) × (미네소타/산업연관표) × (VARX/VAR). 세 산업단위 모두 차분·산업연관표·VARX가 valid에서 가장 안정적이었다.

for 명세 in [차분,수준,VECM]:
  for 사전 in [minnesota,io]:
    for 외생 in [varx,var]:
       RMSE(train, valid, test)
수축 사전분포 (과적합을 막는 규제)
미네소타 사전 · Minnesota

자기 시차는 살리고, 교차·먼 시차는 0으로

직관: "각 산업은 대체로 자기 자신의 어제를 닮는다"는 믿음을 사전으로 넣는다.

계수 사전분산을 자기 1차 시차는 크게, 교차·먼 시차는 작게(→0으로 수축) 둔다. 데이터가 강하게 말하면 그 방향으로, 아니면 0 근처에 머문다. 릿지 회귀와 통한다.

아래 그림 읽는 법: 세 칸은 계수의 종류다. 색이 진할수록 그 계수를 데이터가 자유롭게 정하도록 느슨하게 두고, 옅을수록 0에 가깝게 눌러(수축) 과적합을 막는다. 즉 자기1차(자기 자신의 바로 지난 분기)는 살리고, 교차(다른 산업의 영향)와 먼시차(먼 과거)는 강하게 눌러 0으로 보낸다.

자기1차(느슨)교차(수축)먼시차(강수축)진할수록자유롭게 추정
V(자기1차)=λ²/l²           # 느슨
V(교차)   =(λ²/l²)(σi²/σj²) # 더 수축  (l=시차, λ=전체수축)
산업연관표 사전 · IO Prior

연관이 강한 산업끼리만 느슨하게

직관: 산업연관표에서 실제로 서로 많이 주고받는 산업쌍의 교차계수만 살린다.

미네소타는 모든 교차를 똑같이 수축한다. IO 사전은 생산유발계수(레온티에프 역행렬)로 연관 강도를 재서, 강하면 느슨·약하면 0으로 차등 수축한다. 반도체↔전자, 이차전지↔전기장비처럼 실제 연결을 반영한다.

V(교차) *= (연관강도_ij + 0.05)   # 강한 쌍만 느슨, 약하면 0
베이지언 추론
베이지언 · Bayesian

사전 × 우도 = 사후

직관: 미리 아는 믿음(사전)을 데이터(우도)로 갱신해 결론(사후)을 얻는다.

모수 θ에 대해 사후 ∝ 우도 × 사전. 데이터가 많고 강하면 사후는 데이터 쪽으로, 적으면 사전 쪽으로 기운다. 미네소타·IO 사전이 바로 이 "사전 믿음"이고, VARX 계수의 추정값은 그 사전 믿음을 데이터로 갱신하여 얻은 사후 분포이다.

사전우도(데이터)사후
posterior(θ) ∝ likelihood(data | θ) × prior(θ)
MCMC

사후를 직접 못 풀 때, 표본으로

직관: 사후분포를 수식으로 못 구하면, 그 분포에서 표본을 뽑아 평균·구간을 근사한다.

마르코프 연쇄(직전 값에만 의존)를 사후분포가 정상분포가 되도록 설계해 오래 돌리면, 그 표본이 사후분포를 대표한다. 표본평균 ≈ 사후평균.

chain=[]; θ=시작값
for i in range(N):
    θ = 다음_표본(θ)      # 사후를 정상분포로 갖는 전이
    chain.append(θ)
posterior_mean ≈ mean(chain[burnin:])
메트로폴리스–헤이스팅스 · MH

제안하고, 좋으면 받고 나쁘면 가끔 받기

직관: 후보를 하나 제안해, 사후가 커지면 받아들이고 작아지면 확률적으로만 받아들인다.

수용확률 min(1, 사후(후보)/사후(현재)). 이 간단한 규칙만으로 표본이 사후분포로 수렴한다. 아래에서 반도체 성장률 평균 μ의 사후를 MH로 추정해 보라 — 해석적 값과 일치한다.

MH 사후평균 μ ≈ – · 해석적 ≈ –
cand = θ + 정규난수(0, step)
if log(rand()) < logpost(cand) - logpost(θ):
    θ = cand            # 수용 (아니면 현재값 유지)
자주 묻는 질문 (검토 의견 반영)
모형 선택

제일 잘 맞힌 모형을 왜 안 썼나?

예전 설명에는 1등이 아닌 4등을 골랐다고 되어 있었으나, 12옵션을 다시 추정한 현재는 채택 모형(VARX·로그차분·산업연관표 프라이어)이 검증 RMSE 1위이다. 즉 정확도를 희생하지 않고 시나리오 기능을 확보했다. 시험구간에서 외생 없는 VAR이 근소하게 앞서는 경우조차 차이는 RMSE 0.02 안팎이며, 그 VAR로는 시나리오 조건화가 불가능하다.

시나리오 해석

다섯 갈래의 폭 = 확률인가?

아니다. S1~S5는 확률분포가 아니라 "이런 일이 벌어지면"이라는 조건부 가정이다. 따라서 다섯 갈래의 넓이를 보고 "미래가 이 안에 있을 확률 몇 %"라고 말할 수 없다. 확률의 구간이 아니라 가능한 몇 가지 그림으로 읽어야 한다.

단기 → 장기

1분기 잘 맞힌 걸로 10년을 믿나?

모형 선택은 바로 다음 분기 예측오차로 했지만, 내놓는 것은 10년 경로다. 단기 적합이 장기를 보장하지는 않으므로, 장기의 신뢰는 세 가지로 보강한다 — (1) 외생 시나리오의 타당성(거시엔진 BOKDPM), (2) 총량 정합(탑다운 조정으로 전체 성장을 타당한 수준에 고정), (3) 산업연관 구조(산업 간 관계 사전).

정합성

산업들 다 더하면 나라 전체랑 맞나?

과거 데이터에서는 구축 단계에서 산업 합 = 총계가 정확히 성립한다. 미래 예측에서는 산업을 따로 예측해 더하면 총계와 어긋날 수 있어, 탑다운 비례배분으로 산업 구성비는 유지하되 합이 총량 전망과 정확히 맞도록 조정한다. 36·62·69도 같은 총계로 환원되도록 구축한다.

신산업

과거 없는 신산업은 어떻게 했나?

반도체·이차전지·신재생은 과거 기록이 짧거나 없어, 부모 산업(전자부품·전기장비·전기·가스)에서 관측 가능한 실측 시변 비중(KOSIS 산업통계·전력 발전비중)으로 분리한다. 따라서 이들의 10년 전망은 임의로 채운 가정이 아니라, 실측 비중 × 모형이 예측한 부모 산업 경로로 만들어진다.

이 배움터의 모든 예제는 learn-lab.zip의 learn.py로 재현됩니다(numpy·pandas만 필요). · 더 나아가기: VAR·VARX 모형 · 논문 3(69산업) · 시나리오 대시보드