파이썬/바이낸스 선물 API

[선물 API] 유통 공급량을 이용한 시총 계산

Eluv 2024. 1. 31. 10:11

 

import requests

url = 'https://fapi.binance.com/fapi/v1/ticker/bookTicker'
data = requests.get(url).json()

symbols = []

for x in data:
    if x['symbol'].endswith('USDT'):
        symbols.append(x['symbol'])

print(symbols)

url = 'https://www.binance.com/bapi/asset/v2/public/asset-service/product/get-products?includeEtf=true'
data = requests.get(url).json()

total_market_cap = 0
market_caps = {}
for coin in data['data']:
    if '1000'+coin['s'] in symbols:
        coin['s'] = '1000'+coin['s']
    if 's' in coin and coin['s'] in symbols:
        current_price = float(coin['c'])
        circulating_supply = float(coin['cs'])
        market_cap = current_price * circulating_supply
        market_caps[coin['s']] = market_cap
        total_market_cap += market_cap

print(f'Total Market Cap: {total_market_cap:.2f} USDT')
print('확인된 종목의 수 :',len(symbols))
print(market_caps)

참조

c# - Is there a way to get the market cap or market cap rank of a coin using the Binance API? - Stack Overflow

 

요약

1. 선물에 호가창이 열려있는 종목들 중 이름이 USDT로 끝나는 종목들을 추려냄

2. 현물 API를 통해 해당 종목들의 정보만을 골라내어 시가총액을 계산

 

출력 결과

['BTCUSDT', 'ETHUSDT', 'BCHUSDT', 'XRPUSDT', ...]
Total Market Cap: 3130105865091.44 USDT
확인된 종목의 수 : 339
{'BTCUSDT': 1946762242354.54, '1INCHUSDT': 563472917.6047, ...}

추가 설명

1. 번에 24hr Ticker등의 API 대신에 bookTicker를 사용한건 상폐된, 혹은 상장 준비중인 종목들이

24hr Ticker로 불러와져서 에러를 발생시킨 적이 있었음. (현재가 등의 정보가 비어있는 상태)

그래서 BookTicker API로 골라낸 종목을 활용했었는데 오래돼서 정확히 기억나지 않음

 

물론 총 공급량으로 계산하는 것이 정확한 시가총액입니다.

다만 바이낸스에서 유통 공급량에 대한 정보만 제공되므로 이것을 사용합니다.

총 공급량으로 계산하고 싶다면 코인게코, 코인마켓캡 API를 이용하시면 됩니다.

 

바이낸스에 상장된지 얼마 안된 종목들은 유통 공급량도 종종  0으로 표기됩니다

 

 

API를 호출하면 아래 형식의 데이터를 불러오게 됩니다.

{'code': '000000',
 'data': [{'an': 'BNB',
           'as': 19405.513,
           'b': 'BNB',
           'ba': '',
           'c': '0.007154',
           'cs': 149547277,
           'etf': False,
           'g': True,
           'h': '0.007200',
           'hd': False,
           'i': '0.00100000',
           'ks': False,
           'l': '0.007089',
           'lc': False,
           'o': '0.007191',
           'pm': 'BTC',
           'pn': 'BTC',
           'pom': False,
           'pomt': None,
           'q': 'BTC',
           'qa': '฿',
           'qn': 'Bitcoin',
           'qv': '138.58143564',
           'r': False,
           'rb': False,
           's': 'BNBBTC',
           'sd': False,
           'st': 'TRADING',
           'tags': ['Layer1_Layer2', 'BSC', 'pos', 'bnbchain'],
           'ts': '0.000001',
           'v': '19405.513000',
           'y': 0},
           ...

이 중 'cs'가 circulating supply(유통 공급량), 'c'는 현재 가격을 의미하며

'cs'와 'c'를 곱하고, 모든 종목들을 더하여 

전체 시장 규모를 계산하였습니다.

 

특정 종목의 시총만 필요하다면 

if 's' in coin and coin['s'] in name: # 해당 코드를 아래와 같이 변경
if 's' in coin and coin['s'] in name and coin['s'] == 'BTCUSDT':

여기에 'BTCUSDT'를 원하는 종목의 이름으로 바꿔주면 됩니다.

 

또는 circulating_supply에 'cs' 값이 저장이 되어 있으므로

circulating_supply[ 'BTCUSDT' ] 이런식으로 종목의 이름을 넣어 사용하면 됩니다.

print( circulating_supply['BTCUSDT'])