2025. 5. 5. 20:14ㆍ계량경제학
벡터오차수정모형은 지난번에 다루었던 오차수정모형(https://direction-f.tistory.com/126)에서 확장여 다변량 시계열 데이터를 동시에 고려하여 장기 균형 관계와 단기 관계를 분석하는 모형입니다.
VECM도 ECM과 마찬가지로 공적분관계가 있는 변수들에 대해서 동적 관계를 분석하게 됩니다.
VECM의 수식은 아래와 같습니다.
여기서 Π가 VECM의 핵심적인 부분입니다. Π는 α와 β로 분해될수 있습니다.
여기서 α (n × r) 는 조정 계수 행렬로 각 변수의 장기 균형으로의 조정 속도를 나타냅니다. 음수 값이 일반적이며, 절대값이 클수록 조정 속도가 빠릅니다.(n은 변수의 수, r은 공적분 관계의 수)
β (n × r) 는 공적분 벡터 행렬로 장기균형을 나타냅니다.(Cointegraion 계수)
예를 들어 계수를 설명하면 아래와 같습니다.
예를 들어, 3개 변수(X1, X2, X3)와 2개의 공적분 관계가 있는 경우:
α = [α₁₁ α₁₂]
[α₂₁ α₂₂]
[α₃₁ α₃₂]
β = [β₁₁ β₁₂]
[β₂₁ β₂₂]
[β₃₁ β₃₂]
이때:
- α₁₁, α₂₁, α₃₁: 첫 번째 공적분 관계에 대한 각 변수의 조정 속도
- α₁₂, α₂₂, α₃₂: 두 번째 공적분 관계에 대한 각 변수의 조정 속도
- β₁₁, β₂₁, β₃₁: 첫 번째 공적분 관계의 계수
- β₁₂, β₂₂, β₃₂: 두 번째 공적분 관계의 계수
이제 VECM을 한번 실습해보겠습니다. 예시데이터를 생성해봅니다.
import numpy as np
import pandas as pd
from statsmodels.tsa.vector_ar.vecm import VECM, select_order
from statsmodels.tsa.stattools import adfuller
import matplotlib.pyplot as plt
# 예시 데이터 생성 (3개의 비정상 시계열)
np.random.seed(42)
n = 100
X1 = np.cumsum(np.random.normal(0, 1, n)) # 랜덤워크
X2 = 2*X1 + np.random.normal(0, 0.5, n) # X1과 공적분 관계
X3 = -X1 + np.random.normal(0, 0.3, n) # X1과 공적분 관계
# 데이터프레임 생성
dates = pd.date_range(start='2020-01-01', periods=n, freq='M')
df = pd.DataFrame({'X1': X1, 'X2': X2, 'X3': X3}, index=dates)
그다음 공적분 테스트를 수행합니다. 공적분 테스트 결과 2개의 공적분 관계가 있음이 나타납니다.
# 2. Johansen 공적분 검정
# 공적분 관계의 수 결정
coint_rank = select_coint_rank(df, det_order=0, k_ar_diff=2)
print("\nJohansen 공적분 검정 결과:")
print(coint_rank.summary())
"""
Johansen 공적분 검정 결과:
Johansen cointegration test using trace test statistic with 5% significance level
=====================================
r_0 r_1 test statistic critical value
-------------------------------------
0 3 65.07 29.80
1 3 30.42 15.49
2 3 2.002 3.841
"""
test statistic이 critical value보다 크면 관계가 있음을 채택합니다. r_0을 예시로보면 H0(귀무가설)은 공적분 관계가 0개 인것입니다. test statistic이 critical value보다 크기 때문에 공적분관계가 최소 하나는 있음을 나타냅니다.
그 다음 VECM을 적합해보겠습니다. k_ar_diff파라미터는 차수를 나타냅니다. VECM을 할때 시차 적용도 중요한 요소지만 여기서는 임의로 시차를 2로 하고 VECM을 적합하겠습니다.
# VECM 모델 적합
model = VECM(df, k_ar_diff=2, coint_rank=2, deterministic='co')
vecm_results = model.fit()
# 결과 출력
print("\nVECM 모델 결과:")
print(vecm_results.summary())
"""
VECM 모델 결과:
Det. terms outside the coint. relation & lagged endog. parameters for equation X1
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
const -0.0970 0.109 -0.888 0.375 -0.311 0.117
L1.X1 0.5935 0.708 0.838 0.402 -0.794 1.981
L1.X2 -0.2249 0.297 -0.757 0.449 -0.807 0.357
L1.X3 0.1800 0.460 0.391 0.696 -0.722 1.082
L2.X1 0.6123 0.492 1.244 0.214 -0.352 1.577
L2.X2 -0.2366 0.195 -1.213 0.225 -0.619 0.146
L2.X3 0.1755 0.294 0.598 0.550 -0.400 0.751
Det. terms outside the coint. relation & lagged endog. parameters for equation X2
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
const -0.0915 0.218 -0.421 0.674 -0.518 0.335
L1.X1 1.3164 1.411 0.933 0.351 -1.449 4.082
L1.X2 -0.3875 0.592 -0.655 0.513 -1.548 0.773
L1.X3 0.6239 0.917 0.680 0.496 -1.173 2.421
L2.X1 1.3180 0.981 1.343 0.179 -0.605 3.241
L2.X2 -0.4881 0.389 -1.256 0.209 -1.250 0.273
L2.X3 0.3567 0.585 0.610 0.542 -0.790 1.504
Det. terms outside the coint. relation & lagged endog. parameters for equation X3
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
const 0.2062 0.108 1.908 0.056 -0.006 0.418
L1.X1 -0.3943 0.701 -0.563 0.574 -1.768 0.979
L1.X2 0.1403 0.294 0.477 0.633 -0.436 0.716
L1.X3 -0.1397 0.455 -0.307 0.759 -1.032 0.753
L2.X1 -0.5933 0.487 -1.218 0.223 -1.548 0.361
L2.X2 0.2247 0.193 1.164 0.244 -0.154 0.603
L2.X3 -0.2056 0.291 -0.708 0.479 -0.775 0.364
Loading coefficients (alpha) for equation X1
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
ec1 -0.1833 0.870 -0.211 0.833 -1.888 1.522
ec2 -0.0386 0.383 -0.101 0.920 -0.790 0.712
Loading coefficients (alpha) for equation X2
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
ec1 1.5778 1.734 0.910 0.363 -1.820 4.976
ec2 -1.2765 0.764 -1.672 0.095 -2.773 0.220
Loading coefficients (alpha) for equation X3
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
ec1 -1.0205 0.861 -1.185 0.236 -2.708 0.667
ec2 0.0505 0.379 0.133 0.894 -0.693 0.794
Cointegration relations for loading-coefficients-column 1
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
beta.1 1.0000 0 0 0.000 1.000 1.000
beta.2 1.851e-17 0 0 0.000 1.85e-17 1.85e-17
beta.3 1.0119 0.006 170.264 0.000 1.000 1.024
Cointegration relations for loading-coefficients-column 2
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
beta.1 -1.119e-16 0 0 0.000 -1.12e-16 -1.12e-16
beta.2 1.0000 0 0 0.000 1.000 1.000
beta.3 2.0272 0.013 160.888 0.000 2.003 2.052
==============================================================================
"""
결과가 길게 나오는데 이는 변수 하나당 관계를 모두 나타냈기 때문입니다. ec항을 보면 p-value가 사실상 모두 유의하게 나오지 않았지만 X1 변수에 대한 ec1을 해석해보자면, 장기균형에서 편차가 발생했을 때 -0.1833만큼 수정이 된다는 것으로 ec2보다 ec1의 편차에 대해 더 민감하게 반응함을 나타냅니다.
'계량경제학' 카테고리의 다른 글
오차수정모형(Error Correction Model, ECM) (0) | 2025.05.02 |
---|---|
공적분(Cointegration) (2) | 2025.04.30 |
Granger Causality(그레인저 인과관계) (1) | 2025.04.28 |
VAR(Vector Autoregressive Models) (1) | 2024.06.17 |
시계열(Time series) > Break (0) | 2021.01.05 |