본문 바로가기

Data Diary

2021-04-07(시계열데이터 심화14_공적분 모형)

반응형

*본 내용은 시계열데이터 강의 내용 중 일부분을 요약한 내용입니다

 

 

 

 

공적분 모형(Cointegration Model)

공적분이란

두 비정상성 시계열을 선형조합(Linear Combination)하여 생성한 시계열의 적분(Integration) 차수가 낮아지거나 정상상태가 되는 경우입니다.

 

위 정의가 어떤 의미인가를 생각해 보자

일단 두 비정상성 시계열 데이터가 필요해 보이고 이 둘 사이에서 뭔가 ''공통''인 부분이 있습니다. 결론부터 말씀드리자면 이 공통이어야 하는 것은 방향입니다. 보통 술에 취한 사람과 개로 예를 듭니다.

술 취한 사람은 비틀비틀 걸어 다녀서 어디로 튈지 모릅니다. 가다가 갑자기 넘어질수도 있고 중심을 잃어서 갑자기 왼쪽으로 휙 방향을 틀 수도 있습니다. 만일 술 취한 사람이 두 명이라면 이 두 명은 각자 가는 방향이 다를 것입니다. 여기서 술 취한 사람이 목줄 하고 있는 개가 있다면 얘기가 달라집니다. 개도 자기 페이스대로 이리저리 왔다 갔다 하겠지만 어찌 됐든 술 취한 주인을 따라가게 되어 있습니다. 이때 애완견의 위치를 나타내는 시계열과 취한 사람의 위치를 나타내는

시계열은 공적분이라고 합니다.

 

공적분이 되기위한 조건은 아래와 같습니다

  • 각각의 시계열들이 모두 같은 차분의 수(order of integraion)를 가진다. (조건1)
  • 시계열들의 선형결합으로 만들어진 새로운 시계열은 기존의 시계열들보다 더 낮은 차분의 수를 가져야 한다.(조건 2)

추가적인 설명을 하자면

Y1(술 취한 사람 위치 시계열)과 Y2(애완견 위치 시계열)을 각각 봤을 때 비정상 시계열 데이터입니다. 정상성으로 만들기 위해서 차분이 각각 2씩 필요해야 합니다. (조건 1: 차분의 수가 같아야 한다)

또한 Y1과 Y2를 선형 결합을 했을 때 만들어지는 비정상 시계열을 차분하게 될 때 차분의 수가 2보다 미만이어야 합니다(조건 2: 기존 시계열 차분의 수 보다 작아야 한다)

 

만일 애초에 차분의 수가 하나씩 필요했다면 선형 결합으로 인해 차분의 수가 0이어야 한다. 즉 선형 결합을 하면 정상성 데이터가 된다는 뜻입니다.

 

차분의 수가 각자 1일 경우에 대해서 좀 더 자세히 말씀드리겠습니다

강의 자료

둘 다 비 정상성인 랜덤워크가 있을 때 각자 방정식은 위와 같습니다

이 두 개를 선형 결합한 대문자 Y의 수식 풀이를 보면 결국 잔차만 남게 될 때 이 잔차가 WN(화이트 노이즈)라면 차분이 필요가 없게 되므로 Y1, Y2는 공적분 관계입니다. 

이를 실습으로 확인해 보겠습니다

 

실습: 공적분의 이해

# 데이터 생성
np.random.seed(1)
Y1= np.random.randn(500).cumsum() #차분을 하면 정상성 -> diff, 누적을 하면 비정상성 -> cumsum
Y2= 0.6*Y1 + np.random.randn(500)  #랜덤워크의 60% + 추가적인 랜덤을 추가(np.random.randn(500))  => Y1과 스케일 차이가 발생
Y = 0.6 * Y1 - Y2 #선형결합 (왼쪽 식 계산결과 e만 남는다. 즉 잔차는 WN)

#시각화 
plt.figure(figsize=(10,4))
plt.plot(Y1, 'g', label ='Y1')
plt.plot(Y2, 'b', label ='Y2')
plt.legend()
plt.show()

plt.figure(figsize=(10,4))
plt.plot(Y, label='Y * 0.6*Y1 - Y2')
plt.legend()
plt.show()

#VECM 공적분 확인
coint_result = sm.tsa.coint(Y1,Y2)
pd.DataFrame([coint_result[0], coint_result[1]], index=['statistics', 'p-value'], columns=['output'])

WN 
공적분 결과

  • 공적분 계산 결과: p-value= 0

 

 

실습 2

#데이터 로딩
import pandas_datareader.dataas web
import datetime

