brunch

You can make anything
by writing

C.S.Lewis

by 한상훈 Jan 06. 2021

가상화폐 트레이딩 봇 만들기

Node.js와 업비트 API를 이용한 트레이딩 봇 제작 방법

요즘 가상화폐가 점점 뜨거워지고 있습니다. 2018년도의 비트코인값이 무색할 정도로 살벌하게 올라가 이제는 5천만원을 넘보고 있습니다. 이번 글에선 가상화폐 트레이딩 봇을 만드는 순서를 소개하고, 제작에 필요한 몇가지 지식을 전해드리고자 합니다.



Node.js와 기본적인 HTTP 통신을 사용할 수 있는 개발자라면 가상화폐 자동 매매 봇을 만드는 것은 전혀 어렵지 않습니다. 이번 글에선 Node.js를 사용해 가상화폐 트레이드봇을 만드는 방법을 간단히 소개하고자 합니다. 다만 이 글에선 Node.js의 설치 및 기본적인 사용법 등에 대해서는 전혀 다루지 않습니다.


1. 거래소 API 

가상화폐를 직접 개인간 거래하지 않기 때문에 거래소 API를 활용해 거래소와 통신하고, 거래소에서 제공하는 정보를 바탕으로 트레이딩을 진행합니다. 제가 예제에 사용한 거래소는 업비트(https://upbit.com)입니다. 다른 가상화폐 거래소도 API를 제공하기 때문에 아래의 예제를 통해 메커니즘을 익히시면 다른 거래소에서도 유사한 패턴으로 제작하실 수 있습니다.


2. 엑세스키

API에서 개인의 정보가 통신에 사용되어야 하는 경우 엑세스 키를 사용합니다. 업비트의 API에서도 기능을 사용하기 위해선 먼저 엑세스 키를 발급받으셔야 합니다.(링크)

https://upbit.com/service_center/open_api_guide

Open API 사용하기를 누르면 아래와 같은 화면이 나타납니다.

필요한 기능을 체크하고, 특정IP에서만 실행에 현재 컴퓨터의 아이피를 넣어줍니다. 아이피는 여기에서 확인하시면 됩니다. 아이피를 넣는 이유는 보안을 이유로 넣어주며 주문과 관련된 기능을 사용할 때 필수로 입력해야 합니다.


Open API Key 발급받기 버튼을 누르시면 엑세스키와 시크릿키가 있는 창이 뜨게 됩니다. 이 중에서 엑세스키는 나중에 다시 복사할 수 있지만 시크릿키는 이후 어떠한 방법으로도 다시 볼 수 없으니 안전한 곳에 보관하세요.(시크릿키를 잃어버린다면 Open API Key를 다시 발급받아야만 사용할 수 있습니다)


3. 계좌 정보 불러오기

키를 정상적으로 발급받았다면 API를 활용해 업비트 거래소와 통신이 이뤄지는지 간단히 확인해봅니다. API 문서 페이지에 들어가 자신의 계좌 정보를 불러오는 연습을 해봅니다.

https://docs.upbit.com/reference#전체-계좌-조회

업비트의 개발자 문서에 보면 쉽게 사용할 수 있도록 예제를 구성해두었습니다. 그럼 이 코드를 사용해보겠습니다. 아래의 코드를 터미널을 통해 입력하세요.


$ mkdir tradingbot

$ cd tradingbot

$ npm init -y


이렇게 하면 기본적인 노드 환경이 준비됩니다.

필요한 모듈을 설치합니다.


$ npm install request jsonwebtoken


이제 실행을 위한 파일을 만들어봅니다.


$ touch index.js


생성된 index.js 파일에 개발자 문서에 있는 코드를 그대로 복사해 가져옵니다.

이제 실행해봅니다.


$ node index.js


작동이 되지 않습니다. 개발자라면 다 아시겠지만 변수 access_key, secret_key, server_url이 설정되어있지 않습니다. access_key에는 앞서 준비한 엑세스키, secret_key에는 시크릿키, 그리고 server_url에는 

"https://api.upbit.com"을 넣어줍니다.


다시 실행합니다.


$ node index.js


현재 계좌 정보가 출력됩니다.



4. 매수 매도 테스트

매수와 매도는 어렵지 않습니다. 마찬가지로 개발자 문서에서 코드를 복사해 사용합니다. 

https://docs.upbit.com/reference#주문하기

앞선 코드와 마찬가지로 엑세스키, 시크릿키, 서버 URL 부분을 수정해줍니다.

코드가 길어서 복잡해 보일 수 있는데 실제로 수정할 부분은 const body = {} 부분입니다. 백엔드 개발을 해보신 분들은 아시겠지만 나머지 부분은 데이터를 암호화하는 부분과 HTTP 통신에 사용되는 부분입니다. 따로 수정할 필요가 없습니다.


const body = {} 부분에는 어떤 코인을 살지, 얼마에 살지, 양은 얼마인지 정할 수 있습니다. 각각의 내용은 개발자 문서에 잘 설명돼 있습니다.

바디 파라미터에서 어려운 부분은 딱히 없지만 문서에 제대로 설명되어 있지 않은 부분을 몇 개만 설명 드리고자 합니다. 첫번째로 market 파라미터 목록입니다. 먼저 마켓이 무엇이 있는지 찾아야 합니다. 개발자 문서에서 마켓 코드 조회를 먼저 실행하고, 해당 결과물을 따로 저장해둡시다.

https://docs.upbit.com/reference#시세-종목-조회

제 경우엔 json 파일로 저장해서 다음과 같이 보관하고 있습니다.

이제 마켓 이름은 알았는데 마켓 종류가 많습니다. 업비트에서는 동일한 코인이라도 여러 마켓이 있습니다. 비트코인을 거래할 때 KRW-BTC, USDT-BTC 라는 두 개의 마켓으로 거래합니다. 사용하는 통화에 따라 달라집니다. KRW이 앞에 오는 마켓은 한국 원화를 바탕으로 거래합니다. 거래 방식에는 KRW, BTC, USDT가 있는데 각각의 거래 수수료가 다르므로 해당 내용을 고려해 알고리즘을 제작하셔야 합니다.


두번째로 volume 파라미터입니다. volume은 경우에 따라서 사용되지 않는 매개변수입니다. 가령 시장가 매수 거래를 할 때 volume값은 전달할 필요 없이 price에 자신이 거래하고자 하는 금액을 넣으면 거래가 진행됩니다. 


세번째로 price 파라미터입니다. price도 volume처럼 사용되지 않는 경우가 있습니다. 가령 시장가 매도 거래를 할 때 price는 필요가 없으며 volume값에 매도할 물량만 입력합니다.


매수, 매도 요청은 실제 돈이 움직이기 때문에 적은 금액을 넣어 테스트를 해보시길 추천드립니다. 조금만 해봐도 어떤 매커니즘으로 작동하는지 알 수 있습니다.


5. 차트 불러오기

단순 매수, 매도만 해서는 거래에 불과합니다. 시장 데이터를 가져오는 방법을 알아봅시다.

업비트에서는 QUOTATION API로 시세 캔들 조회, 종목 조회 등을 제공합니다. 앞선 예와 동일하게 코드를 복사해서 사용하시면 작동이 되지 않을겁니다.


이건 업비트 개발자 문서의 오류인데, 위의 스크린샷에서 보시는 것처럼 기존의 예시와는 다르게 통신에 node-fetch 모듈을 사용합니다. 이 모듈의 스팩을 살펴보시면 options 매개변수에는 qs를 받지 않습니다. qs는 쿼리스트링을 줄여서 표현할 때 흔히 사용하는데, node-fetch 모듈에는 qs를 받지 않으며 따라서 작동도 하지 않습니다.


그럼 어떻게 해야할까요?


방법은 많습니다. 쿼리스트링을 URL에 포함해서 보내거나, 쿼리스트링을 변환해주는 모듈을 사용하면 됩니다. 백엔드 개발자라면 직접 URL에 넣기보다는 변환 모듈을 사용하시는게 편하실 겁니다. 저는 query-string 모듈을 설치해서 변환해주었습니다.


6. 백테스트 만들기

여기까지 들어오셨다면 기초 준비는 마무리됐습니다. 내 계좌 정보를 가져왔고, 거래를 할 수 있으며, 시장 데이터도 얻을 수 있습니다. 그럼 이제 거래를 진행하면 될까요? 현명한 사람이라면 바로 알고리즘을 만들어 거래를 진행하기 보단 백테스트를 통해 어느정도 검증을 진행해볼 것입니다.


백테스트를 하기 위해선 먼저 시장 데이터를 확보해야 합니다. 앞선 차트 예시에서 변수를 조금 수정해 데이터 세트를 확보할 수 있습니다. 데이터 세트는 배열 형태로 출력될 것입니다. 배열을 돌면서 그 안에 코드를 넣어 자신의 알고리즘을 평가합니다.


제 경우엔 간단한 백테스트 연습으로 BTC의 시간당 캔들 차트를 가져온 후 모멘텀을 분석했습니다. 양봉인 경우와 음봉인 경우를 분리해 양봉일 때는 추가 매수, 음봉일 때는 일정 매도를 반복하는 패턴을 적용합니다. 그리고 과거 시점부터 루프로 돌려서 총 자본의 변화를 결과로 출력합니다.


7. 완성

트레이딩봇을 만드는 것 자체는 간단한 백엔드 지식과 주식시장에 대한 이해만 있으면 가능합니다. 이 글만 해도 Node.js를 공부한 개발자 어떤 개발자라도 며칠이면 만들 수 있는 수준의 쉬운 난이도입니다. 굳이 Node.js가 아니더라도 거래소에서 제공하는 API 형태가 자신이 쓰는 형태와 일치시키면 가능합니다. 업비트의 경우 Ruby, Javascript, Python을 제공하고 있으니 다른 언어를 사용해 진행하셔도 됩니다. 

완성된 트레이딩 결과물. 일정 시간마다 시장 상황을 파악해 매매한다.

트레이딩 봇을 만들 때 아셔야 할 점은 가능한 것가능하지 않은 것을 분리해야 합니다. 이 글에서는 간단하게 시세 차트 정보를 가져오고, 거래를 하는 것을 API 선에서 해결했습니다. 하지만 API가 만능은 아닙니다. 예를 들어 초단타 자동 매매와 같은 것은 위의 방법으는 어렵습니다.

요청 수 제한 항목

물론 능력있는 해커분들이야 여러 방법으로 이를 우회해 제작도 가능하시겠지만 주식만 하시던 분이 좋은 알고리즘이 있다고 바로 만들어 시장에 뛰어들기엔 스팩이 부족할 수 있습니다.


8. 업그레이드

트레이딩봇은 만드는 방법 자체는 간단하지만 알고리즘을 넣는 것부터가 시작입니다. 어떤 기준으로 매매를 하느냐가 훨씬 더 복잡하고, 전세계의 퀀트들과 트레이더들이 고민하는 부분입니다. 이에 대해 한국에서 퀀트로 유명한 권용진님의 네이버 D2 강연(https://www.youtube.com/watch?v=_3nWYUtameM)을 보면 이런 부분이 나옵니다.


"어떤 사람은 트럼프 트위터에 따라서 매매를 한다."


개발자 입장에서 보면 가상화폐 시장의 매매 기준을 꼭 시장 안에서 발생하는 데이터로 한정할 필요는 없습니다. 그렇기 때문에 크롤링을 활용해 원하는 정보를 외부에서 가져와 매매에 활용하거나 이를 자신만의 알고리즘으로 만들어 수익을 창출해봐도 좋을 것 같습니다.





전문적인 트레이딩 봇 제작을 원하시면 제가 운영하고 있는 플렉스웹에서 솔루션을 제공하고 있습니다.

트레이딩 봇 또는 시장 리스너 제작에 관심이 있으시면 홈페이지 또는 이메일(contact@flexweb.io)로 연락 주세요. 어떠한 형태, 기능으로던 제작이 가능합니다. :) 

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari