본문 바로가기

Data & AI

Timeseries Representation Learing으로 트레이딩 대응하기 (TS2Vec)

 

안녕하세요

 

오늘은 Timeseries Representation Learning 기법 중 하나인

 

TS2Vec을 이용해서 

 

시계열데이터를 분석하고 이를 트레이딩에 도움이 될 수 있는 작업들을 수행해보려고 합니다. 

 

 

Representation Learning

 

먼저 제가 이야기하는 Representation Learning 작업에 대해 간단히 알려드리겠습니다. 

 

우리가 AI라는 단어를 하루에 수십 번 들으며 살아가는 세상

 

바로 이 시기가 오기 전 "데이터가 중요하다"라는 말을 많이 들어보셨을 겁니다.

 

4차 산업혁명이라는 말도 함께 들으셨을 거고요.

 

많은 기업들이 데이터에서 가치를 뽑아내고, 결국 킬러앱이라고 할 수 있는 ChatGPT를 시작으로

 

저처럼 AI나 데이터를 다루는 직업을 가진 사람뿐 아니라 일반인들에게도 AI의 실체를 접하게 된 역사적 시점을 만들어내었습니다. 

 

훌륭한 AI는 모두 데이터에서 가치를 뽑아내어 만들어낸 것이라고 할 수 있습니다. 

 

하지만 데이터가 점점 더 많아지면서 이 큰 데이터에서 의미 있는 정수를 가지고 활용하는 게 더 유리해지기 시작했습니다.

 

Representation이란 원천 데이터에서 의미 있는 데이터로 압축하고 뽑아낸 정수입니다. 

 

원본데이터의 복잡성과 노이즈를 줄이고 중요한 정보를 유지하게 하면

 

머신러닝 모델이 더 잘 이해하고 처리할 수 있게 됩니다. 

 

Representation Learning은 그런 Representation을 잘 뽑아내기 위한 학습이라고 볼 수 있습니다. 

 

복잡하고 방대한 데이터에서 중요한 정보를 파악하는 것

 

우리가 투자와 트레이딩을 하면서 접하게 되는 시계열데이터, 이 데이터 안에도 수많은 정보들이 있지만

 

우리의 투자에 도움이 되는 데이터 포인터가 무엇인지 알아내는 것이 중요합니다. 

 

 

TS2Vec

 

TS2Vec은 Timeseries Representation Learning을 위한 방법으로

 

만들어진 Representation을 다양한 task에 활용하는 것을 강조하고 있습니다. 

 

우리가 투자를 하려면 특정한 종목을 매수할지 매도할지 정해야 합니다. 

 

이런 의사결정을 위해선 우리가 신의 영역이라고 등한시한 예측을 기반으로 하거나

 

과거 사례를 이용하여 지금 시기와 비슷한 시기, 혹은 지금 차트의 움직임과 비슷한 움직임을 분석하곤 합니다. 

 

AI도메인ㅢ Timeseries에서도 task라고 함은

 

보통 Anomaly Detection, Forecasting, Clustering, Classification 등이 있습니다. 

 

TS2Vec은 시계열의 원천데이터에서 Representation Vector를 만들어내고

 

동일한 Representation Vector를 활용해서 예측도 하고 이상탐지도 하고 클러스터링, 분류작업도 진행하는데 의미가 있습니다. 

 

 

대략적으로 TS2Vec의 Representation Learning 핵심들만 짚어보도록 하겠습니다. 

 

(TS2Vec의 심도 있는 페이퍼 리뷰는 DSBA 연구실의 Paper Review 자료/영상을 아주 강력 추천합니다. )

 

해당 논문에서는 Encoder 구조를 활용하여 Contrastive Learning을 수행합니다. 

 

Contrastive Learning은 우리가 이해할 수 없는 벡터의 세상에서 

 

의미적으로 비슷한 데이터들인 positive pair끼리는 가깝게, negative pair끼리는 distance를 멀게 위치하도록 학습하는 방법입니다. 

 

다양한 언어모델과 이미지 모델들도 학습에 이 방법을 활용하고 있고 시계열데이터에도 위 사진의 빨간 구간과, 초록 구간처럼

 

비슷한 구간과 그렇지 않은 구간이 있고, 우리가 Representation Vector를 만들 때 positive, Negative Pair를 참고하여 학습합니다. 

 

사실 기존의 연구에서도 Contrastive Learning은 사용되고 있었지만

 

논문에서는 좀 더 개선된 방법을 제안하고 있습니다. 

 

아래 사진처럼 특정 시퀀스는 비슷한 pair일 것이다라는 가정의 기본 연구에서

 

시계열데이터의 특성상 단기적으로 알 수 없는 impulse가 발생할 수 있는데

 

초록 음영, 노란 음영이 같은 시기의 데이터이지만 같은 pair라고 볼 수 있는가에서 개선을 시작하고 있습니다. 

 

 

 

결국 논문에선 다양한 시계열들의 벡터화할 때 

 