start = datetime.datetime(2014 ,1, 1)
end = datetime.datetime(2018, 12, 31)
raw1 = web.DataReader("005930.KS", 'yahoo', start, end)
raw2 = web.DataReader("005935.KS", 'yahoo', start, end)

# 데이터 시각화
## 시계열 움직임
raw = pd.concat([raw1.Closem raw2..Close], axis=1).dropna() #종가 비교
raw.columns = ["SE", "SE_PS"]
raw.plot(figsize=(10,5))
plt.show()

#비교 움직임
plt.figure(figsize=(8,6))
plt.plot(raw.SE, raw.SE_PS, alpha = 0.7)
plt.scatter(raw.SE.values[-1:], raw.SE_PS.values[-1:], c='r', s=300)
plt.show()

#각 비정상성 차수 추론
target = raw.SE.copy()
integ_result = pd.Series(sm.stattools.adfuller(target)[0:4],
					index=['Test Statistics', 'p-value', 'Used Lag', 'Used Observations'])
Y1_integ_order = 0
if integ_result[1] > 0.1:
    Y1_integ_order = Y1_integ_order + 1
    
    
target = raw.SE_PS.copy()
integ_result = pd.Series(sm.tsa.stattools.adfuller(target)[0:4], 
                         index=['Test Statistics', 'p-value', 'Used Lag', 'Used Observations'])
Y2_integ_order = 0
if integ_result[1] > 0.1:
    Y2_integ_order = Y2_integ_order + 1
print('Y1_order: ', Y1_integ_order, 'Y2_order: ', Y2_integ_order)

#회귀분석 적합_모델링
Y=raw.SE
X=raw.SE_Ps
X=sm.add_constant(X)
fit=sm.OLS(Y,X).fit()
display(fit.summary()) #회귀분석을 통해 coint(공적분)를 확인하기 위함

# 회귀분석 시각화
import seaborn as sns
plt.figure(figsize=(10,7))
sns.regplot(x='SE_PS', y='SE', data=raw) #regplot:데이터를 점으로 나타내면서 선형성을 함께 확인한다.
plt.tight_layout()
plt.show()

#공적분 시계열 시각화
y_integ = raw.SE - fit.params[1] 
plt.figure(figsize=(10,7))
Y_integ.plot()
plt.show()

# 공적분 시계열 비정상성 테스트
target = fit.resid 
#회귀분석 잔차결과 정상성으로 판정되었으므로 삼성전자와 삼성전자우량주는 서로 유사하게 움직인다.(공적분이다)
display(pd.Series(sm.tsa.stattools.adfuller(target)[0:4],
                  index=['Test Statistics', 'p-value', 'Used Lag', 'Used Observations']))
                  
# VECM 공적분 테스트
coint_result = sm.tsa.coint(raw.SE, raw.SE_PS)
pd.DataFrame([coint_result[0], coint_result[1], index=['statistics', 'p-value'], columns=['output'])

regplot

이 두 데이터 간에 선형성이 있다는 걸 알 수 있다.(방향이 같다) 따라서 공적분의 존재 가능성을 생각해 볼 수 있습니다.

 

Y_integ plot(공적분 시계열 시각화)

언뜻 보기에는 하향 추세를 보이는 패턴이 보이는 것 같은데 자세한 것은 아래 통계를 통해 판별해 보겠습니다.

 

회귀분석의 잔차를 정상성 테스트를 한 결과입니다. p-value가 0이므로 정상성임을 알 수 있습니다.

따라서 잔차가 차분이 필요 없는 WN이므로 회귀분석을 통해 공적분이라는 사실을 알수 있습니다.

 

VECM 공적분 테스트 결과 5% 미만이므로 공적분입니다.

 

 

 

공적분을 공부하다 보니까 강아지와 술 취한 사람을 예로는 부족한 것 같아서 제가 이해하기 편하게끔 생각해 봤습니다

주로 팀 게임을 할 때 구성원 간의 실력이 다 다릅니다. 분명히 못하는 사람은 여기저기서 패작을 할 테고 에이스들은 캐리를 할 것입니다. 그리고 실력은 달라도 승리를 한다 라는 방향은 같습니다. 이때 못하는 사람과 에이 스은 서로 공적분 관계입니다. 

하지만 악의적으로 패작을 하는 못된 사람들이 있습니다. 이 사람들은 팀이 패배하는 게 목적이므로 에이스와 패작하는 사람의 방향은 다르므로 서로 공적분이 아닙니다.

위 예시가 말이 되는지 모르겠지만 저는 이렇게 생각하니까 좀 더 확 와 닿았습니다.

반응형