Dynamic Time Warping(DTW) 기반 가격 예측 모델 개발기
Dynamic Time Warping(DTW) 기반 가격 예측 모델 개발기

Dynamic Time Warping(DTW) 기반 가격 예측 모델 개발기

안녕하세요, COSIGN 기술 블로그입니다.

오늘은 COSIGN에서 개발한 가상 화폐 가격 예측 모델의 개발 과정을 소개 드리겠습니다.

1. 가격 예측 모델의 필요성

대부분의 투자 서적들은 공통적으로 매매 원칙의 중요성을 강조합니다. 왜 매매 원칙이 중요할까요? 사람은 필연적으로 비일관성, 확신 평향, 기준점 편향, 손실 회피 현상, 처분 효과, 확증 편향 등의 인지 편향의 문제를 갖게 되기 때문입니다.

이런 인지 편향의 문제로부터 벗어나 일관된 매매를 하기 위해 알고리즘 트레이딩을 사용할 수 있습니다. 알고리즘 트레이딩은 컴퓨터 프로그램을 이용하여 일정한 논리 구조, 즉 정해둔 규칙에 따라 매매하는 방식입니다.

여기서 더 나아가, 인공지능 모델을 사용하여 가격을 예측하고, 예측 결과를 바탕으로 매매하는 방식을 사용할 수도 있습니다. 과거 데이터를 기반으로 학습한 모델의 예측 값을 기반으로 매매 의사 결정을 하는 것입니다.

2. 가격 예측 문제 정의

기계 학습 모델을 사용한 가격 예측은 크게 회귀(Regression) 또는 분류(Classification) 문제로 접근할 수 있습니다. 회귀는 구체적인 수치를 예측하는 형태, 분류는 가격이 상승할 것인지 하락할 것인지 방향을 예측하는 형태입니다.

또, 가격 예측은 시계열 예측 문제로, 회귀와 분류 두 경우 모두, 현 시점 (t)로부터 예측하려는 시점 (t + n)에 대해 n 단위 시간 뒤의 상태를 예측하는 형태로 모델을 개발할 수 있습니다.

3. 예측 프로세스

모델은 회귀와 분류 모두에 활용이 가능하고 직관적이며 간단한 예측 모델 중 하나인 K-Nearest Neighbor(K-NN)를 사용하여 개발하였습니다. K-NN은 주로 예측하고자 하는 데이터와 가장 유사한 과거 데이터 K개의 결과를 Voting 하여 예측을 생성하는데, 시계열 데이터의 경우 ‘가장 유사하다’는 판단의 척도로 Dynamic Time Warping(DTW) 알고리즘을 사용하여 계산한 유사도를 많이 사용합니다.

