시계열-공적분

허준·2022년 9월 3일
0

일단, 일반 시계열의 예시에서, 단위근이 생기면 확률적으로 추세가 생길수가 있었다. 차분을 하지 않고 원래 형태대로 선형 회귀 모델의 특성을 이용할 때, 통계적으로 유의하지 않음에도 그런 것처럼 나타날 수 있다.(허구적 회귀) 그래서 차분을 이용해 정상적으로 만들었다.

근데, 결과와 하나 이상의 입력 변수 사이에 공적분 관계가 있는 경우 예외가 생긴다.
개별 시계열은 정상성을 갖지 않더라도, 시계열에서의 선형 결합의 잔차가 정상성을 갖도록 회귀 계수를 추정할 수 있다. 이런 경우, 시계열이 공적분되었다고 표현한다.

술취한 남자가 데리고 다니는 개가 좋은 예시다. 두 궤도 모두 정상성은 아니지만 개가 가끔 주인에게 되돌아오며, 이 게 공적분의 관계라고도 볼 수 있다.
즉, 둘 이상의 공적분된 시계열의 선형 조합은 회귀하는 안정적인 평균을 갖는다.

상관계수와 공적분은 다른데, 예를 들어 2개의 성장하는 시계열이 서로의 상관 배수면, 어떤 선형 결합도 안정된 평균에 도달하지 못하고 계속 성장할 것이다. 이런 경우 상관관계는 높지만 공적분 되지는 않는다.

공적분은 두 자산 가격 시계열이 있고, 공통 평균으로 회귀할 때 추세에서의 편차를 이용할 수 있다. 기반 수학은 굉장히 어렵다고 한다.
이를 테스트 하는 방법은 두 가지다. Engle-Granger 2스텝, 요한센 절차(Johansen procedure)이다.

EG 방법은 다음과 같다.
1. 한 시계열을 다른 시계열로 회귀해 장기 정상성 관계를 추정한다.
2. ADF 단위근 테스트를 잔차에 적용한다.
귀무가설을 기각하면 시계열이 공적분된다고 가정할 수 있다.
이를 통해, 회귀식의 계수를 통한 선형 결합으로 평균으로 회귀하게 만드는(정상성을 갖는) 승수를 나타내게 할 수 있다.
단, 어떤 변수를 독립적으로 고려할지는 그때 그때 다르다. 또한, EG테스트는 2개에 대해서만 테스트가 된다는 단점도 있다.(Johansen은 12개 정도까지)

공적분을 이용한 가장 대표적인 전략이 페어 트레이딩이다. 역사적으로 움직임이 같았던 두 자산을 찾아 스프레드를 추적해 스프레드가 벌어지면 패자를 사고 승자를 숏 한다. 가격이 수렴함에 따라 포지션을 청산하게 된다.

그러려면 우선 1. 장기 평균 회귀 관계를 가진 자산을 찾고 2. 거래를 한다.

어떤 방법으로 거래를 실행할 것인지에 대한 예시 몇개는 아래와 같다.
1. 거리 접근법: 거리 척도를 가진 후보 쌍을 식별하고, 볼린저 밴드 등을 이용해 거래를 발동시킴
2. 공적분 접근법: 1에 비해 좀 더 신뢰성이 있는 통계 실험을 하게 된다.
3. 시계열 접근법: 스프레드를 평균-회귀 확률 프로세스로 모델링하고 그에 따라 진입 및 청산 규칙을 세운다.
4. 확률적 제어 접근법: 확률 제어 이론을 통해 규칙 최적화
5. 머신러닝 등 이용.

다만 이런 거래를 위해 굉장히 많은 파라미터를 정의해야 된다. 그리고 이를 결정하는 것은 굉장히 어려우면서, 많은 유연한 방법들이 있다.

페어 트레이딩의 어려운 점이, 거리 척도를 무작정 이용하기 어렵다는 데에 있다. 완벽한 공동 움직임을 보인다면, 실제 트레이딩 기회가 없을 것이므로 가장 높은 수익을 보장하지 않게 된다. 경험 적 연구로 공적분 쌍의 스프레드 변동성이 거리쌍의 스프레드 변동성 보다 2배 높았다고 한다.

계산비용, 결과의 품질 사이의 트레이드 오프를 맞추기 우해, 1. 안정적 스프레드를 가진 쌍 선택, 2. 공적분에 대해 스프레드 분산이 가장 높은 나머지 쌍을 테스트 하는 두 결합법을 합쳐서 하는 것이 권고된다.

실제 구현 코드를 보면 그래서 다음 처럼 구현되어 있다.
우선 corr이 1보다 작은 것 중에서 cutoff(0.99)를 넘는 것들을 선택한다. 즉 너무 상관관계가 높으므로, 두 자산 중 하나씩만 남긴다.
또한, stationary한 자산들은 제거한다. ADfuller test를 실행한뒤, p 값이 귀무가설을 기각하는 것들을 제거한다. 그 다음은 조금 모르겠는게 코드에서는 정상성이 있는 자산들을 제거했다. 반대 아닌가? 싶긴 한데 찾아봐도 바로 안 나와서 모르겠다.

이후 코드는 비교를 해서 보여주는데, spread의 평균 분산을 계산하고, Johnansen Test및 EG test를 실행한 결과를 보여준다.

from statsmodels.tsa.stattools import adfuller, coint
from statsmodels.tsa.vector_ar.vecm import coint_johansen

참고로 실험은 위 코드를 사용해서 진행할 수 있다.

distance 휴리스틱의 실행 결과(높은 상관관계, 잔차의 낮은 추세와 변동성)를 정답과 비교해 봤을 때, 전체 페어의 80%는 찾아내는데 성공했었다. 문제는 거기에 더해 매우 많은 수의 False Positive을 얻는 다는 점. 그럼에도 그보다 많은 수의 candidate를 먼저 제거해 주기 때문에, 연산 속도를 늘려주는데 확실히 도움이 될 수 있다는 점을 알 수 있다.

이렇게 쌍을 얻고 나면 이제 롤링 헤지 비율을 계산해야 한다. 또한, 볼린저 밴드를 계산하게 된다.
이를 위해 칼만필터를 적용한다. 헤지 비율을 코드는 계산해 놨지만 잘 모르는 부분이라 넘어간다. 그리고 무슨 반감기를 사용하는데 뭔지 모르겠다...

공적분은 한 쌍으로 움직이는 경향이 있는 쌍 혹은 그룹을 찾는데 유용하다. 그리고 트레이딩 규칙 또한 단순하다는 장점이 있다. 당연히 그런만큼 수익은 거의 찾기 힘들것이다.
성공하려면 큰 유니버스를 사용하고 파라미터를 최적화해야 한다. 개별 쌍 대힌 바스켓을 사용할 수도 있다.

profile
퀀트 지망(Quant candidate)

0개의 댓글