딥러닝 트레이딩 시스템을 위한 설계

 

딥러닝 혹은 기계학습으로 트레이딩 시스템을 만드는 방법은 무한히 많지만, 실제로 희망하는 수준으로 끌어올릴 가능성은 지극히 적다. 도전해본 사람들의 99.99%는 실패로 이어지고 있을 것이고, 그나마도 룰 베이스드 시스템의 수익성을 뛰어넘기는 상당히 어렵다. 그중 대다수는 방향을 잘못 결정해서, 설계를 잘못해서가 아닐까 한다. 좋은 설계가 이뤄지면 머지않은 미래에 이런 시스템들의 수는 늘어날 것이다.

필자는 트레이더로 일하면서 시장에서 여러 종류의 ‘기계'(알고리즘)를 봐왔는데, 정말 우수한 알고리즘과 운용역의 조합을 간접적으로 확인하며 언젠간 저런 방대한 시스템을 만들겠다며 고민을 해왔었다. 그러나 기존의 룰베이스드 시스템으로는 혹은 최적화 기법으로는 시간이 너무 많이 걸리는 영역들이 있었는데, 정확히 이런 부분들을 딥러닝으로 대체하면 되지 않을까 하는 생각을 했다. 굳이 필자의 회사인 두물머리에도 매우 우수한 데이터 사이언스 팀과 인공지능팀이 있음에도 이런 시스템을 설계하지 않는 이유는, 정작 대중에겐 큰 도움이 안될 것 같아서이다. 그래서 현업 동료들 및 후배들을 위해 설계 아이디어를 조금이나마 던져 보고자 한다.

일단 금융 데이터의 성격에 대한 아주 정확한 이해가 필요하다. 대부분은 이 데이터의 input에서부터 설계가 잘못되어 있다. 또한, 일반적인 엔지니어들이 금융 데이터에서의 Y값을 설정하는 것 자체가 거의 불가능하다. 트레이딩의 단위에 대한 이해와 설계가 필요하다. 또한, 시장 구조를 흉내 낸 가상시장을 만들어 강화학습을 일으키는 방법론에 대한 견해를 이야기해보겠다. 모두가 트레이더의 정신세계를 역설계 (reverse engineer) 하는 과정이라고 생각하면 될 것이다.

 

 CNN 의 구조를 생각하며 금융 데이터에 대한 접근하자.

 

금융 데이터는 엄청나게 많다. 가격 정보만 가지고도 하루에 몇 기가의 데이터가 국내시장에서 생성되고 있으니. 그러나 이 금융 데이터를 어떻게 정리하고 인지할 것인가는 거의 풀리지 않은 문제다.

이 데이터들은 사실 그림으로 치면 픽셀에 가깝다. 픽셀 데이터를 아무리 많이 분석해도 의미 있는 패턴을 발견하긴 쉽지 않다. 우선 이 패턴들이 어떠한 그림을 구성하고 있는지 구성요소를 생각해봐야 그 구성요소를 나눠서 무언가 훈련을 시키든 최적화를 시키든 할 수 있다. 그런데 이 패턴들이 실제 어떻게 구성되는지를 경험해보지 않은 사람은 상상하기 힘들다. 매트릭스의 세계 속 숫자들처럼, 우리 눈에는 그저 노이즈로 보일 수 있다.

트레이더를 하면서 이런 패턴들을 ‘매직아이’ 같다고 표현해왔다. 몇 년간 잘 들여다보면 눈에 익어서 패턴들이 보이기 시작하는데, 우리의 시신경이 일반적으로 발달해온 방향과 너무 다른 패턴들이어서 어지간한 트레이더의 눈도 자연스럽게 이 패턴들을 인식하기가 쉽지 않다. 독일어 방송을 하루 종일 몇 년간 듣다 보면 억양이랑 문장 구조나 많이 쓰는 표현들이 들려오기 시작하겠지만, 최소한의 문법과 단어들을 알지 못하면 영영 의미에 대한 해석이 되지 않을 것이다. 트레이더들은 이러한 문법을 배우며 전체 언어의 패턴을 배우는 사람들이다.

일반적인 CNN (Convolutional Neural Network)에서 한 장의 사진을 여러 차원으로 분해하는 과정이 있다. 간단하게는 RGB (red, green, blue) 농도로 분해하여 석 장의 그림을 추출하였다고 해보자. 100X100 픽셀의 그림에서 이제 5,5 에 있는 픽셀은 주변부에 있는 픽셀들과의 상관관계도 중요하지만 다른 그림들의 비슷한 위치에 있는 픽셀들과의 관계도 중요해진다. 예를 들어 RGB 값이 5,5 위치에서 각각 10, 20, 30이라고 해보자. 그렇다면 그 조합의 색 자체가 가질 수 있는 특정한 의미가 있을 수도 없을 수도 있다. 그런 조합의 색들이 주변부와 어우러지는 이면에 있는 소규모의 패턴, 중규모의 패턴, 대규모의 패턴들의 엮임 (entanglement)에 대한 모종의 인사이트를 추출하는 과정이 Deep Neural Network 라고 할 수 있다.

