반응형

 안녕하세요. 이번 포스팅에서는 바이낸스의 보유자산을 조회하는 코드를 포스팅해보겠습니다. ccxt를 이용해 바이낸스의 계좌를 조회해 볼 텐데, 바이낸스의 계좌는 Fiat and Spot, Margin, Futures, Earn 등이 있습니다. 그중 제가 사용하는 Fiat and Spot과 Futures 지갑을 조회해보겠습니다.

 

1. Spot(현물) 및 coin-m(선물) 조회

 먼저 Spot과 Futures의 coin-m 계좌부터 불러와보도록 하겠습니다.

import dotenv
import os
import ccxt
import pandas as pd

dotenv_file = dotenv.find_dotenv()
dotenv.load_dotenv(dotenv_file)

apikeyBn = os.environ['bn_apikey']
apisecretBn = os.environ['bn_secret']

binance = ccxt.binance(config={'apiKey': apikeyBn, 'secret': apisecretBn})

# spot 
balanceSpot = binance.fetch_balance()['total']
spot = pd.DataFrame(list(balanceSpot.items()), columns=['name', 'balance'])

# coin-m
balanceCoinm = binance.fetch_balance(params={"type": 'delivery'})['total']
Coinm = pd.DataFrame(list(balanceCoinm.items()), columns=['name', 'balance'])

# spot and coin-m
total = pd.concat([spot, Coinm])
total = total[total['balance'] > 0]
print(total)

 dotenv를 이용해 환경변수 저장하는 방법은 아래 포스팅을 참고해주세요.

2022.10.05 - [Python] - 파이썬 dotenv를 이용한 환경변수 저장 및 호출

 

파이썬 dotenv를 이용한 환경변수 저장 및 호출

블로그 만든 뒤에 처음 작성하는 글이네요. 블로그에 공유하기 위해 중요한 정보(암호) 등을 환경변수로 지정해 다른 파일에 저장하고, 공유시에 다른 사람들에게 노출되는 것을 막고자 합니다.

bitcoding.tistory.com

 

 ccxt의 'fetch_balance'를 통해 각 계좌의 보유 수량을 불러왔습니다. 두 가지 데이터를 합한 뒤 수량이 0 이상인 값들만 남겨주었습니다. 

 결과는 아래와 같습니다. (수정된 예시입니다.) 앞서 작성한 업비트와 마찬가지로 상장되어있지 않은 코인도 존재하고, 소량만 있어 가치가 낮은 코인들도 존재합니다. 또한 현물 계좌와 선물계좌의 데이터를 합쳐서, 중복된 데이터들도 존재합니다. 이러한 항목들을 정리하는 코드를 작성해 보겠습니다. (텍스트 가시성에 문제가 있어 사진으로 첨부합니다.)

 

spot and coin-m

 

2. 중복 데이터 취합

 먼저 현물과 선물의 계좌에 같은 종류의 코인이 있는 경우 이를 더하는 코드를 작성해 보겠습니다.

import dotenv
import os
import ccxt
import pandas as pd

dotenv_file = dotenv.find_dotenv()
dotenv.load_dotenv(dotenv_file)

apikeyBn = os.environ['bn_apikey']
apisecretBn = os.environ['bn_secret']

binance = ccxt.binance(config={'apiKey': apikeyBn, 'secret': apisecretBn})

# spot 
balanceSpot = binance.fetch_balance()['total']
spot = pd.DataFrame(list(balanceSpot.items()), columns=['name', 'balance'])

# coin-m
balanceCoinm = binance.fetch_balance(params={"type": 'delivery'})['total']
Coinm = pd.DataFrame(list(balanceCoinm.items()), columns=['name', 'balance'])

# spot and coin-m
total = pd.concat([spot, Coinm])
total = total[total['balance'] > 0]

############################################################
# 중복데이터 정리
df = total.drop_duplicates("name", keep=False)
df1 = total[total.duplicated('name', keep = 'first')]
df2 = total[total.duplicated('name', keep = 'last')]

# 분리된 데이터 더하기
nameBn = []
amountBn = []
for coin in df1['name']:
    nameBn.append(coin)
    am = df1[df1['name'] == coin]['balance'].values[0] + df2[df2['name'] == coin]['balance'].values[0]
    amountBn.append(am)

