본문 바로가기

프로젝트/개인 프로젝트

암호화폐 트레이딩 봇 개발

 


배경


일론머스크가 비트코인에 영향을 끼친 후 며칠 뒤 내 친구들 사이에서도 비트코인(암호화폐 시장)이 유행이 되었다.

누구나 쉽게 시장에 접근할 수 있었고, 소액으로도 충분히 할 수 있기에 나도 가벼운 마음으로 시작하였다.

그런데 여기서 문제가 생겼다. 소액으로 시작한 금액이지만 실시간으로 얼마나 올랐는지 계속해서 지켜보게 된다. 취업 준비를 하던 나는 시간이 금같은데, 집중력이 저하되는 것이다.

나 대신 내 코인들을 관리해주었으면 싶었다. 내 기준에 매수타이밍인 시점에 매수하고, 내 기준에 매도 타이밍인 시점에 매도하고 싶었다. 내가 투자할 시간에 내 봇이 알아서 투자해주었으면 좋겠다는 마음으로 해당 프로젝트를 시작하게 되었다.

개발에는 문제가 없지만, 금융 지식에 관해서는 영 꽝이었다. 그렇기에 금융에 대해 잘 아는 사람들의 지식을 그대로 봇에게 알려주기로 하였다.

 


개발 초기 단계


 

이평선, RSI, BB 지표 등을 활용한 여러 전략이 있었는데, 전략들 중에 정답은 없었다. 다들 이구동성으로 말하는 것은 "보조 지표일 뿐"이었다. 지표는 지표일 뿐, 필승법은 아니었다. 그렇기에 흔히 알고있는 지표들을 파이썬으로 개발하고 나만의 전략을 만들어 검증을 할 필요가 있었다.

그렇기에 백테스트 도구를 먼저 개발하는걸 목표로 하였고, 요구사항을 정의할 필요가 있었다.

 

- 향 후 이 백테스트 도구는 쉽게 트레이딩 봇으로 바뀔 수 있어야 한다.

- 다수의 사용자가 한 인스턴스에서 관리될 수 있어야 한다.

- 프로그램은 지정된 시장을 조회한다.

- 여러 시장에 분산 투자를 할 수 있다.

- 향후 마틴게일 전략을 사용할 수 있다.

 

이렇게 여러 전략을 거치며 조금씩 어떤 전략으로 취해야할지 구도가 잡히기 시작하였다.(이 포스트에서는 전략에 대해서는 공유하지 않을 것입니다. 하지만, 제가 개발한 도구/코드는 향후 포스트하도록 하겠습니다.)

 


설계


 

 

생각 나는대로, 뒤죽박죽 정리하며 기획한 기획안. 이 기획안은 예전꺼라 지금은 다른 전략으로 투자한다.

좌측의 형상들을 모두 테스트 해보기 위하여 암호화폐 시장 트렌드 중 가장 유사한 일자를 기록하였다.

물론, 암호화폐의 시작부터 백테스트를 해보아도 좋지만, 내 봇은 1분 tick을 기준으로 투자하기에, 백테스트 또한 1분 단위로 설정해두었다. 만약 암호화폐의 시작부터 백테스트를 하려면, API 요청 제한이 10초에 8번이고 한 번에 받을 수 있는 데이터는 200 이다. 연산에 부하되는 시간을 제외한다 하더라도 API 요청 시간으로만 하루의 데이터를 모두 받으려면 0.7초이다. 가장 저렴한 클라우드 서버로 돌리고 있기에, 연산 시간이 특히 꽤나 많이 잡아먹기에, 테스트 케이스를 효율적으로 선별할 필요가 있었다.

 

백테스트를 거치며 전략을 추려내었고, 이제 실시간으로 매수 / 매도 / 조회를 하도록 개발을 하였다. 코드는 최대한 재사용하기 쉽도록 설계를 한 덕택에 빠르게 개발할 수 있었다.

 


