알파트로스

[ArbLab] 1. Cointegration (2) Tests for Cointegration 본문

HudsonThames/ArbitrageLab

[ArbLab] 1. Cointegration (2) Tests for Cointegration

알파트로스 2024. 7. 4. 00:04

 

 

테스트 목적 적용 범위 가설 반감기 계산
ADF Test 단일 시계열의 단위근 검정 단일 시계열 데이터 단위근 존재 여부 ((λ=0)) 반감기 계산 가능: [ \text{Half-life} = -\frac{\log(2)}{\lambda} ]
Engle-Granger Cointegration Test 두 시계열 간 공적분 검정 두 개의 시계열 데이터 잔차의 정상성 검정 반감기 계산 가능 (공적분 관계가 성립할 때): 잔차 시계열의 λ값을 사용하여 ADF와 동일하게 계산
Johansen Cointegration Test 다중 시계열 간 공적분 검정 다중 시계열 데이터 랭크(r) 검정 반감기 개념 적용 어려움
         

Augmented Dickey–Fuller (ADF) test

Ernest P. Chan에 따르면 mean-reverting price series에 대한 수학적 설명은 "다음 기간의 가격 시계열의 변화가, 평균 가격과 현재 가격의 차이에 비례한다는 것"이다. 이에 따라 비례상수가 0이라는 귀무가설을 거부할 수 있는지 여부에 대한 테스트인 ADF 테스트가 생겨났다.

 

즉 ADF 테스트는 단일 시계열 데이터가 평균으로 회귀하는지를 테스트하는 방법으로. 현재 가격 수준이 미래 가격 수준에 대한 정보(평균보다 낮으면 다음 움직임은 상승할 것이고 평균보다 높으면 다음 움직임은 하락할 것이다)를 제공한다는 아이디어를 검정한다.

\[ \Delta y(t) = \lambda y(t-1) + \mu + \beta t + \alpha_1 \Delta y(t-1) + \ldots + \alpha_k \Delta y(t-k) + \epsilon_t \]

  • \(\Delta y(t) = y(t) - y(t-1)\)
    \(y(t)\)는 시계열 데이터의 값
    \(\lambda\)는 회귀 계수
    \(\mu\)는 상수항
    \(\beta t\)는 시간 경향을 나타내는 항
    \(\alpha_i\)는 차분된 항의 계수\(\epsilon_t\)는 오차 항

  • 가설 검정 : drift term이 0이라 가정(\(\beta=0\))
    ADF 테스트에서 검정하는 가설은 \( \lambda = 0 \)이다. 즉, \(\lambda\)가 0이면 시계열 데이터는 단위근이 있어 비정상적(확률적 추세를 따름)이고, \(\lambda\)가 0이 아니면 평균회귀적(평균으로 회귀)이다.
    즉 \(\lambda\)가 0이 아니라고 판정되면 다음 가격 이동이 현재 가격 수준에 의존적이라는 것을 의미한다

  • ADF와 같은 mean-reversion 테스트의 경우, 보통 90%의 확실성을 요구하나, 실전적으로는 더 낮은 certainty level에서도 전략을 만들어 낼 수 있다. 
  • Half-life 와 \(\lambda\)
    \[ \text{Half-life} = -\frac{\log(2)}{\lambda} \]
    • Measure \(\lambda\)는 Half-life를 계산하는데 사용되며 평균으로 회귀하는 데 걸리는 시간을 나타낸다.
    • \(\lambda\) 값이 양수이면 가격 시계열은 평균으로 회귀하지 않으며, \(\lambda\) 값이 0에 가까울수록 반감기는 매우 길어지고 전략이 효과적이지 않다.
    • 반감기 기간을 활용하여 거래 전략의 파라미터를 설정할 수 있다. 예를 들어, 반감기가 20일이라면 5일간의 이동 평균을 활용한 변동성 계산이 적절하지 않을 수 있다.

Cointegration Test는 다중 시계열 데이터들 간에 적어도 하나의 선형 결합이 정상적(stationary)임을 증명하려는 테스트이다. 대표적인 공적분 테스트로는 Engle-Granger 2단계 방법(Engle-Granger Two-Step Method)과 Johansen 테스트가 있다.

Engle-Granger Cointegration Test

    1. OLS 회귀를 통해 공적분 관계를 추정한다
    2. 잔차에 대한 단위근 검정을 수행하여 공적분 관계의 존재를 확인한다.


Engle-Granger Cointegration Test는 두 개 이상의 가격 시계열이 특정 차수의 공적분 관계를 가지는지를 검정한다.


우선 변수 \(x\)와 \(y\)의 integration order를 결정한다 (ADF테스트등의 방법론 이용) 동일한 차수이면 공적분 테스트를 적용할 수 있다. 아닐 경우 Johansen방법론을 사용해야한다.

아비트라지랩 참고) Engle-Granger 공적분 테스트는 변수들이 order 1으로 integrated 되었다고 가정한다.

 

