목 차
가상화폐 시가총액으로 매매대상을 선정 이유
1월 초 까지 구축을 완료로 목표로 현재 가상화폐 자동매매 프로그램을 짜고 있습니다. 기본적인 매매 코드는 짰고, 이제 남은 부분은 중간중간 문제가 생기면 텔레그램으로 알림을 주는 봇 을 구축해야하며, 서버에 올려서 구동을 시키는 것입니다.
저의 가상화폐 자동매매 코드의 알고리즘은 기본적으로 “래리 윌리엄스의 변동성 돌파전략”을 사용합니다. 해당 전략에 대한 아이디어는 유부장 조대표의 비트코인 자동매매 책에서 얻었으며, 코드 구성은 조코딩님의 유튜브를 참고했습니다. 물론 이 코드들은 2022년에 챗GPT가 없던시절에 짠건데, 지금은 챗GPT한테 이야기만 해주며 코드를 좌라락 뱉어주니까….허무하기도하고 세상좋아졌다는 생각도 들고 그렇습니다.
매수 대상인 가상화폐를 매수 하는 것이야 변동성돌파전략을 사용하는데, 과연 어떤 코인을 살까요? 비트코인, 이더리움, 솔라나 등 특정 코인을 정해놓고 매수를 할 수도 있지만 저는 상장된 모든 코인을 매매대상으로 삼고, 그 중에 조건을 만족하는 것을 추립니다. 그리고 추리는 조건에는 가상화폐 시가총액 을 변수로 넣습니다. 즉 가상화폐 시가총액이 얼마 이상인 것을 매매 대상으로 삼고자 합니다.
인터넷에서 어떤 블로거님께서는 변동성돌파전략은 망하기 딱좋은 전략이라면서 절대하면안된다고하는데, 코인은 변동성이 너무 커서 오전에 사서 오후에 바로 손절당하고 손절을 안하면 수십%의 하락이 나와서 돈을 크게 잃을 수 있다는 이야기인데, 이 이야기도 공감합니다.
저는 그런 올랐다 내렸다 와리가리에 당하는 일을 줄이고자 하루 언제든 매수한 다음에는 날짜가 바뀌면 12시가 넘자마자 all 매도하는 전략을 알고리즘에 태웠습니다만, 이것도 답은 아닌 것 같기는 합니다. 왜냐면 이런 경우 때문이지요.
얼마 전 2024년 크리스마스 당일, 유엑스코인이라는 코인이 기똥찬 움직임을 보였습니다. 낮 12시에는 5천원이었는데 밤 12시, 즉 24시가 되자 2천원대로 떨어졌습니다. 이런 경우에는 저의 변동성돌파전략으로 매수하고나서 폭망할 수 있습니다. 다만 매수 시점 자체를 5천원에 사지는않았을테니까 그렇게 큰 돈을 잃지는 않았을 수 있겠습니다.
이런 경우를 피하는 좋은 방법으로 가상화폐 시가총액을 하나의 기준으로 놓고, 가상화폐 시가총액이 얼마 이상인 코인만 거래대상으로 삼는 것입니다. 예를들면 2천억원 미만의 코인은 거래를 하지 않는다든지, 아니면 시가총액이 1500억원 미만인건 거래를 하지 않는다든지 하는 식입니다. 저 위의 유엑스코인같은 경우에는 약 1,300억원 수준으로, 가상화폐 시가총액 1,500억원을 기준으로 걸러냈으면 애초에 거래 대상으로 편입이 되지 않았을 것입니다.
이런식의 보조장치를 더해서 안전성을 확보한 후 변동성돌파전략을 사용하려는 것이 저의 목표입니다. 위에서 변동성돌파전략을 비판하신 블로거님은 상승각도와 하락각도를 계산해서 HFT(High Frequency Traiding)식으로 빠른 계산속도를 기반으로 매수매도를 하시는 것 같던데 저는 그런 지식과 코딩실력은 없으니 안타깝지만 어쩔수가 없습니다.
가상화폐 시가총액을 얻을 수 있는 사이트
저는 코드를 짜는 언어는 파이썬, 그리고 거래하는 거래소와 API는 빗썸 내지는 업비트를 쓸 예정입니다. 특히 국내 거래량 1위인 업비트를 사용하고자 하는데요, 업비트의 API에서는 가상화폐 시가총액을 제공하지 않았습니다. 알고보니 시가총액같은건, 우리나라 API가 아니라 미국 API같은데서 제공하는 것 같았는데요. 제가 챗GPT에게 물어봐서 조사한바는 이렇습니다.
- CoinMarketCap 웹사이트
CoinMarketCap은 가상화폐 시가총액을 확인할 수 있는 대표적인 웹사이트입니다. 이곳은 가사화폐 관련 각종 데이터를 얻을 수 있습니다. API도 운영합니다. 이 사이트에서는 다양한 암호화폐의 시가총액 정보를 쉽게 확인할 수 있습니다. 또 CoinMarketCap 뿐만아니라 CoinGecko같은 사이트도 있습니다. 여기서도 시총 정보를 얻을 수 있습니다. - 암호화폐 거래소 플랫폼
MEXC와 같은 암호화폐 거래소 플랫폼에서도 토큰의 기본 정보를 제공합니다. 예를 들어, MEXC의 현물 또는 선물 페이지의 ‘정보’ 항목에서 토큰의 유통 시가총액을 확인할 수 있습니다. - 직접계산 : 토큰당 가격 * 유통 공급량(발행량) 을 통해서 시가총액을 직접 계산할 수 있습니다. 업비트에서는 가격과 발행량이 제공되니까, 가격 x 발행량 을 통해서 시가총액을 계산하는 방법이 있습니다. 그러나 이 방법은 API호출 제한에 걸릴 수 있어서 그리 추천하는 방법은 아닙니다.
알고보니 네이버에 쳐서 시가총액을 확인할 수 있는 정보도 CoinMarketCap에서 가져오는 것 같아서, CoinMarketCap이나 Gecko 등 사이트를 통한 가상화폐 시가총액 정보 입수를 추진합니다.
CoinGecko API를 통한 가상화폐 시가총액 입수
결국 코드로 작업할것이기때문에, CoinMarketCap이나 CoinGecko에서 시가총액을 가져오기로 했을때 다음 이슈는 이것이었습니다.
- CoinMarketCap이나 CoinGecko에서도 제공하는 API가 있는가?
- 따로 그냥 public API인가 아니면 APi Key 발급이 필요한 건인가?
- 해당 사이트들에서 제공하는 시가총액이 KRW(원화)기준으로도 제공되는가?
API Key 발급 여부 : Coin Gecko만 필요없음!
CoinMarketCap에서는 API를 사용하기 위해서는 API Key가 필요합니다. 무료 계정으로도 기본적인 API 사용이 가능하지만, 사용량에 제한이 있다고 했습니다. 이건 좋지않지요. 자동매매를 돌리면서 꾸준히 계속 시가총액 정보를 가져와야 하니 말입니다.
반면 CoinGecko는 기본적인 API 사용은 API Key 없이도 가능하다고 했습니다. 더 높은 사용량과 추가 기능을 원한다면 유료 계정을 통해 API Key를 발급받을 수 있다고 했는데, 그정도까지는 필요없을 것 같아서 CoinGecko를 통해서 진행하기로 했습니다.
KRW(원화) 기준 시가총액 제공 여부
CoinMarketCap과 CoinGecko 모두 KRW를 포함한 다양한 통화로 시가총액 정보를 제공하고 있었습니다. API 호출 시 원하는 통화를 지정할 수 있으므로, KRW를 지정해주면 되는 것 같았습니다. 챗GPT가 말해주기를 CoinGecko의 경우 기본적인 사용에 API Key가 필요 없어 초기 테스트나 소규모 프로젝트에 더 접근성이 높을 수 있다고 하니, CoinGecko를 선택한 마음이 더욱 굳건해지는 기분이었습니다.
이런 정보들을 종합해본 결과 무료 API를 이용해서 따로 키 발급 없이 KRW(원화)표시의 가상화폐 시가총액을 얻어올 수 있는 CoinGecko에서 입수를 하기로 했습니다. 그리고 아래의 사항을 코드로 구현하기로 했습니다.
- 업비트에서 거래되는 모든 가상화폐를 대상으로
- 위 대상 가상화폐 시가총액 정보를 CoinGecko에서가져와서 데이터프레임으로 반환하고
- 위에 반환한 데이터프레임에서 시가총액 1천억원 이상만 남기고 삭제하고,
남은 것들을 시가총액 순으로 높은 순서로 정렬함
이 아이디어를 코드로 구현해서 가상화폐 시가총액 1000억원 이상의 코인들을 매매 대상으로 산정하기로 했습니다. 그리고 그런 코인들은 가상화폐 자동매매를 하기 위한 반복문 (while 또는 for문)의 대상으로 삼아야하니, 정리해서 리스트형태로 반환하도록 했습니다.
가상화폐 시가총액 얻어오는 파이썬 코드
import pandas as pd
from pyupbit import get_tickers
from pycoingecko import CoinGeckoAPI
import time
우선 필요한 라이브러리들을 임포트해줍니다. pyupbit와 CoingeckoAPI를 불러옵니다. pyupbit가 필요한 이유는 업비트에서 거래되는 모든 가상화폐들의 티커를 가져와야하기 때문입니다. 모든 가상화폐 시가총액을 불러와서 그 중 선별하는 작업이니까요.
# 1. 업비트에서 거래되는 모든 가상화폐 티커 가져오기
def get_high_market_cap_coins():
upbit_tickers = get_tickers(fiat="KRW")
# CoinGecko API 클라이언트 초기화
cg = CoinGeckoAPI()
# 결과를 저장할 리스트 초기화
market_cap_data = []
우선 업비트에서 가상화폐 티커들을 전부 가져옵니다. 2024년 12월말 기준으로는 153개 가상화폐가 업비트에서 거래되고 있습니다. 그렇게 불러온 티커를 대상으로 시가총액 정보를 가져오는 코드를 실행시킵니다.
# 2. CoinGecko에서 시가총액 정보 가져오기
for ticker in upbit_tickers:
coin_id = ticker.split('-')[1].lower()
try:
# 3. 원화 기준 시가총액 가져오기
coin_data = cg.get_coin_by_id(id=coin_id,
localization='false', tickers=False,
market_data=True, community_data=False,
developer_data=False, sparkline=False)
market_cap_krw = coin_data['market_data']['market_cap']['krw']
market_cap_data.append({'coin': coin_id, 'market_cap_krw': market_cap_krw})
time.sleep(1) # API 호출 제한 방지
except:
print(f"Failed to fetch data for {coin_id}")
티커들을 반복문에 넣어서 API에 접속해서 원화표시 시가총액을 가져옵니다. 각 반복문이 한번 실행될때마다 API를 너무 자주 호출하지 않도록 1초씩 쉬어줍니다. 1초를 쉬게되면 153개에 대해 전부 작업하는것만으로 약 2분 30초가 걸립니다.
그래서 저는 고민 끝에, 일단 모든 티커를 가져온다음에 시가총액부터 조사하는 것이 아니라, 상승률이나 이평선과 현재가의 관계 등 조건을 먼저 따지고 거기서 한번 추려낸 후에 남은 것들에 대해서만 시가총액을 조사하기로 했습니다. 그러면 전체 코드의 실행시간이 확 줄어듭니다.
# 데이터프레임 생성
df = pd.DataFrame(market_cap_data)
# 4. 시가총액 1천억원 이상의 가상화폐 선별 및 정렬
high_cap_coins = df[df['market_cap_krw'] >= 100000000000].sort_values('market_cap_krw', ascending=False)
# 리스트 형태로 반환
high_cap_coins['coin'].to_list()
이렇게 하면 시가총액이 1000억원 이상인 코인 리스트를 받을 수 있습니다. 다만 여기서 예외처리문을 넣은 이유는 일부 업비트 티커가 CoinGecko의 ID와 정확히 일치하지 않을 수 있기 때문입니다.
제가 변동성 및 이평선과의 관계를 통해 추리고 그 다음 시가총액 기준까지 적용해서 걸러내자, 매매대상으로 삼을 수 있는 코인은 near, eos, Blur, Ankr, Qtum으로 추려졌다. 그러나 가상화폐 시가총액을 얻어오는 CoinGecko API를 동작시키는 와중에, Failed to fetch data라는 메시지가 많이 떴습니다.
문제 : 시가총액을 못받아오는 코인이 많다
좀 당황스럽습니다. 21개를 대상으로 시가총액을 불러오려했는데 시가총액 정보가 없는 것이 무려 16개라니…어쩌면 시가총액 정보는 걸러야할지도 모르겠다는 생각이 들었습니다. 이렇게나 못받아오는 시총이 많다면 문제가 있습니다. 아마도 제가, 다른 코인도 아니고 이더리움의 시가총액을 못받아오는 걸 보고는 (저 코드를 실행시켰더니 이더리움 정보를 못받아왔습니다!) 이거 제대로 동작하는거야? 라고 의심을 가지게 된 것 같습니다.
이 것을 개선하기 위해서 제가 떠올린 몇가지 방안은 아래와 같습니다. 아마 개선을 위한 추가 포스팅을 하게 될 것 같은데요.
- CoinGecko가 아니라 CoinmarketCap에서 API를 발급받아서 정보를 받습니다.
- 지금은 한번씩만 호출하게 되어있는데, 실패할 경우 재차 호출하도록 코드를 수정합니다.
- 또는 업비트에서 그냥 받아온 가격 x 발행물량 을 통해서 시가총액을 계산해서 씁니다.
처음에 시총을 못불러와서 대상이 확 줄어들었을때는, 뭐 쨌든 잘됐다고 생각했습니다. 예전에 2022년 하반기 자동매매를 돌릴 시에는 하락장이었기때문에 거래대상으로 삼을 수 있는 코인이 몇개 없었습니다만
지금은 상승장이라서 똑같은 알고리즘에도 매수대상으로 20개넘게 떠서 그걸 걸러낼 것이 걱정인 상황이고, 그런 상황에서 시가총액을 못받아오는게 15개나 되니 알아서 걸러져서 좋네라고 생각했는데 그런식으로 거르는건 맞지 않는 방법 같습니다.
아무튼 저런 코드가 있으면, CoinGecko부분을 CionMarketCap으로 바꾸기만 하면 되는 것이니 일단 짠건 잘한 것 같습니다.