3. 튜토리얼/시계열 예측 및 계량 분석 방법론

파이썬을 활용한 애플 주가수익률 예측 분석 - (2). 변수간 상관분석 및 예측변수 정상성 검정

swsong 2023. 4. 30. 22:33

  본격적으로 모델링을 수행하기 전에 변수간 상관관계가 어떤지, 예측변수의 정상성이 확보되었는지 확인할 필요가 있다. 특정 설명변수가 예측변수와 상관관계가 강하거나 특정 설명변수 간 상관관계가 강하다면 해당 변수를 유심히 살펴야 한다. 전자의 경우 예측변수에 후행하는 것은 아닌지, 후자의 경우 동일한 외생변수를 갖거나 둘 사이에 상호 인과성이 존재하는 것은 아닌지 등을 확인하고, 해당 변수를 소거하거나 집계를 통해 시점 혹은 분포를 변환해줘야 한다.

 또한, 예측변수 내에 설명변수들로 하여금 예측변수를 추정하기 어렵도록 하는 특정 분포(추세, 계절성)의 존재 여부 역시 확인해야 한다. 예측변수 자체가 시간에 따라 그 분포(평균, 표준편차)를 달리한다면 단일변수를 통한 회귀분석은 물론 다중변수 모델링은 제대로 된 예측을 수행할 수 없기 때문이다.

Step 1. Data Preprocessing

이번 장에서는 변수간 상관분석 및 예측변수의 정상성 검정을 수행한다. 이는 앞으로의 모델링 과정을 위한 사전 작업으로, 정상적인(robust) 모델이 구현될 수 있도록 이전 장에서 확보한 데이터셋을 먼저 적절히 처리해보자. 시계열 예측에 가장 선행되어야 하는 중요한 작업은 시점 처리다. 기본적으로 예측변수는 모든 설명 변수로부터 미래에 존재해야 하며 이 미래의 값을 현재로 당겨줘야 하는데, 그 단위가 '시', '분', '초'까지 내려가지 않는 이상 하루 간격으로 잡는 것이 일반적이다.

예측변수 및 전체 설명변수는 모두 시계열 데이터다. 또한 그 자체로 자기상관성이 높은 금융 상품의 가격 데이터다. 가격(주가 등)은 본질적으로 전날의 가격을 기반으로 한다. 다시 말해 오늘의 시가가 전날의 종가다. 이러한 연결 고리를 끊어주지 않으면 시점이 누적됨에 따라 시계열의 분포는 달라진다. 따라서 단일 가격 데이터를 모두 로그-차분을 통해 각 일자별 수익률로 변환해주었다.

동시에, 예측변수 y에 대해서는 shift(-1) 함수를 사용해 하루씩 당겨 미래(내일)의 값을 현재(오늘)로 옮겨왔다. 또한 예측변수 y는 그 자체로 자기상관성이 내재되어있다는 가정을 가지고 지연값(5일, 20일, 60일)을 사용할 것이므로 여타 설명변수가 diff(1)만 수행한 것과 달리 diff(5), diff(20), diff(60)을 수행함으로써 5일 전, 20일 전, 60일 전 대비 수익률을 함께 설명변수로 포함해주었다.

Step 2. Correlation Check

파이썬에서는 corr() 함수를 사용하면 해당 데이터셋에 존재하는 모든 변수들간의 상호 상관계수를 구할 수 있다. 애플, 아마존, 메타, 마이크로소프트, 테슬라는 모두 나스닥 시총 상위 종목이므로 인덱스 펀드를 통한 유동성 유입에 따라 어느 정도 상관성(상관계수의 분포는 -1부터 1까지며, 높을 수록 상관성이 높다)을 보인다. 이외 우리가 지연값으로 사용한 5일, 20일, 60일 대비 수익률 역시 양의 상관관계가 존재한다.

주가 수익률 분포는 정규분포와 닮아 있으며, 정규분포에 비해 네거티브 왜도(skewness, 0보다 우측으로 기운)와 높은 첨도(kurtosis, 꼬리가 두꺼운)를 가진다. AAPL_d5, AAPL,d20, AAPL_d60의 분포를 보면 다른 분포에 비해 꼬리가 두껍고 평균이 우측으로 기운 것을 확인할 수 있는데, 이는 상대적으로 먼 과거에 비해 현재 주가의 분포를 보여주는 것이므로, 애플 주가가 과거 상당 기간동안 꾸준히 우상향했다는 사실을 알 수 있다.