변수가 차수 integrated of order 1이라면 아래와 같은 회귀를 진행한다.
\begin{matrix}x_{t} = a_{0} + a_{1} y_{t} + e_{1 , t} , \\ y_{t} = b_{0} + b_{1} x_{t} + e_{2 , t}\end{matrix}
위 회귀를 수행하고 각각의 방정식에 대해 단위근 검정을 수행한다.
\begin{matrix}\Delta e_{1 , t} = a_{1} e_{1 , t - 1} + v_{1 , t} , \\ \Delta e_{2 , t} = a_{2} e_{2 , t - 1} + v_{2 , t}\end{matrix}

  • 가설검정
    귀무가설은 \(a_1 = 0\) 및 \(a_2 = 0\) 이다. 
     \(a_1 = 0\) 이면 \(\Delta e_{1 , t}\) =\(v_{1 , t}\)이고, 이는  \( e_{1 , t}\)가 단위근을 가진 랜덤워크과정임을 의미한다
    따라서 이 귀무가설은 "시계열이 단위근을 가지고 있다(비정상적이다)"와 동일한 의미이다.

    만약 귀무가설을 기각할 수 없다면, 변수들이 공적분되지 않는다고 판단한다.

  • 헤지 비율 계산
    평균 회귀 포트폴리오를 구성할 때 Engle-Granger 테스트의 헤지 비율은 \(x\) 변수에 대해 1, \(y\) 변수에 대해 \(-a_1\)로 설정된다

  • Engle-Granger 검정에서 나오는 공적분 벡터와 헤지 비율의 관계
    공적분 벡터에서 부호만 바꾸면 헤지 비율이 되고, 헤지 비율에서 부호만 바꾸면 공적분 벡터가 된다(종속 변수 제외).
    여기서 β₁은 OLS 회귀에서 얻은 계수들이다
    • 공적분 벡터: [1, -β₁] : 각 계수는 장기 균형에서 해당 변수의 상대적 중요도를 나타낸다. 부호가 반대이므로 균형 상태에서 변수들 간의 상쇄 관계를 보여준다.
    • 헤지 비율: [1, β₁] : 각 계수는 종속 변수의 변화에 대한 각 독립 변수의 영향력을 나타낸다. 이는 각 자산이 포트폴리오에서 차지해야 할 비중이다.
  • 예시
    만약 y = 2x₁ + ε 형태의 관계가 있다면,
    • 공적분 벡터: [1, -2 ] : 0 = y - 2x₁  - ε 형태의 장기 균형 관계를 나타낸다
    • 헤지 비율: [1, 2 ] :  y에 대해 1, x₁에 대해 2의 비율로 포지션을 취해야 함을 의미한다
# Importing packages
import pandas as pd
from arbitragelab.cointegration_approach.engle_granger import EngleGrangerPortfolio

# Getting the dataframe with time series of cointegrating asset prices
data = pd.read_csv('X_FILE_PATH.csv', index_col=0, parse_dates = [0])

# Running tests and finding test statistics and cointegration vectors
portfolio = EngleGrangerPortfolio()
portfolio.fit(data)

# Getting results for the ADF test in the last step of the method
adf_statistics = portfolio.adf_statistics
"""
ADF 테스트의 해석:

ADF 테스트는 시계열 데이터가 단위근을 가지고 있는지, 즉 비정상적(non-stationary)인지 검정합니다.
귀무가설은 "시계열이 단위근을 가지고 있다(비정상적이다)"입니다.
테스트 통계량이 임계값보다 작으면(더 음수이면) 귀무가설을 기각하고, 시계열이 정상적(stationary)이라고 결론 내립니다.

만약 잔차가 정상적이라면(ADF 테스트 통계량이 임계값보다 작다면), 원래의 시계열들이 공적분 관계에 있다고 볼 수 있습니다.
이는 비정상적인 개별 시계열들 사이에 장기적인 균형 관계가 존재함을 의미합니다.
공적분 관계가 확인되면, 이를 바탕으로 평균 회귀 트레이딩 전략을 구성할 수 있습니다.
"""

# Resulting cointegration vector
cointegration_vectors = portfolio.cointegration_vectors

# Hedge ratios that can be used for spread construction
hedge_ratios = portfolio.hedge_ratios

 

Johansen Cointegration Test

Johansen Cointegration Test는 여러 개의 시계열 데이터에 동시에 적용할 수 있다는 점에서 ADF 테스트보다 유리하다. 이는 다중 시계열의 정상성(stationarity)을 검정할 수 있으며, 공적분 벡터를 통해 포트폴리오 구성 시 헤지 비율을 제공한다.