타 트레이딩 봇과의 차별점 '오늘의 코인'


 

그리고 개발을 하다가 문득, 떠오른 아이디어가 떠올랐다.

며칠 사용해본 결과 암호화폐 시장은 당일에 한 종목의 거래량이 폭등하는 특징을 가진다. 예를 들면, 며칠 전에 '도진 코인'이라는 코인이 새롭게 상장하였고 '도진 코인'의 거래량은 어마무시하였다. 그리고 나머지 종목들은 거래량이 적어지는 현상을 본 적이 있었는데, 이게 꼭 새로운 코인이 상장할 때만 일어나는 것이 아닌, 하루에 한 종목에서 두 종목 꼴로 유저들이 몰린다.

 

그런데 이러한 황금장같은 코인을 캐치하지 못한다면 멍청할 것 같다는 생각이 들었다.

그래서 생각을 하였다. 실시간으로 모든 코인을 조회하진 않더라도, 5분에 한번씩, 아니면 500번에 한번씩 "오늘의 코인"을 추려내면 어떨까?

내 봇은 내가 사전에 지정한 코인종목 + "오늘의 코인"에 포커스를 맞춰보자는 아이디어였다. 이렇게 설계를 한다면 원래는 정적인 코인종목들이 동적이게 된다. 마치 OS Process의 context switching인 셈이다.

그리고 이 동적인 코인시장들을 효과적으로 다룰 수 있어야 했다. 몇가지 문제가 생겼다. 그 중 하나는 오늘의 코인이 바뀔 시점에 발생하는 일이다. 참고로, '오늘의 코인' 선정 기준은 당일 거래대금 * 변화율이 가장 큰 시장으로 잡았다.

 


효율성을 위한 문제 해결


 

 

내 봇은 [비트코인, 이더리움, 리플] 코인들만 조회를 한다. '오늘의 코인'은 '도지코인'이 되었다. 그렇다면 내 봇은 [비트코인, 이더리움, 리플, 도지코인]을 투자할 것이다. 

여기서 내 봇은 '도지코인'에  5만원에 매수한 상태이다. 이 상태에서 '오늘의 코인'이 '비트코인캐시'로 바뀐다면? 내 봇은 '도지코인'을 더 이상 투자 종목에 넣지 않을 것이고 매수만 한 상태에서 매도를 하지 않는 상황이 발생할 것이다. 이건 큰 문제다. 또 하나의 문제가 더 있다면 내 봇의 유저들은 모두 같은 투자종목을 가지게 된다. A는 도지코인에 투자를 한 상태고, B는 도지코인에 투자를 하지 않은 상태일 수도 있다는 것이다.

'오늘의 코인'을 교체하지 않고 투자 종목에 추가만 한다면 나중에는 시스템이 매우 느려질 것이기에 오늘의 코인 교체는 필수였다.

 

그렇게 이 문제를 해결하기 위한 새로운 구조를 착안해내었다.

 


마치며


 

 

이렇게 세 가지로 투자 코인장을 나누는 것이었다. 내 봇은 Origin + Old + Focus를 Target Markets로 지정할 것이다. 그렇지만, Old에 존재하는 코인장은 Short-Only이다. 매도만을 취급한다. 그리고 Focus(오늘의 코인)에는 더 많은 투자를 하도록 하였다. 이것은 오늘의 코인을 지정할 때에 새로운 구조가 동적으로 바뀌게 된다. Old는 친구들이 가지고 있는 코인들을 조회함으로써 갱신된다.

 

이렇게 하여, 내 트레이딩 봇 기적봇 ver0을 개발할 수 있었다.

향 후 템플릿으로 코드를 재작성하여 깃허브에 올리도록 하겠습니다 😆 

또한, 기적봇 전략을 개발하는 데에 사용되었던 지표 계산 코드 또한 추후 포스트를 통하여 올리도록 하겠습니다 !