dfz = []
dfz.append(nameBn)
dfz.append(amountBn)
dfz = pd.DataFrame(dfz)
dfz =dfz.transpose()
dfz.columns = ['name', 'balance']
# df: 중복제거, dfz: 중복된 것들
df = pd.concat([dfz, df])

print(df)

 

 중복되지 않은 항목은 df에, 중복된 항목들 중 spot은 df1, coin-m은 df2에 할당해주었습니다. 반복문을 통해 df1과 df2의 name이 같은 항목들끼리 balance 값을 더해 새로운 리스트에 지정해주었습니다. 그 뒤 중복되지 않은 항목들과 합해서, 중복된 항들을 모두 없앴습니다.

 

중복 데이터 삭제

 중복돼있던 BTC와 SOL이 하나로 합해진 모습입니다. 

 

 

3. 비상장/소액 코인 제거

 이번에는 바이낸스의 USDT페어가 없는 항목들과 10$ 보다 적은 값을 제거해주겠습니다.

import dotenv
import os
import ccxt
import pandas as pd

dotenv_file = dotenv.find_dotenv()
dotenv.load_dotenv(dotenv_file)

apikeyBn = os.environ['bn_apikey']
apisecretBn = os.environ['bn_secret']

binance = ccxt.binance(config={'apiKey': apikeyBn, 'secret': apisecretBn})

# spot 
balanceSpot = binance.fetch_balance()['total']
spot = pd.DataFrame(list(balanceSpot.items()), columns=['name', 'balance'])

# coin-m
balanceCoinm = binance.fetch_balance(params={"type": 'delivery'})['total']
Coinm = pd.DataFrame(list(balanceCoinm.items()), columns=['name', 'balance'])

# spot and coin-m
total = pd.concat([spot, Coinm])
total = total[total['balance'] > 0]

############################################################
# 중복데이터 정리
dfBn = total.drop_duplicates("name", keep=False)

df1 = total[total.duplicated('name', keep = 'first')]
df2 = total[total.duplicated('name', keep = 'last')]

# 분리된 데이터 더하기
nameBn = []
amountBn = []
for coin in df1['name']:
    nameBn.append(coin)
    am = df1[df1['name'] == coin]['balance'].values[0] + df2[df2['name'] == coin]['balance'].values[0]
    amountBn.append(am)

dfz = []
dfz.append(nameBn)
dfz.append(amountBn)
dfz = pd.DataFrame(dfz)
dfz =dfz.transpose()
dfz.columns = ['name', 'balance']
# dfBn: 중복 제거, dfz: 중복된 것들
dfBn = pd.concat([dfz, dfBn])

############################################################
# 비상장/소액 제거하기
nameBn = []
usdBn = []
amountBn = []
priceBn = []

# 페어 및 가격 가져오기
markets = binance.fetch_tickers()
keys = markets.keys()

for coin in dfBn['name']:
    amount = dfBn[dfBn['name'] == coin]['balance'].values[0]
    coin2 = coin + "/USDT"
    for pair in keys:
        if pair == coin2: # usdt 페어 있는 경우만
            price = markets[pair]['last']
            usd = price * amount
            if usd > 10: # 10$ 이상만
                nameBn.append(coin)
                usdBn.append(usd)
                amountBn.append(amount)
                priceBn.append(price)

dfBn = [nameBn, amountBn, priceBn, usdBn]
dfBn = pd.DataFrame(dfBn)
dfBn = dfBn.transpose()
dfBn.columns = ['Name', 'Amount', 'Price', 'USD']

print(df)

 

 ccxt의 fetch_tickers를 통해 마켓정보(페어 및 가격 등)를 불러왔습니다. 이후 if문을 통해 각 코인 별 USDT 페어가 존재하는 경우에만 다음 코드를 실행하도록 했습니다. 테더 페어가 존재하는 경우, 가격정보를 받아와서 보유 중인 수량과 곱해 usd가치가 10$ 이상인 경우만 리스트에 저장해주었습니다.

 