예측 프로세스는 크게 아래의 두 가지 단계로 나누어집니다.

  1. DTW Distance Matrix 계산
  2. K-NN 예측

    1.  

    과거 데이터에 대해 한 번 DTW Distance Matirx를 계산하여 Database에 저장하고 나면, 다음 번에는 다시 계산할 필요 없이 Database에서 불러와서 사용할 수 있으며, 미리 계산해놓은 Distance Matrix를 사용함으로써, 많은 하이퍼 파라미터 조합에 대해 교차 검증을 하는 경우 소요 시간을 단축 시킬 수 있습니다.

    그림 1. 예측 프로세스 흐름도

    4. DTW Distance Matrix 계산

    우리가 일반적으로 데이터의 유사성을 따질 때 사용하는 측도인 유클리드 거리를 사용하면 같은 시간 선상에 대해 거리를 계산하므로, 아래 왼쪽 그림과 같이 특징적인 부분이 지연되거나, 다른 비율을 갖는 경우 정확하게 비교할 수 없게 됩니다.

    이런 문제는 DTW 알고리즘을 사용하여 해결할 수 있습니다. DTW의 아이디어는 동일한 시간 선상의 데이터뿐 아니라 주변 시점까지 비교 대상으로 사용하여 더 비슷한 요소와 매칭하는 것으로, 아래 오른쪽 그림처럼 DTW를 사용하면 서로 다른 위치에 있는 유사 패턴을 찾아 비교할 수 있게 됩니다.

    그림 2. 유클리드 거리를 사용한 유사도 계산(위), DTW를 사용한 유사도 계산(아래)

    그림 3. 유사 패턴 탐색 결과. 현재 패턴(빨간색), 과거 패턴(파란색)

    DTW 알고리즘은 두 시계열 간의 유사성을 판단하는 알고리즘으로, 두 시계열 간의 모든 성분들 사이의 유클리드 거리를 측정한 거리 행렬(Distance Matrix)을 만들고 각 시계열의 시작 성분에서부터 마지막 성분까지의 누적 비용이 최소가 되도록 정해진 기준에 따라 각 성분을 매핑합니다.

    이 때, 길이가 n, m인 두 시계열 Q, C는 다음과 같이 표현할 수 있습니다.

    두 시계열을 나열하여 만든 n×m 거리 행렬의 (i, j)번째 요소는 두 점 간의 유클리드 거리를 의미하며, 이는 다음과 같이 표현할 수 있습니다.

    두 시계열 Q, C 간의 매핑 관계를 정의하는 거리 행렬 성분들로 이루어진 연속적인 집합 W를 와핑 경로라고 하며, 다음과 같이 표현할 수 있습니다.

    DTW 알고리즘은 다음의 3가지 제약 조건 하에 와핑 거리 wk의 총합이 최소가 되는 와핑 경로 W 및 와핑 거리의 총합(유사도) DTW(Q, C)를 계산합니다.

    경계값 조건(Boundary Conditions): 시작점과 끝점 w1=(1, 1), wk=(m, n)은 이어져야 한다.

    연속성 조건(Continuity): wk=(a, b)와 wk-1=(a’, b’)에서 a-a’≤1, b-b’≤1 이어야 한다. 즉, 와핑 경로는 대각 요소를 포함한 인접한 셀로 제한된다.

    단조 조건(Monotonicity): wk= (a, b)와 wk-1=(a’, b’)에서 a-a’≥0, b-b’≥0 이어야 한다. 즉, 와핑 경로는 음의 방향으로 이동하지 않는다.

    상기한 내용과 같이 DTW 알고리즘을 사용하여 일정한 Window Size 크기 만큼의 시퀀스 간 유사도를 계산하며, 유사도 계산 전, 두 시퀀스의 가격 스케일을 일치시키기 위하여 정규화(Normalization)를 수행합니다. 이 과정을 과거 시점에 대해 Stride만큼 이동하며 반복하여 모든 과거 시퀀스에 대해 유사도를 계산하면 완료됩니다. 이 때, Distance Matirx는 대칭 행렬이므로, n개의 시퀀스에 대한 총 계산 횟수는 n(n -1) / 2 가 됩니다.

    그림 4. 유사도 계산 과정

    5. K-NN 예측

    K-NN은 사례 기반(Instance-based) 방식에 속하는 비모수 모델로써, 이상치에 강건하고 간단한 원리에 비해 대체로 높은 정확도를 갖는 장점이 있지만, 데이터 수가 늘어남에 따라 계산 소요 시간이 크게 증가하고 많은 메모리를 사용하게 되는 단점이 있습니다.

    K-NN 예측은 예측하고자 하는 시점의 시퀀스 Q와 과거 시퀀스 C간의 유사도 계산 결과를 사용하여 예측 값을 계산합니다. 과거 시퀀스들 중 가장 유사했던 패턴 n개를 추출한 후, 각 패턴들의 이후 흐름을 종합하여 예측 값을 생성하며, 평균을 내는 방법이나 유사도를 가중치로 사용하여 가중 평균을 계산하는 방법 등을 사용할 수 있습니다.

    길이가 m, k인 i번째 과거 시계열 Ci, 각 과거 시계열의 이후 흐름을 나타내는 시계열 Mi, 예측 시계열 Pj는 다음과 같이 표현할 수 있습니다.

    그림 5. K-NN 예측 예시

    6. 평가

    본 예측 모델의 개발 과정에서는 성능을 평가하기 위해 바이낸스에 상장된 100여 종 코인의 현물 가격 데이터에 대하여 백테스트를 수행했습니다. 백테스트는 가격 예측 결과를 상승/횡보/하락의 다중 분류 형태로 변환한 뒤 결과에 따라 롱/숏 포지션을 유지하도록 하여 최종 수익률을 계산하였습니다.

    대상 코인: 바이낸스 현물 코인 100종

    기간: 2017.09.25 ~ 2022.09.11 기간의 데이터를 5폴드로 나눈 후 뒤 3폴드에 대해 테스트

    예측 길이: 하루

    수수료: 바이낸스 선물 매매 기준 0.04%

      Buy&Hold

    누적수익률

    (수수료포함)

    누적수익률

    (수수료미포함)

    정확도

    (이진)

    메이저 클래스 비율(이진)

    정확도

    (다중)

    메이저클래스비율(다중)

    바이낸스

    코인 100종 평균

    367.83% 496.88% 735.29% 53.76% 53.60% 51.25% 52.68%

    그림 6. BTCUSDT 백테스트 결과. 가격 데이터(파랑), 누적 수익률(주황), 수수료 제외 누적 수익률(초록)

    그림 7. WAVEUSDT 백테스트 결과. 가격 데이터(파랑), 누적 수익률(주황), 수수료 제외 누적수익률(초록)

    백테스트 결과, 가장 높은 수익률을 기록한 코인은 WAVEUSDT이었으며, 3폴드 누적 수익률 7,681.98%를 기록하였습니다. 가장 저조한 수익률을 기록한 코인은 LUNAUSDT 외 4종 이었으며, 모두 청산되었습니다. 비트코인은 테스트 기간 동안 Buy and Hold 553.22%에 반해, 누적 수익률 118.15%로 상대적으로 저조한 결과를 나타내었습니다.

    출처

    그림 2. XantaCross, CC BY-SA 3.0 https://creativecommons.org/licenses/by-sa/3.0, via Wikimedia Commons

    답글 남기기

    이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다