for Study & Insight

STAG 프로젝트의 개요

|

개요

다음은 본인이 기획한 인공신경망 기반의 강화학습 알고리즘을 이용한 자동투자기인 STAG의 개발기록을 담는 첫번째 기록이다.

이 개인 프로그램 개발이 앞서 개발한 프로젝트와 유사하게 실패로 끝날 수도 있지만, 경험치를 쌓기 위해선 끊임없는 도전과 실패에 대한 자기 수복이 앞서야 한다는 사실을 깨달았으며, 개인블로그에 다음과 같은 기록을 남기는데 큰 의의를 둔다.

Cryptonaltics

본인은 이 STAG 프로젝트를 기획하기 전의 인공지능 자동 투자기인 Cryptonalytics를 2개월 18일간 개발을 했던 경험이 있었다.

당시 대학수학능력시험을 다시 봐야한다는 부담감과 4월달의 빅스텝으로 인한 코인 시장의 대규모 변동이 겹쳐지는 상황에서 프로젝트를 기획했는데 인공신경망을 활용한 당시의 설계했던 모델이 실제 포지션예측을 하는데까지엔 이르렀으나,

포지션 종결을 언제 지을지, 또 얼마 만큼의 보상을 할지에 대한 마르코브 연쇄모델을 설계하는데 어려움에 봉착하여 해당 프로젝트를 반 정도에서 그만두게 되었다.

이번 프로젝트인 STAG에선 보상에 대한 Markov-Chain을 직접적인 트레이딩 경험을 통해 결정하는데 성공했고, 목표 기한도 2022년 말까지로 지정하여(11월 16일일날 대학수학능력시험이 있기 때문에 이런 결정을 내렸다.) 인공지능 트레이딩 시스템 구축에 목표를 두기로 하고 이 글을 작성한다.

코드적인 실패의 이유들

핑계없는 무덤이 없다는 관용표현이 어울리게도, 프로그래머에게 있어서 실패를 경험하는 일은 단순히 업무가 바빠서, 개발기간이 촉박해서 와 같은 핑계로 자신의 프로젝트의 실패를 감싸는 행위는 자기발전을 저해하는 나쁜 행위이다.

이전 프로젝트가 실패하고, 본인은 이 프로젝트가 왜 실패했는지에 대해서 지난 2개월간 고민을 하고 이번 프로젝트에서 이를 개선해 더 업그레이드 된 버전의 프로젝트를 만들기로 마음먹었다.

프로젝트 기획에 앞서 이전 프로젝트의 실패 원인을 담은 분석을 한 뒤에 프로그래머들의 바이블과도 같다는 클린코드 를 접하고 나의 코드에 대한 태도들을 정리하고 아래와 같은 실패의 이유 크게 두가지를 적었다.

개발하는 프로젝트의 메커니즘도 파악하지 않은 채 상향식 설계를 했다.

차트만을 이용한 투자를 위해 본인은 유명한 투자자의 투자 철학이나 블로거나 유튜버 등지의 자료를 모아 이를 코드화 하고 실험을 하려 했다.

차트 분석으로 돈좀 벌었다는 사람들이 소개를 하는 여러 인터넷 자료들을 접하면, 기술적 분석이라든지, 상한가 따라잡기 이런 중구난방한 투자 기술들이 수록되어 있는 모습을 볼 수 있다.

해당 자료중 효용성이 있다는 것들을 모두 간추려 조사하고 한 프로젝트안에 녹여내는데 공을 들이느라 라이브러리처럼 상향식 설계 후 개발을 해야겠다고 느꼈고 다음과 같은 판단은 이내 곧 재앙으로 찾아왔다.

볼린저 밴드, 이동평균선, 상대강도지수라 불리는 세가지의 지표들과 Meta Research에서 제공하는 NeuralProphet과 같은 여러 자료들을 적용한 모델을 개발을 하면서 일일이 실험하는 작업을 하니 실험하는 모델의 파이썬 파일의 갯수도 치명적으로 늘어났고 불러오는 모듈의 상속이나 코드의 파일의 경로 같은게 모두 엉키기 시작했다.