동일 time window에 대해서 동일 구간에 대해서는 실제 원천 데이터가 같은 지점의 데이터이기 때문에

 

positive pair로 지정을 하여, 다른 context representation으로 변환된 벡터에서

 

나름의 힌트를 주면서 contrastive learning을 개선하고 있습니다. 

 

 

 

트레이딩에 활용하기

 

이렇게 좋은 연구를 우리가 트레이딩을 할 때 사용해 봐야겠죠

 

yahoo finance에서 SPY의 일별 수정 종가를 가져와서 TS2Vec 모델을 통해 학습하여 

 

320차원의 Representation Vector를 만들어보았습니다. 

 

 

time_window는 20을 부여해서 

 

한 데이터셋마다 20일의 종가를 보고 한 달 뒤의 종가가 상승 (1)인지 하락(0)인지 라벨링을 해두었는데

 

해당 라벨에 대한 예측도는 67%로 나왔으나

 

사실 SPY 자체가 우상향 하는 자산이기 때문에 데이터를 섞어도 라벨 1에 대한 데이터가 60% 정도여서 의미는 없을 것 같습니다. 

 

그래서 우리가 트레이딩에 활용할 수 있도록, 

 

해당 벡터를 응용해 보도록 하겠습니다. 

 

 

320-dim Representation Vector로 과거에 비슷한 패턴을 보인 시기 찾아보기

 

우리가 SPY의 시계열데이터를 학습해서 

 

가격의 움직임을 320차원으로 정돈해 두었기 때문에

 

이 320차원 데이터로 과거 비슷한 패턴을 가졌던 구간을 잘 찾아내는지 테스트를 해보았습니다. 

 

 

첫 번째 열이 대상 시계열, 두 번째 열이 그 시계열과 비슷한 구간의 시계열

 

그리고 마지막 세 번째 열은 각 시계열 이후의 가격 변동 추이를 나타내고 있습니다. 

 

일단 비슷한 구간은 대상 시계열의 320차원의 벡터들과

 

과거 시계열의 320차원 벡터들을 cosine유사도를 통해 비교했더니 아주 유의미하게 비슷한 구간들을 잘 찾아내는 것을 보였습니다. 

 

해당 시점 이후의 가격 변동은 역시나 모든 경우에 들어맞는 것 같진 않지만 60% 정도에 준하게 방향은 맞추고 있었습니다. 

 

방향이 다른 케이스도 급변한 데이터들이거나 단기적인 과대 낙폭, 상승 등을 제외하면 수익률의 추이는 비슷한 양상을 보이고 있었습니다. 

 

예측 모델로 만들기 전에 시계열 분석 자체를 잘 진행해서 

 

320차원의 훌륭한 Representation Vector를 만들었으니, 

 

현재의 차트가 과거의 비슷한 패턴들, 비슷한 과거 차트 움직임을 참고해서

 

현시점에 어떻게 대응하면 좋을지 활용하면 좋은 지표가 될 수 있을 것 같습니다. 

 

그리고 TS2Vec에서는 벡터를 예측, 분류, 이상치 탐지 등 여러 task에 수행할 수 있다고 했습니다. 

 

과연 예측모델에서도 좋은 성과를 내는지 한 번 확인해 보겠습니다. 

 

 

위 차트는 특정 시점 이후 예측값을 주황색 점선으로 나타내었습니다. 

 

언뜻보면 실제 ground truth와 forecasting series가 차이가 많이 나는 것 같지만

 

예전에서도 말했던 전통적인 손실함수를 이용한 예측모델은

 

대부분 모델이 예측하는 값과, 실제 값들의 MSE Loss를 이용하는 것이 대부분이고

 

다른 손실함수들도 결국 실제 ground truth와 forecasting값의 차이가 최소가 되게 하므로

 

예측 모델이 소극적으로 변하는 경우가 있습니다. 

 

위 케이스도 input timeseries 이후 데이터의 pred_len (이 경우는 5) 이후

 

가격이 올랐는지 내렸는지를 잘 맞추었는지를 좀 더 중점을 두면 좋을 것 같습니다. 

 

이 자체가 위와 같은 패턴에 오른 경우가 더 많았으면 소극적이지만 상승 예측을

 

틀린 경우도 40% 정도인데 이 경우도 틀렸지만 실제로 과거에 예측처럼 되는 경우가 더 많았기 때문이겠죠?

 

트레이딩을 포함해서 시계열 도메인에서 언제나 100% 정답을 찾으려 드는 건 큰 함정과도 같습니다. 

 

제가 여러 모델들을 구축하여 앙상블 모델을 구축하는 것처럼

 

시계열이 갖는 분산을 낮추고 확률을 쌓아가기 위해선 과적합되지 않은 좋은 모델들, 여러 시그널들을 확인하고 투자하는 게 중요합니다. 

 

 

JeTech Lab에 어떻게 차트를 그려내면 좋을까

 

위와 같은 연구들을 재미있게 보셨나요?

 

저도 저런 분석들에 중독되어서 사실 서비스개발이 늦어지고 있습니다. 

 

