본문
Python API로 Binance 마진거래 수익률 계산하기
잊고 지냈던 Poloniex에서 Stratis (STRAT) 코인을 상폐하겠다고 (옮긴후에 알아보니 STRAX 코인으로 스왑하는게 이유였드만.. 그러면 뻠삥가려나..) 하는바람에 오랜만에 로그인해보았다. 돈이 남아돌아서 재미로 잡코인 사뒀던 좋은 시절이 떠오르는와중에, 상폐되어 그대로 남아있는 다른 코인들을 보자니 안타까웠다. 아무튼 빗썸, 업비트가 STRAT 입금을 지원하지 않는중에 Binance가 입금을 지원해줘서 Binance로 송금받았다. 개인적으로 특히 코인판에서는 렌딩등 다양한 방법들이 있지만 이런거 안돌리고 쌩으로 한번사서 쭉 가지고 가는것을 좋아한다. 사고 잊고 묵힐수 있어서 좋고, 언제나 쉽게 팔수 있기 떄문이다. 그래서 여태 마진도 안했었는데, 이번에 어짜피 없었던돈인거 버리는셈치고 마진거래를 하기로 했다.
마진거래방식으로 교차마진과 격리마진이 있는데, 격리마진이 전액 손실 가능성이 더 낮고 레버리지 비율이 더 좋기때문에 개인적으로 격리마진을 더 선호한다. (한글이 괜히 어려운데 영어로는 Cross margin, Isolated margin 으로 이해가 더 쉽다.) 마진거래의 가장 큰 단점은 일정 마진이하로 가격이 하락할경우에 포지션이 자동 청산된다는 점이다. 한밤중에 자고있는데 폭락해버리면 청산당하면서 돈도 잃고 잠많은 자신을 탓하게 된다. 그래서 마진거래할떄는 잠깐만 집중해서 치고 빠지기 전략으로 접근하려고한다. 어짜피 마진거래시 시간마다 수수료를 지불해야하기도하니.. (그런데 치고빠지기가 말처럼 될까??) 아무튼 실시간으로 현재 수익을 파악해서 손절/익절을 결정하려고 하였다. 바이낸스가 아쉬운점은 수익금/수익률을 보기가 약간 어렵다는 점이다. 물론 PNL이 제공되긴 하지만 약간 미덥지 않은 그런 느낌이다. 그래서 이참에 API로 평단가와 수익금을 계산하기로 하였다. 어짜피 수익금 알면 수익률도 알게되니까.
어쨌든, 아래와 같이 코드를 작성해서 실행하면 위의 그림처럼 결과가 나온다. 여기에는 매시간마다 계산되는 마진이자는 빠져있는 상태이므로 정말 대략적으로 예상수익을 계산하는데만 사용되어야 한다. 수익률은 격리마진이므로 여기에 10을 곱해야 한다. 또한 maker/taker 거래수수료도 0.1%으로 고정되어있어서 VIP레벨, 레퍼럴이나 BNB코인등의 경우는 고려되지 않았다. 거래중에 짬내서 뚝딱하고 만든 이 코드를 공유하는것은 SAPI 관련 cctx 함수가 유연하게 사용가능하다는 것을 보여주기 위함이다. (당장 변수명부터 개판...)
import ccxt
from pprint import pprint
from datetime import datetime
import pandas as pd
from prettytable import PrettyTable
exchange = ccxt.binance({
'apiKey': 'api키',
'secret': 'secret키',
})
ticker = exchange.fetch_ticker('BTC/USDT')
mytrades=exchange.sapi_get_margin_mytrades({'symbol':'BTCUSDT', 'isIsolated':'TRUE', 'fromId':'467027509'})
totalExpenseInDollar=0
totalQuantityInBTC=0
averagePriceBTC=0
t = PrettyTable(['Date', 'id', 'Price', 'Quantity', 'Expense?', 'ExpenseInDollar', 'CumulatedBTC'])
for element in mytrades:
d = datetime.fromtimestamp(int(element['time'])/1000).strftime('%Y-%m-%d %H:%M:%S')
isBuyer=-1 if element['isBuyer'] == True else 1
transactionInDollar=float(element['price'])*float(element['qty'])
totalQuantityInBTC -= isBuyer*float(element['qty'])
t.add_row([d, element['id'], float(element['price']), float(element['qty']), 'USDT-' if element['isBuyer'] == True else 'USDT+', transactionInDollar, round(totalQuantityInBTC,5)])
totalExpenseInDollar += isBuyer*transactionInDollar
commissionInDollar = float(element['commission'])*float(element['price']) if element['commissionAsset'] == "BTC" else float(element['commission'])
totalQuantityInBTC += isBuyer*float(element['commission']) if element['commissionAsset'] == "BTC" else 0
t.add_row([d, element['id'], '('+element['commissionAsset']+')', float(element['commission']), 'BTC-' if element['commissionAsset'] == "BTC" else "USDT-", "("+str(commissionInDollar)+")", round(totalQuantityInBTC, 5)])
print(t)
CurrentExpPrice = float(totalQuantityInBTC)*float(ticker['close'])
sellFee=CurrentExpPrice*0.001
expectedProfit=totalExpenseInDollar+CurrentExpPrice-sellFee
averageBtcPrice=-1*totalExpenseInDollar/totalQuantityInBTC
print("TotalExpenseInDollar: "+str(totalExpenseInDollar)+" USDT")
print("TotalQuantityInBTC: "+str(totalQuantityInBTC)+" BTC")
print("CurrentTicker(BTC/USDT): "+str(ticker['close'])+" USDT")
print("AverageBtcPrice: "+str(averageBtcPrice)+" USDT")
print("CurrentExpPrice: "+str(CurrentExpPrice)+" USDT")
print("DifferencesinDolloar: "+str(totalExpenseInDollar+CurrentExpPrice)+" USDT")
print("Sell fee: "+str(sellFee)+" USDT")
print("Expected Profit:" + str(expectedProfit)+" USDT")
print("Profit Percentage: "+str(expectedProfit/totalExpenseInDollar*-100)+" %")
margin_iso = exchange.sapi_get_margin_isolated_account()
balances = pd.DataFrame(margin_iso['assets'])
liquidatePrice=float(balances['liquidatePrice'][1])
indexPrice=float(balances['indexPrice'][1])
liquidateRate=float(balances['liquidateRate'][1])
print("liquidateRate: "+str(liquidateRate)+" %")
댓글