비상장/소액 코인 정리

 usdt 페어가 있는 경우만 남기다 보니, 보유 중인 usdt가 사라진 모습입니다. 다음 항목에서 현물 테더와 선물 usds의 스테이블 코인들을 더해서 정리하겠습니다.

 

 

4. 현물 테더 및 선물 usds 종합하기

 현물 계좌의 usdt와 선물 usds 계좌의 usdt와 busd를 추가해 보겠습니다.

import dotenv
import os
import ccxt
import pandas as pd

dotenv_file = dotenv.find_dotenv()
dotenv.load_dotenv(dotenv_file)

apikeyBn = os.environ['bn_apikey']
apisecretBn = os.environ['bn_secret']

binance = ccxt.binance(config={'apiKey': apikeyBn, 'secret': apisecretBn})

# spot 
balanceSpot = binance.fetch_balance()['total']
spot = pd.DataFrame(list(balanceSpot.items()), columns=['name', 'balance'])

# coin-m
balanceCoinm = binance.fetch_balance(params={"type": 'delivery'})['total']
Coinm = pd.DataFrame(list(balanceCoinm.items()), columns=['name', 'balance'])

# spot and coin-m
total = pd.concat([spot, Coinm])
total = total[total['balance'] > 0]

############################################################
# 중복데이터 정리
dfBn = total.drop_duplicates("name", keep=False)

df1 = total[total.duplicated('name', keep = 'first')]
df2 = total[total.duplicated('name', keep = 'last')]

# 분리된 데이터 더하기
nameBn = []
amountBn = []
for coin in df1['name']:
    nameBn.append(coin)
    am = df1[df1['name'] == coin]['balance'].values[0] + df2[df2['name'] == coin]['balance'].values[0]
    amountBn.append(am)

dfz = []
dfz.append(nameBn)
dfz.append(amountBn)
dfz = pd.DataFrame(dfz)
dfz =dfz.transpose()
dfz.columns = ['name', 'balance']
# dfBn: 중복 제거, dfz: 중복된 것들
dfBn = pd.concat([dfz, dfBn])

############################################################
# 비상장/소액 제거하기
nameBn = []
usdBn = []
amountBn = []
priceBn = []

# 페어 및 가격 가져오기
markets = binance.fetch_tickers()
keys = markets.keys()

for coin in dfBn['name']:
    amount = dfBn[dfBn['name'] == coin]['balance'].values[0]
    coin2 = coin + "/USDT"
    for pair in keys:
        if pair == coin2: # usdt 페어 있는 경우만
            price = markets[pair]['last']
            usd = price * amount
            if usd > 10: # 10$ 이상만
                nameBn.append(coin)
                usdBn.append(usd)
                amountBn.append(amount)
                priceBn.append(price)

dfBn = [nameBn, usdBn, amountBn, priceBn]
dfBn = pd.DataFrame(dfBn)
dfBn = dfBn.transpose()
dfBn.columns = ['Name', 'Amount', 'Price', 'USD']

############################################################
# spot usdt + futures usds
spot_usdt = balanceSpot['USDT']

balanceUsds = binance.fetch_balance(params={"type": "future"})
future_usd = balanceUsds['total']['USDT'] + balanceUsds['total']['BUSD']

total_usd = spot_usdt + future_usd
dfBn.loc[len(dfBn)+1] = ['USD', total_usd, 1, total_usd]

binance_usd = dfBn.sum(axis=0)['USD']

print(dfBn)
print("Total USD: {0:,.2f} USD".format(binance_usd))

 

 spot의 usdt를 따로 불러서 더해주고, fetch_balace의 타입을 'future'로 지정해서 호출하면 futures의 usds 지갑의 정보를 불러옵니다. 불러온 usdt와 busd를 더해서 df의 마지막 줄에 추가해 주었습니다. 마지막으로 각 항목별 usd값을 더해서 출력해 주었습니다.

 

바이낸스 보유 자산 출력

 

 이번 포스팅에서는 바이낸스의 현물 및 선물 계좌의 보유 자산을 조회하고 정리해서 출력해보았습니다. 다음 포스팅에서는 환율을 가져와서 업비트와 바이낸스의 보유자산을 계산 및 정리해 보겠습니다. 읽어주셔서 감사합니다.

반응형

+ Recent posts