시계열 분석 - 공적분 분석이란? with Python (Time series analysis cointegration with Python)
포스팅 개요
이번 포스팅은 시계열 데이터 분석(Time series data)에서 활용되는 공적분 분석(cointegration analysis)에 대해서 정리하는 포스팅입니다. 간단한 이론적 설명과 더불어 파이썬(Python)에서 이를 어떻게 활용할 수 있는지 예시로 알아봅니다.
본 포스팅 작성 시 참고 했던 자료들은 아래와 같습니다.
- https://datascienceschool.net/view-notebook/d5478c5ed2044cb9b88fa2ef015eb3a4/
- https://www.statsmodels.org/stable/generated/statsmodels.tsa.stattools.coint.html
- https://namu.wiki/w/%EA%B3%B5%EC%A0%81%EB%B6%84
또한, 본문에서 사용한 코드는 아래 github에 올려두었습니다.
포스팅 본문
공적분(cointegration)이란?
먼저 공적분에 대해서 간략하게 알아봅니다. 공적분이란 무엇일까요? 영어로는 cointegration으로 불리웁니다. co라는 단어에서 볼 수 있듯이 뭔가 '공통적'인 것이 있겠죠? 공적분을 요약하면 아래와 같습니다
- 두 시계열 사이에 공적분 관계가 있다는 것은, 단기적으로 다를 수도 있지만 장기적으로 보았을 때는 서로 일정한 관계가 있다는 것을 의미한다.
- 쉬운 예시로는 술취한 사람이 반려견을 끈에 묶어서 돌아다니는 것과 같이 사람과 반려견은 아무런 관계없이 서로 움직이지만, 서로 멀어지지 않고 결국엔 집으로 가는 것과 비슷하다.
즉, 두 시계열 (Time series) 데이터에서 어떤 관계가 있다는 것을 통계적 지표로 보여주는 것이 공적분이라고 이해할 수 있습니다.
파이썬에서 활용해보는 공적분 - Cointegration with Python
그럼 어떤 시계열 데이터를 이용해서 파이썬으로 한 번 예시를 들어보겠습니다.
Python에서는 statsmodels 라이브러리를 통해 cointegration을 지원해주고 있습니다. 단, 여기서의 coint는 Engle-Granger 이론을 기반으로 되어 있습니다. Engle-Granger이론의 특성은 아래와 같습니다.
- 두 시계열 xt, yt가 공적분 이라고 가정했을 때 yt를 종속변수, xt를 독립변수로 회귀 분석을 하여 만들어지는 잔차 zt에 대해서 다음과 같은 식이 성립한다. 이러한 식을 ECM 식이라고 한다.
- 여기서 et는 회귀 분석으로 만들어진 ECM 형식의 잔차이다.
- 여기서 zt(yt와 xt를 회귀 분석한 결과)와 et(회귀 분석으로 ECM 형식의 잔차)가 정상 시계열이면 두 시계열이 공적분인지 알 수 있다.
- 해당 공적분에서 귀무가설과 대립가설은 아래와 같다.
- 귀무가설 : 공적분 관계가 존재하지 않는다.
- 대립가설 : 공적분 관계가 존재한다.
- 즉, p-value를 5%라고 지정했을 때 p-value 값이 0.05 이하이면, 귀무가설을 기각할 수 있기 때문에 대립가설이 채택이 되고 그 말은 공적분 관계가 존재한다라고 말할 수 있다.
위 내용을 가지고 아래와 같은 데이터를 활용해서 파이썬 코드 상에서 공적분을 분석해 보겠습니다.
- 가설 : 코로나가 터진 이후 최근 3개월, 애플과 페이스북의 주가 추이는 비슷할 것이다.
- 귀무가설 : 애플과 페이스북의 주가 추이 시계열 데이터는 서로 공적분 관계가 아니다.
- 대립가설 : 애플과 페이스북의 주가 추이 시계열 데이터는 서로 공적분 관계이다. (장기적으로 보았을 때 서로 어떤 관계성이 있다)
최근 3개월 facebook과 apple의 주가 추이를 서로 비교해서 공적분 관계를 비교해보겠습니다. 해당 데이터는 야후 파이낸스에서 받았습니다.
먼저, 데이터를 Python 코드 상에서 load한 뒤 장 마감 때의 가격 close를 기준으로 필요 데이터를 뽑아내겠습니다.
원래는 Open, High, Low 등의 데이터가 있지만 저는 Close를 기준으로 하겠습니다. (저는 주식을 잘 몰라서.. 그냥 Close로 했습니다 ㅎㅎ)
이 둘의 그래프를 그리면 아래와 같이 나오는 것을 볼 수 있습니다.
파란색이 페이스북이고 빨간색이 애플입니다. 눈으로 보았을 때 뭔가 비슷해보이지만 정말로 비슷한지, 서로 관계가 있는지 통계적으로 분석해보겠습니다.
먼저, 최근 3개월 주가에서의 페이스북, 애플 데이터에서 상관관계(correlation)을 확인해보겠습니다.
데이터의 상관관계는 매우 높게 나왔습니다. 하지만, 이것은 두 변수간의 상관관계이므로 시계열 적으로 연관성이 있는지 좀 더 정확한 관계 분석을 위해서 공적분 분석을 진행해보겠습니다.
파이썬에서 공적분 분석은 statsmodels 라이브러리를 이용해서 coint를 불러와서 사용할 수 있습니다.
이때 반환 값 중 p_value가 존재하는데요. 여기서의 귀무가설은 위에서도 언급했지만 서로 공적분 관계가 없다는 것이 귀무가설입니다. 따라서 p-value 값이 5%보다 작을 때는 이 귀무가설을 기각하여 서로 공적분 관계가 있다는 것을 알 수 있을겁니다.
실제로 최근 3개월 페이스북과 애플의 주가추이 데이터는 p-value 값이 0.3으로 30%가 나온 것을 확인할 수 있습니다.
즉, 장기적으로 보았을 때 이 두 데이터는 서로 관련성이 없다는 것을 알 수 있습니다.
마무리
이번 포스팅은 시계열 데이터의 연관성 분석에서 활용되는 공적분(cointegration)에 대해서 알아보았습니다. 서로 다른 시계열을 분석할 때 서로 어느 정도 연관성이 있는지 활용할 수 있습니다. 도움이 되시길 바랍니다.