금융에서도 마찬가지로 접근해야 숙제가 풀린다.

예를 들어 모 종목이 10:00:00 시에 120주 매도호가에 거래됐다가, 0.002 초 후에 10주 또 매도호가에 거래됐다가 0.009 초 후에 매도호가가 사라지며 같은 매수호가에 130주 주문이 들어왔다고 해보자. 여기서 시간과 거래량과, 호가와 전체 시장과의 관계와 그리고 이들이 서로 간에 얽혀 있는 entanglement에서 픽셀 단위를 규정해야 할 것이다. 또한, 이 위에 장중 누적 거래량이나 가격 변동성, 매매 주체, 선물 및 옵션 매매 정보 등을 포함하여 2차 가공 데이터까지 합쳐지면 한도 끝도 없이 많은 데이터가 한 픽셀에 누적될 수 있다.

이들이 서로 길고 짧은 수많은 잠재 패턴으로 엮여 있을 것이다. 그것을 풀어내는 것이 문제다.

이런 것을 기존의 통계적 방법으로 분석하자면 너무 복잡해진다. 그래서 간단한 가공지표를 활용해 압축하곤 했었는데 결과적으로 모든 데이터를 활용하지 못하는 아쉬움이 있었다. 패턴은 그 안에 숨겨져 있는데 말이다.

 

  거래 단위

 

데이터를 만지면서 백테스트할 때는 ‘거래 단위’의 개념을 명심해야 한다. 거래 단위란 진입과 청산을 이루고 있는 하나의 거래다. 거래가 가능한 진입과 그의 함수로 나오는 청산. 청산은 최소한 binary 한 확률을 가지고 있다. 수익 청산만이 아니라 손절매 청산의 세트가 있어야 한다는 것이다. 복잡해지면 수익 청산과 손절매 청산의 경우의 수가 꽤 많아질 수도 있다. 이더리움이나 에스크로 서비스처럼, 거래가 이뤄지기 위해서는 특정한 조건들이 연루된다. 이런 거래 단위로 데이터를 분석하지 않으면 데이터가 너무 많아진다. 거래 단위로 분석이 가능하지 않은 데이터는 다 날려버리면 연산 속도도 증가한다. 낚시를 할 거면 내 낚싯대와 미끼를 가지고 물고기를 잡을 수 있을지 없을지만을 분석해야지, 자칫 강 전체의 데이터를 모두 수집해 분석하려 하면 의미 있는 답을 얻는데 시간이 너무 걸린다고 하면 맞는 비유일까?

 

  Agent

 

금융시장은 기본적으로 다양한 주체들의 싸움이다.

초단타 트레이더, 단타 트레이더, 스윙 트레이더, 대규모 장기 투자 자금, 차익거래 등이 서로 간의 의도를 완전히 이해하지 못한 채 자신의 먹거리를 찾아 헤매고 있다. 엄청나게 많은 스피커에서 다 자기 마음대로 노이즈가 흘러나와 주파수가 겹치기도 하고 밀리기도 하는 셈이다. 줄이 1억 개인 줄다리기랑 비슷하다고 생각해도 된다. 누가 어디로 어떻게 힘을 주고 있는지 가늠할 수가 없지만, 결국 어디선가 힘들이 합쳐져 이리저리 밀리고 당겨지는 준카오스적 상태다. 그래서 많은 이들은 시장이 아예 랜덤하다고 얘기한다. 그러나 그렇지 않다. MMORPG일 뿐이다. 이 각각의 주체를 Agent로 구현해야 한다.

이 Agent 들은 특정한 패턴을 포착하여 그것을 활용하여 돈을 벌고자 한다. 때로는 그 패턴들은 존재하지 않는 일시적인 허구의 패턴이기도 하기에 수많은 헛발질이 포착된다. 그런데 누군가 특정 패턴에 대한 믿음을 토대로 매매를 일으키면 그 매매 자체로 또 새로운 데이터가 생성된다. 그 매매로 인해 발생한 가격변동이나 호가 변동으로 인해 다른 Agent에게는 또 새로운 매매의 기회가 생길 수도 있다. 각각의 Agent 들의 의도를 정확히 다 이해할 필요는 없다. 현존하는 패턴이냐 아니냐, 수익화를 시도해볼 만 하냐 아니냐 만이 모든 Agent 들의 궁극적인 자문이다.