이런 노가다 끝에 다음 목차인 알고리즘에 대해 실패한 이유를 말하면서 다음과 같은 지표가 무의미하단 사실을 입증할 수 있었지만 위의 목적에 맞게 코드적인 이유를 서술하자면, 결국 어떤 목표를 가진 프로그램은 기본적인 구성이 하향식 설계다.

상향식 설계로 다양한 코드들을 적용하고 실험하는 과정은 별도의 연구 프로젝트를 두어서 상향식 설계안에서 여러 파일을 두고 실험하거나 테스트 코드 처리를 해 여러 코드들로 테스트 주도 개발을 진행해야했던 것이다.

결국 기꺼이 만들어냈던 GUI의 초기설계와 완전히 다른 결과물이 나와 GUI 코드들을 모두 버려야했던 안타까운 결과를 맞이 했었다.

테스트 주도 개발(TDD)를 하지 않았다.

본인이 다시보는 대학수학능력시험 공부를 준비하느라 테스트 과정을 생략해야겠다고 생각하고 개발을 진행했으나 이것은 큰 오산이었다.

애초에 프로젝트의 목표와 개발과정이 R&D의 형태를 띄어야지만 프로젝트 성과가 나오는 구조였는데, 연구과정을 개발과정의 코드에 그대로 접목시키니 말그대로 N가지의 방식을 연구하면 N가지 이상의 코드가 나오게 되는 구조 였고, 이를 일일이 코드를 갈아업고 다시 코드를 쓰는 과정을 거치니 시간이 2배 이상이 걸리게 되었다.

단순히 연구과정의 파일들을 모두 테스트 파일 안에서 처리하거나 연구용 Repo를 별도로써 연구작업에만 몰두했다면 2주일이면 충분히 연구를 끝내고 1달에 개발을 완수하지 않았으까 생각이 된다.

이외에도 ‘클린코드’란 도서를 읽으면서 본인이 코드내에 직접적으로 저지른 실수들이 넘쳐나나, 그런 디테일을 일일이 적는 것은 이 글의 주제에서 과하게 벗어나기 때문에 생략한다.

알고리즘적인 사유

알고리즘적인 사유에서 내가 서술할 것은 내가 실험과정을 거치면서 얻게된 투자 기법에 대한 사실이나 메커니즘을 적을 것이다.

프로그래머로서의 실수가 아니기에 직접적인 투자를 하는 투자자들한테도 좋은 영감이 되지 않을까 싶다.

지표는 어디까지나 직접적으로 투자 상품의 하락과 상승을 반영하지 않는다.

이내 결국 직접적인 투자경험과 딥러닝 모델의 테스트를 수행하면서 다음과 같은 지표나 예측 자료들은 모두 직접적인 연관도를 갖지 않는다는 사실을 이내 알게 되었다.

본인은 실제 블로그 포스트나 인터넷 강의를 올리는 사람들이 지표를 활용해 기술적 투자를 하는 사람들이 꽤 있다는 사실을 안다.

하지만 본인이 딥러닝의 분야중 강화학습 기법, 또는 CNN의 Classfication을 통한 상승-하락 예측 모델들은 어떤 성능의 CNN모델이나 Transformer를 적용하더라도 49.5 ~ 49.9%의 적중률을 보여주었다.

한마디로 오르거나 내리거나 반반이니까 그냥 재비뽑기한 셈이다.

귀납적인 사유로는 납득을 못할수도 있으니까(니가 모델을 못짜서 그렇겠지)

연역적인 사유를 들어서 대표적으로 이동평균선을 활용한 골든 크로스와 데드크로스 기법을 이야기해보자.

(사진 자료 첨부 필요)

위의 사진과 같은 지표의 매매법은 간단한 사고실험만으로도 엿장수 마음대로라는 사실을 알 수 있다.

예시를 들어서 저 이동평균선의 기한이 짧은 이평선이 7 기한이 긴 이평선이 21의 계수로 이어져 있다고 가정하자.