참고로, 왜도(skewness)와 첨도(kurtosis)는 위와 같이 매우 간단히 확인할 수 있다.  skewness가 0보다 낮을 수록 좌측 방향으로 슬로프가 생기는 것이며(평균 우측 이동), kurtosis가 0보다 클수록 꼬리가 두껍다. 분포의 꼬리는 불확실성을 내재한다. 즉, 꼬리가 두껍다면 극단적인 변화(국내로 치면 상한가, 하한가)가 상대적으로 빈번히 발생한다는 것이며, d1, d5, d20으로 갈수록 그 경향은 줄어든다. 즉 단기간 내 변화는 장기간 변화에 비해 불확실하며, 장기로 갈수록 보다 확정적이다.

Step 3. Correlation by Month

앞서 예측변수의 지연값(d5, d20, d60)은 서로 양의 상관관계가 있음을 확인했다. 특히, d5~d20의 경우 0.52, d20~d60의 경우 0.55로 꽤 밀접한 관련이 있었으며 이 중 일부를 소거할 것인가를 판단하기 위해 각 기간별 상관계수를 한번 더 확인하겠다.

만약, 전체 기간에 대해 꾸준이 양의 상관계수가 나타나고 그 반대의 움직임을 포착할 수 없다면 일부 변수를 소거할 필요가 있다.

상당 기간에서 음의 상관관계가 포착되었으며, 각 월별 상관계수의 움직임도 충분히 상이해보인다. 즉, 일부 변수를 제거했을 때 얻는 효용 대비 발생하는 정보손실이 클 것이다. 따라서 모든 변수를 소거 없이 사용하자. 최종적으로 사용할 모든 설명변수와 예측변수간 상관계수는 다음과 같다.

Step 4. Check Stationarity of y

먼저, 정상성이란 데이터의 기저 확률분포가 시점에 따라 변하지 않는 것을 말한다. 이를 엄밀하게 '강'정상성이라 하며, 확률분포 자체의 동질성보다는 평균과 분산의 동질성에 초점을 옮긴 것이 '약'정상성이다. 이전 장에서도 언급했듯 일반적으로 우리가 분석하는 데이터에서 정상성을 확보한다거나 할 때 말하는 정상성은 약정상성을 가리킨다. 

4-1. Time Series Decomposition

우리는 사실 앞에서 로그차분을 수행하였기에 정상성을 확보되었으리라 기대한다. 다만 중요한 것은 위와 같이 시계열 데이터를 trend(추세), seasonal(계절성), residuals(잔차)로 분해했을 때 trend 역시 정상성이 확보되어야 한다는 점이다. 즉, 일간 수익률의 분포에서 뽑아낸 추세에 추세가 존재해서는 안된다. 다르게 말하면 기술적 시계열 분해를 통해 trend를 얻을 수 없어야 한다. 이미 로그 차분을 통해 추세를 제거했기(최소한, 제거했을 것이라 기대하기) 때문이다.

4-2. ADF(Augmented Dickey-Fuller) Test

이전 장에서 숙제로 남겼던 정상성 검정은 위와 같이 파이썬으로 간단히 실시할 수 있다. 예측값(y, AAPL)과 예측값의 추세(trend)에 대해 ADF 검정을 실시하였고, 둘 다 가장 강한 임계값(critical value, 1%)을 넘어 정상 시계열임을 확인했다.

ADF Test는 단위근 검정이라고도 한다. 검정 과정을 살펴보면, 해당 귀무가설(h0)은 '단위근이 존재한다'이다. 단위근의 존재 확률이 1% 이내로 희박하다면 단위근이 존재하지 않는다는 사실을 충분히 신뢰할 수 있고, 단위근의 부재로 해당 데이터는 정상 시계열임을 검증한다. 단위근이 존재하게 되면 시계열은 발산하고, 특정 분포로 수렴하는 것이 불가능하기 때문에 단위근의 부재를 확인하는 것이다.

본 장에서 우리가 새기고 넘어갈 것은 단위근의 존재가 시계열 데이터로 하여금 특정 분포로 수렴할 수 없도록 한다는 점, 따라서 단위근의 부재를 확인함으로써 시계열의 정상성을 확인한다는 점이다. 이 외 더 깊이 있는 설명은 ritvikmath 유튜브를 참고바란다.