바이낸스에서 김치코인 걸러내기
바이낸스에서 김치 코인 걸러내기
김치코인이란?
한국을 대표하는 음식인 김치에 코인이 합쳐진 단어로 한국에서 유동성이 가장 활발한 코인들을 뜻합니다. 루나처럼 한국에서 개발한 코인을 김치코인이라고 부르는 경우도 있는데 저의 경우에는 업비트나 빗썸과 같이 한국 거래소에서 가장 거래량이 많이 일어나는 코인으로 정의하겠습니다.
걸러내는 이유
저는 바이낸스 차트를 주로 이용합니다. 왜냐하면 시장 유동성이 전 세계에서 1등인 거래소이기 때문에 슬리피지(차트의 급격한 간격 변동)가 잘 일어나지 않고 모든 거래소의 통합된 거래량과 가장 가까운 값을 나타내기 때문입니다. 그런데 특정 거래소에서만 활발한 코인이 있다면 같은 종목인데도 불구하고 바이낸스 차트와 상당히 다른 모양을 나타내는 경우가 종종 발생하게 됩니다.
특히, 김치코인이면서 무기한 선물시장에도 상장된 코인이 있다면 상당한 시세의 괴리감을 보이게 됩니다. 최근 상승하였다가 하락한 스토리지 차트를 예로 확인하겠습니다.
상승하다가 하락할 시점에서 바이낸스 선물차트가 업비트의 원화 현물차트보다 1시간 먼저 하락하였습니다. 솔직히 이런 현상이 일어난 이유는 잘 모르지만, 제 추측으로는 업비트에 공매도 상품이 없어서 상승세를 보고 들어가면 물릴 수밖에 없는 구조로 차트가 주로 형성되기 때문에 이런 현상이 일어나는 것 같습니다. 하지만 다양한 상황들이 있기에 차트의 결과를 쉽게 예측할 수는 없다고 생각합니다.
단순하게 두 거래소를 넘어 다니며 크로스체킹을 할 만큼 제가 부지런한 것도 아니며, 두 거래소를 모두 확인한다 해도 방향을 예측할 수 없다고 판단하여 주로 이용하는 거래소 하나만이라도 건지자는 생각으로 업비트에서 가장 많은 거래량이 나오는 코인은 배제해 보는 글을 쓰게 되었습니다.
방법
먼저 업비트의 원화시장과 바이낸스의 spot USDT시장의 코인들을 비교할 것이며, 당연히 두 거래소 모두 상장된 코인만을 비교할 것입니다. 어느 거래소가 주도하고 있는지는 한 달간의 거래량을 기준으로 판단하려고 합니다.
티커목록 가져오기
티커목록 가져오는 방법은 업비트 API, 바이낸스 API docs에 나와있는 데로 코드 작성하였습니다.
import requests
import pandas as pd
import json
def upbit_tickers():
url = "https://api.upbit.com/v1/market/all?isDetails=false"
headers = {"accept": "application/json"}
res = requests.get(url, headers=headers)
value = res.json()
symbols = pd.DataFrame(value)['market']
tickers = []
for symbol in symbols:
if symbol.startswith('KRW'):
tickers.append(symbol)
upbit_tickers = [x.replace("KRW-", "") for x in tickers]
return upbit_tickers
def binance_tickers():
url = 'https://api.binance.com/api/v3/exchangeInfo'
res = requests.get(url)
data = json.loads(response.text)
symbols = data['symbols']
tickers = []
for symbol in symbols:
if symbol['quoteAsset'] == 'USDT':
tickers.append(symbol['symbol'])
binance_tickers = [x.replace("USDT", "") for x in tickers]
return binance_tickers
list = list(set(upbit_tickers()) & set(binance_tickers()))
업비트의 경우에는 티커를 "KRW-BTC"형식으로 나타내어졌고 바이낸스는 "BTCUSDT"형식으로 나타내어졌습니다. 이 둘의 교집합을 구해야 하므로 형식을 통일할 필요성이 있어서 "BTC"형식으로 만들어 주었습니다.
그 결과, 업비트와 바이낸스에 모두 상장된 코인이 88개로 티커리스트를 정의해 주었습니다.
전체 코드
import requests
import pandas as pd
import time
import json
def upbit_tickers():
url = "https://api.upbit.com/v1/market/all?isDetails=false"
headers = {"accept": "application/json"}
res = requests.get(url, headers=headers)
value = res.json()
symbols = pd.DataFrame(value)['market']
tickers = []
for symbol in symbols:
if symbol.startswith('KRW'):
tickers.append(symbol)
upbit_tickers = [x.replace("KRW-", "") for x in tickers]
return upbit_tickers
def binance_tickers():
url = 'https://api.binance.com/api/v3/exchangeInfo'
response = requests.get(url)
data = json.loads(response.text)
symbols = data['symbols']
tickers = []
for symbol in symbols:
if symbol['quoteAsset'] == 'USDT':
tickers.append(symbol['symbol'])
binance_tickers = [x.replace("USDT", "") for x in tickers]
return binance_tickers
list = list(set(upbit_tickers()) & set(binance_tickers()))
def upbit_kline(symbol):
url = "https://api.upbit.com/v1/candles/months?count=2"
headers = {"accept": "application/json"}
params = {
"market": symbol
}
res = requests.get(url, headers=headers, params=params)
json_data = res.json()
df = pd.DataFrame(json_data)
return df
def binance_kline(symbol):
url = "https://api.binance.com/api/v3/klines"
headers = {"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36"}
params = {
"symbol": symbol,
"interval": "1M"
}
res = requests.get(url, headers=headers, params=params)
value = res.json()
df = pd.DataFrame(value)
df.columns = ['time', 'opentime', 'high', 'low', 'close', 'volume', 'closetime', 'volumeUSDT', '8', '9', '10', '11']
return df
kimchi_list = []
last_timestamp = 1685577600000
#23년 6월 1일의 타임스탬프
for symbol in list:
upbit_symbol = "KRW-" + symbol
upbit_df = upbit_kline(upbit_symbol)
upbit_vol = float(upbit_df['candle_acc_trade_volume'].iloc[1])
upbit_time = int(upbit_df['timestamp'].iloc[1])
#업비트는 최근캔들의 정보가 위에서부터 나열됩니다.
binance_symbol = symbol + "USDT"
binance_df = binance_kline(binance_symbol)
binance_vol = float(binance_df['volume'].iloc[-2])
binance_time = int(binance_df['closetime'].iloc[-2])
#바이낸스는 최근캔들의 정보가 아래에서부터 나열됩니다.
time.sleep(1)
if upbit_vol > binance_vol and upbit_time > last_timestamp and binance_time > last_timestamp:
kimchi_list.append(symbol)
print(kimchi_list)
한 달짜리 캔들의 거래량을 비교하여 업비트가 바이낸스보다 많을 때 kimchi_list에 추가하도록 하였습니다. 덧붙여서 상장폐지된 코인도 있을 수 있기 때문에 timestamp가 최근 것으로 갱신이 되지 않았을 시 false가 되도록 조건식을 만들었습니다.
캔들 차트의 정보는 각 거래소의 API문서를 참고하면 됩니다.
업비트의 API 레퍼런스입니다. 거래량은 'candle_acc_trade_volume'에 해당하고 timestamp는 'timestamp'에 해당하는데 왜인지는 모르겠지만 캔들마감시간으로 하나만 넣어놨습니다.
바이낸스의 API docs입니다. 거래량은 'Volume', timestamp는 캔들 시작 시간인 'Kline open time'과 마감시간인 'Kline close time'이 있습니다. 업비트와 비교하기 위해서 'Kline close time'을 사용하였습니다.
결과
['ARDR', '1INCH', 'ZIL', 'STPT', 'XTZ', 'SNT', 'XEM', 'GLM', 'STX', 'NEO', 'MASK', 'PLA', 'GMT', 'STORJ', 'GAS', 'SUI', 'BCH', 'ONG', 'ANKR', 'TFUEL', 'KNC', 'SAND', 'T', 'ONT', 'EOS', 'MTL', 'ICX', 'QKC', 'POWR', 'SXP', 'ETC', 'MBL', 'CELO', 'SC', 'LOOM', 'HIFI', 'AAVE', 'STEEM', 'AERGO', 'CVC', 'QTUM', 'STMX', 'ZRX', 'KAVA', 'POLYX', 'HIVE', 'WAXP', 'WAVES', 'LSK', 'ELF', 'XEC', 'FLOW', 'JST', 'AXS', 'STRAX', 'PUNDIX']
총 56개의 김치코인 리스트를 얻을 수 있었습니다. 하나하나 보니 악명이 높은 코인들만 모아놓은 것 같네요. 이번 포스팅에서는 특정 코인들의 부정적인 견해가 있었지만 순전히 저의 개인적인 생각이므로 기술적인 부분만 잘 응용하시면 좋을 것 같습니다. 다들 성투하시길 바랍니다.