방구석에서 저런 분석을 나만 이용하고 끝내지 않고 세상에 드러내보기 위해 JeTech Lab 이란 서비스를 개발하고 있는데

 

제가 만든 시계열 분석 모델이 산출하는 데이터들을 모니터링할 수 있는 웹앱이고

 

데이터 시각화에 중점을 둔 서비스이기 때문에 차트데이터들을 이용한 Component 구성과 UI UX가 핵심이 될 것입니다. 

 

그런데 문제는 저는 Front-end 영역의 커리어가 전무하다는 것입니다. 

 

무엇이 예쁜 디자인인지 잘 이해하지 못하고 논리와 알고리즘만 생각하던 전형적인 개발자로 살아와서 

 

막상 데이터가 모두 준비되어 있고 어떻게 개발해야 할지 기술스택도 다 그려지지만

 

어떻게 데이터를 보여야 사용자가 내 데이터를 잘 이해하고 받아들일 수 있을까에 대한 경험은 많이 부족했던 것 같습니다. 

 

게다가 트레이딩을 좋아하고 투자에 활용하기 위한 사용자를 정의하고 있기 때문에

 

시각적인 차트요소를 개발해 내기 위해 훌륭한 라이브러리들이 존재하지만

 

당장 그런 라이브러리들을 자유롭게 구사할 수 있는 수준은 아니기 때문에 더욱 장벽이 높아 보이고 주저하고 있는 현실입니다. 

 

그래서 제가 고안한 방법은 이렇습니다. 

 

제가 소프트웨어를 배워가는 시기에 데이터의 중요성과 AI시대에 대비해야 한다는 말들을 듣고 살아왔기에

 

소프트웨어로 데이터를 다루는 기술이 자연스럽게 연마되었고

 

"Python으로 데이터를 다루고 시각화하는 것 정도는 할 수 있겠다"

 

"그럼 그 시각데이터를 web에 활용할 순 없을까?"

 

Python 데이터 시각화 웹을 간단하게 구축하는 것이 가장 쉽고 현명한 방법이긴 하지만

 

(Dash, Streamlit 등)

 

저는 단순하게 데이터를 보여주는 단계가 아니라

 

 추후에는 여러분들이 이 서비스에 참여해서 

 

데이터에 대한 스스로의 견해나 비판적인 사고를 공유하면서

 

우리 모두 더 성장할 수 있겠다고 생각했고 그러기엔 위와 같은 방법보다는

 

정말 본격적인 웹서비스 구축을 위한 프레임워크인 Next.js를 선택했던 것이었거든요

 

그래서 Next.js와 같은 React 진영, 넘어서 웹 진영에도 활용될 수 있는 차트 라이브러리를 활용하기로 했습니다. 

 

 

Plotly는 Js, Python에 잘 구현되어 있는 라이브러리를 제공하고 

 

모델과 데이터가 Python에 있다 보니, 익숙한 Python에서 데이터를 시각화하고 

 

데이터 차트 component를 json object로 매핑하여 서버에 저장해 두면

 

view영역에서 해당 json object를 풀어서 시각화해 주면 될 것 같다는 생각이 들었습니다. 

 

plotly도 d3.js의 구현체이긴 하지만 직접 d3.js를 응용할 기술이 없다면

 

이보다 더 적은 리소스를 활용하여 개발하는 방안은 없을 것 같았습니다.

 

 

 

TODO

 

오늘은 시계열데이터를 분석해서 

 

트레이딩을 하기 위한 Representation Vector를 만들어내는 논문을 리뷰하고 학습과 테스트까지 진행했습니다. 

 

저는 이 연구가 앞으로 진행할 연구의 초석이 될 것 같습니다. 

 

해당 Representation Vector를 활용해서 다양한 모델에 응용하기도 하고

 

유사도가 비슷한 벡터들을 군집화하여 트레이딩 모델에 현재시점과 비슷한 시점의 군집에 가중치를 더 부여하고

 

시그널을 증폭시키는데 활용하는 등 유의미하게 쓰일 수 있을 것 같습니다. 

 

그리고 데이터 시각화 서비스에 활용하기 위한 아이디어들도 생각해 보았는데

 

하반기 출시를 위해서 모델이 만들어낸 데이터를 어떻게 보여줄지 고민도 해보았습니다. 

 

 

 

또 제가 만들고자 하는 서비스에 비해

 

제가 부족한 점들이 많은 것 같아 기술과 지식을 가장 쉽게 접하는 방법은 독서와 연습이라고 생각합니다. 

 

이 두 책을 추천받아서 한 번 읽어보고 서비스에 녹여내서 여러분들이

 

트레이딩에 활용할 모델의 데이터를 편하게 이해할 수 있도록 고민해 볼 예정입니다. 

 

 

오늘도 제 포스트를 읽고/시청해 주셔서 감사합니다. 

 

앞으로도 좋은 데이터와 인사이트로 여러분들의 투자와 트레이딩에 도움이 되었으면 좋겠습니다. 

 

감사합니다.