ADF 테스트의 방정식을 벡터 형식으로 변환하여 다중 시계열에 적용한다. \( y(t) \)는 여러 가격 시계열을 나타내는 벡터이고, \(\lambda\)와 \(\alpha\)는 행렬이다. drift term은 0 (\(\beta = 0\))으로 가정하면 아래와 같이 식을 다시 쓸 수 있다.
\[
\Delta Y(t) = \Lambda Y(t-1) + M + A_1 \Delta Y(t-1) + \ldots + A_k \Delta Y(t-k) + \epsilon_t
\]

  • \(\Delta Y(t) = Y(t) - Y(t-1)\)
    \(Y(t)\)는 시계열 데이터의 벡터
    \(\Lambda\)는 공적분 관계를 나타내는 행렬

  • 가설 검정
    \(\Lambda = 0\)이라는 가설을 검정한다. 이 경우, 즉 공적분 관계가 존재하지 않는다는 가설을 세운다. 이 가설이 기각되면 공적분 관계가 존재한다는 것을 나타내며, \(r\)이 1 이상임을 의미한다

  • 랭크 \(r\)는 공적분 벡터의 수를 의미한다. 공적분 벡터는 시계열 데이터들 간의 장기적인 균형 관계를 나타내며, 이러한 벡터의 수가 \(r\)로 표현된다
    즉 Johansen 테스트는 주어진 시계열 데이터에서 공적분 벡터가 존재하는지(즉, 공적분 관계가 존재하는지)를 검정하고, 그 개수를 결정한다.
    •  \(r = 0\) (공적분 관계 없음)
    • \(r \leq 1\), \(r \leq 2\), ..., \(r \leq n-1\) 가설을 차례로 검정하며, 최종적으로 공적분 벡터의 최대 개수를 결정
    • 만약 모든 가설이 기각되면, \(r\)은 데이터의 시계열 수 \(n\)과 같아지며, 이는 공적분 벡터가 \(n-1\)개 존재한다는 것을 의미
    • 랭크는 고유값(eigenvalue)을 통해 결정된다. 고유값이 0에 가까울수록 해당 벡터는 공적분 관계가 없음을 의미하며, 고유값이 유의미하면 공적분 관계가 존재할 가능성이 높다
  • 포트폴리오 구성
    • 만약 \(r\)이 1이라면, 하나의 공적분 관계만 존재한다는 의미이므로, 하나의 평균 회귀 포트폴리오를 구성할 수 있다.
    • \(r\)이 2 이상이면, 여러 공적분 벡터를 사용하여 각각의 포트폴리오를 구성할 수 있다. 이 포트폴리오들은 서로 독립적일 수 있으며, 다양한 투자 전략을 구현할 수 있는 기초가 된다.
      아비트라지랩 참고 ) ArbitrageLab 패키지는 가장 큰 고유값에 대응하는 공적분 벡터를 hedge ratio로 사용한다.
  • Engle-Granger 테스트와 달리, Johansen 테스트는 시계열의 순서에 독립적이다. 즉, 어떤 시계열을 종속 변수로 선택하느냐에 따라 결과가 달라지지 않습니다.

아비트라지랩 참고)
ArbitrageLab 패키지의 Johansen 테스트는 공적분 벡터, 추적 통계(trace statistics), 고유벡터 통계를 제공하며, 입력 데이터프레임이 12개 이하의 가격 시계열이어야 한다

# Importing packages
import pandas as pd
from arbitragelab.cointegration_approach.johansen import JohansenPortfolio

# Getting the dataframe with time series of cointegrating asset prices
data = pd.read_csv('X_FILE_PATH.csv', index_col=0, parse_dates = [0])

# Running tests and finding test statistics and cointegration vectors
portfolio = JohansenPortfolio()
portfolio.fit(data)

# Getting results for the eigenvalue statistic test
eigenvalue_statistics = portfolio.johansen_trace_statistic

# Getting results for the trace statistic test
trace_statistics = portfolio.johansen_eigen_statistic

# Resulting cointegration vectors
cointegration_vectors = portfolio.cointegration_vectors

# Hedge ratios that can be used for spread construction
hedge_ratios = portfolio.hedge_ratios

 


참고 Cointegration Vector Positive Coefficient Problem

공적분 벡터의 계수가 모두 양수(공적분 벡터가 \( \beta_1 > 0, \beta_2 > 0, \ldots, \beta_n > 0 \)일 경우) 이론적으로는 공적분이 성립하지만 실질적인 스프레드 거래 전략에는 적합하지 않을 수 있다.

즉 모든 자산을 매수하거나 매도하는 형태가 되고 이는 스프레드 거래의 기본 원리인 한 자산을 매수하고 다른 자산을 매도하는 구조와 맞지 않다

이러한 경우 몇 가지 대안적인 접근 방법을 고려할 수 있다:
1. 추가적인 제약 조건을 부여하여 음의 계수를 가지는 공적분 벡터를 탐색한다

2. 공적분 관계를 직접 활용하지 않고, 다른 형태의 상관 관계를 이용한 거래 전략을 개발한다

 

https://hudson-and-thames-arbitragelab.readthedocs-hosted.com/en/latest/cointegration_approach/cointegration_tests.html

 

Tests for Cointegration — arbitragelab 1.0.0 documentation

According to Ernest P. Chan: “The mathematical description of a mean-reverting price series is that the change of the price series in the next period is proportional to the difference between the mean price and the current price. This gives rise to the A

hudson-and-thames-arbitragelab.readthedocs-hosted.com