이러한 시장 상황을 시뮬레이션하려면 데이터를 무작위로 생성해 테스트하는 방법도 있지만, 가상의 시장 게임환경을 직접 만들어야 할 것 같다. 일단 다채로운 Agent 들을 만들어 일주일간 1,000억의 주문을 균등 배분해 매수하는 놈, 아무 생각 없이 샀다 팔았다 하는 놈, 이틀 동안 특정 종목을 갈아타는 놈 등 단순한 Agent 들로 시장과 비슷한 환경을 만들어둔다. 이후에 그 안에 주어진 기간구조 내에 (예: 0.5초 사이에만 매매하는 놈, 20초 사이에만 매매하는 놈 등) 트레이딩 기회를 포착하는 Agent 들을 만들어 풀어두면 가상의 시장에서의 강화학습이 시작된다. 알파고들끼리 싸우면서 서로 더 고수가 되어 가는 과정과 비슷하다. 이렇게 훈련된 Agent 들이 충분히 똑똑해질 때까지 양성해보면 어떨까. 시간이 얼마나 걸릴진 잘 모르겠다. 대신 아주 다양한 시장환경을 생성하여 무한히 훈련할 수 있다는 장점이 있다. 실제 데이터는 이만큼 많이 구하기가 어렵고, Agent 들의 시장 충격을 예측하기가 어렵다.

이 Agent 들을 다시 실제 시장에서 테스트하여 모종의 패턴인식과 거래를 시도해보면 될 것이다.

이런 방법론은 트레이더들의 실제 업무를 역설계한 것이다. 되는 패턴을 연구하여 매매로 연결해보고, 돈이 더 안 벌릴 때까지 계속 반복하는 것이다. 내가 시장에서 만난 기계들은 끝없이 패턴들을 찾아 최근 시장에 일정한 텀을 두고 적응하고 있었다. 때로는 그 패턴이 나의 매매이기도 했다. 호가가 얇은 시장에 내가 진입해서 돈을 벌기 시작하면 기계들이 일정 기간 나의 매매를 따라 하면서 내 수익을 오히려 추가시켜주다가, 어느 정도 지나면 내 매매를 잡아먹는 구체적인 방법을 만들어서 내 ‘거래 단위’를 침해했는데, 그 과정이 상당히 체계적이어서 잘 만들어둔 알고리즘 체계라는 확신이 들었다. 호가가 많은 시장 혹은 매매가 느린 시장에서도 이런 현상이 나타나지만, 상대적으로 실제 agent 들이 많아서 알고리즘이 덜 적극적이고 포착하기가 더 어렵다. 그러나 결국 웬만한 기법은 다 더 짧은 기간구조의 알고리즘의 도전을 받게 되어 있다. 나의 매매 자체가 하나의 새로운 기회를 열어주는 경우가 많아서.

 

모든 시장에서 돈을 잘 버는 알고리즘은 거의 없다. 거의 없지만 있다면 아마도 특정 시장에서 돈을 잘 버는 알고리즘들의 네트워크일 것이다. 잘하는 트레이딩 본부는 많은 수의 트레이더들을 데리고, 특정한 시장이 왔을 때 돈을 잘 버는 트레이더에게 자원을 몰아주는 방식을 사용한다. 비슷한 구조로 설계하는 것이 합리적일 것이다.

나는 위에 설명한 설계를 직접 개발해보지 않아 구체적인 문제들을 잘 모른다. 언젠가 해보고자 미뤄둔 일이고 내 개인적인 경험과 매매에서 깨달은 비밀들을 녹여낸 결론이었지만, 어차피 언젠가는 모두가 검토해볼만한 어찌보면 별 것도 아닌 이야기가 아닌가 싶다. 기회가 되면 더 구체적인 이야기도 풀어보겠다. 도움이 될런진 모르겠지만, 아이디어를 얻게 된다면 향후 성과 등도 공유해주고 추가 아이디어도 더해주면 감사하겠다.

딥러닝 트레이딩 시스템을 위한 설계”의 2개의 생각

  1. “이러한 시장 상황을 시뮬레이션하려면 데이터를 무작위로 생성해 테스트하는 방법도 있지만, 가상의 시장 게임환경을 직접 만들어야 할 것 같다. ”

    비슷한 사례로 하스스톤이라는 카드게임에 진화모델을 적용한 사례(적자생존 구조)가 있었던 것 같습니다.

    좋아요

댓글 남기기