(사진 자료 첨부 필요 2)

그럴 경우의 이동평균선이 위의 사진과 같은 골든크로스를 가진다 했을 때 오른다쳐도 그래프가 뭉게지면서 다시금 데드크로스로 이렇게 바뀌는 차트가 나오기도 한다!

이런식으로 차트가 바뀐다면 지표 세팅을 (7,21)이 아니라 (5,15) 이렇게 더 좁게 세팅했어야하지 않은가?

만약 반대로 차트가 늘어진다면 또 지표를 늘려서 봐야하지 않는가? 그럼 어떤 상황에는 그래프에 일치하고 어떤 상황에는 그래프와 다르다는 사실을 금세 알아차릴것이다.

이는 결국 기술적 지표가 매수 매도 원리에 직접적인 판단 수단이 결코 될 수 없다는 의미이다.

결국 아무리 이러한 지표 기법을 잘 활용하는 사람이더라도 어디까지나 보조적인 수단에 해당하지 실질적인 가격의 상승과 하락을 예견하는 절대적인 요소가 아니다.

주기성을 이용한 예측은 무의미하다.

본인이 주기성 가설을 듣고 Meta Research 사에서 나온 Neural Prophet 모듈을 적용하려 했을때 이 논문은 당당하게 가상화폐의 주기성에 대해서 논하였다. (영어 울렁증이 심한 독자를 위해 한국어 논문으로 가져왔다.)

https://koreascience.kr/article/JAKO201817971494912.pdf

위 내용은 가상화폐의 상승-하락의 주기성이나 패턴이 존재하는가를 조사한 논문이다.

논문에선 비트코인이란 상품의 주기성 패턴이 존재하지 않는다고 언급하고 있다.

그외에도 다른 논문들의 내용을 요약하자면 주식과 가상화폐을 포함한 대부분의 투자 상품에 오르고 내리는 주기란 있을 수 없으며, 차트 데이터 외에 다른 악재나 호재의 요소들을 분석해야만 예측이 가능한 것이다.

예측할 수 없다면 고수들은 어떻게 버는 건데?

차트만 보고 실제 고수익을 올리는 고수들의 투자법을 요약하자면 극심한 변덕쟁이이다.

오른다는것도 몇번보다 내린다 생각해 공매도(숏)를 올리고, 내린다 생각하는것도 반등이 오는 것을 포착하여 매수를 해 수익을 올리고 유유히 수익을 들고 나온다.

말그대로 오르고 내리고를 수천번의 트레이딩을 거쳐 떨어질지 내릴지에 대한 눈치싸움의 고수가 된 것이다.

근데 그걸 지표와 같은 보조적인 수단을 통해서나 어떤 방식으로든 컨디션을 유지하고 있는 상황인 것이다.

그렇기에 어떤 투자 이론과 방법을 사용하더라도 누군가는 수익을 올리고 누군가는 손실을 겪는다.

본인이 기획하고 있는 프로젝트의 뜻이 투기꾼(Stagger)의 의미를 갖고 있는 것도 강화학습으로 이런 눈치싸움을 시키는데서 아이디어를 착안했으며, 언제든지 눈치싸움에 패배해 손실을 겪을 수 있는걸 전제하기 때문에 이런 프로그램을 만들고 누구나 퍼갈 수 있게 오픈 소스로 개발하는 것이다.

끝말 (소감& 개발에 앞서)

본인도 가상화폐 투자 실험을 하면서 20만원정도의 손실을 겪었으나, 달리 생각하면 남들은 적게는 몇백, 많게는 천에서 억까지 잃는 투자의 중요한 사실들을 드라마틱한 손실없이 이해했기에 어쩌면 본인의 자산관리를 하는데 있어 중요한 교훈을 많이 남긴거 같다. 이 프로젝트도 높은 점수를 기록한다고 절대로 많은 금액을 넣지도 않을 것이며, 하나의 개발 경험(커리어)으로 남기는데 의의를 둘 것이다.

Comments