호돌찌의 AI 연구소
article thumbnail

바이낸스 API를 이용해 선물 거래를 하는 데 있어 이번 글에서는 예시로 BTC/USDT를 대상으로 레버리지 배율을 3으로 하고, 격리 모드에서 롱/숏 포지션을 잡아보도록 하겠습니다. 현물은 매수/매도에 대한 개념이지만 선물에서는 롱(buy) 포지션을 종료하기 위해서 숏(sell)을 수행하고, 반대로 숏 포지션을 종료하기 위해서는 롱을 수행하는 개념입니다. (추후에 여유가 되면 양방향으로 동시에 수행하는 헷지 모드에 대해서도 다루어볼 예정이기도 합니다.) 

 

업비트에서 시장가/지정가 매수/매도 하는 것과 비슷한 맥락을 가지고 있습니다. 아래 글을 참고하면 될 것 같습니다.

2022.06.15 - [Programming/Crypto] - pyupbit 활용 - 코인 매수/매도하기

 

pyupbit 활용 - 코인 매수/매도하기

지난번에 발급받은 API Key를 바탕으로 특정 코인을 매수/매도를 해보겠습니다. 2022.06.12 - [Programming/Crypto] - [Basic] Upbit API Key 발급하기 2022.06.12 - [Programming/Crypto] - [Basic] pyupbit 활용..

hotorch.tistory.com

 

 

 

 

ccxt를 활용 binance API key 세팅 및 레버리지 배율 조정


이전 글에 있었던 코드를 바탕으로 아래와 같이 시작합니다. 레버리지 배율은 3배로 하고, isolated 상태로 지정합니다. 

import pickle
import ccxt
import time
import pandas as pd

# api key 부르기
with open('./keypair/binance_secret_key.pkl', 'rb') as k:
    secret_key = pickle.load(k)

secret = secret_key['secret key']
access = secret_key['access key']

# 바이낸스 객체 지정 - 선물 거래 
binance = ccxt.binance(config = {
    'apiKey':access,
    'secret':secret,
    'enableRateLimit':True,
    'options':{
        'defaultType':'future'
    }
})

# 선물 계좌 조회
balances = binance.fetch_balance(params={"type": "future"})
time.sleep(0.1)

# 현재 예수금
TotalMoney = float(balances['USDT']['total']) 

# 레버리지 배율, 비트코인, 격리유무 설정
leverage = 3   
target_coin = 'BTCUSDT'
isolated = True 

# 레버리지 세팅하기
try:
    print(binance.fapiPrivate_post_leverage({'symbol': target_coin, 'leverage': leverage}))
except Exception as e:
    print("error:", e)
    
# 격리 유무 세팅하기
if isolated == True:
    try:
        print(binance.fapiPrivate_post_margintype({'symbol': target_coin, 'marginType': 'ISOLATED'}))
    except Exception as e:
        print("error:", e)

 

로그인해서 아래 그림처럼 세팅된 것을 알 수 있습니다.

 

 

 

Binance 시장가로 포지션 잡아보기


Binance 거래소에서 테더 기준 수수료는 아래 표와 같습니다. 지정가와 시장가 수수료 중에 시장가는 호가창에 있는 매물들을 바로 체결을 할 수 있지만 수수료가 조금 더 많이 나가는 것을 알 수 있습니다. 

 

출처 : https://bitcoinxxo.com/

 

사람마다 체결하는 부분에 있어 다양성을 존중합니다. 또한 진입할 사이즈를 정해야 하는데 들고 있는 예수금의 n%로 가셔도 좋고, 단리로 특정 수량만큼 정해서 들어가는 방법 등 다양하게 존재합니다. 저는 예시로 시장가로 최소 수량만큼 예시로 롱 포지션을 잡도록 하겠습니다. 참고로 비트코인 선물같은 경우 최소 수량은 0.001 btc입니다.  함수 이름만 보면 시장가(market)로 롱(buy)으로 잡을 수 있음을 알 수 있습니다. create_market_buy_order() 에 거래하고자 하는 티커와 수량을 기입합니다. 

print(binance.create_market_buy_order(target_coin, 0.001))

 

맨 아래에 포지션이 잡혀있는 것을 알 수 있습니다. 

 

 

아래 사진 상태 시점에서 보유 수량과 진입가격(평단가),  미실현 손익을 조회하고자 할 때는 계좌를 다시 조회하여 아래처럼 코드를 수행합니다. 

balances = binance.fetch_balance(params={"type": "future"})
time.sleep(0.1)

for posi in balances['info']['positions']:
    if posi['symbol'] == target_coin:
        amt = float(posi['positionAmt'])  # 수량
        entryPrice = float(posi['entryPrice'])  # 진입가격
        leverage = float(posi['leverage']) 
        unrealizedProfit = float(posi['unrealizedProfit'])  # 미실현손익
        isolated = posi['isolated'] 
        break
        
print(amt) # 위 바이낸스 포지션 사진에서 0.001 btc 
print(entryPrice) # 위 바이낸스 포지션 사진에서 19,094k
print(unrealizedProfit) # 위 바이낸스 포지션 사진에서 0.03 USDT 만큼 수익 중. 손실 중이라면 음수로 나타남

python에서 나온 결과와 바이낸스에 찍혀 있는 결과와 비교를 해보면 완전히 같음을 알 수 있습니다. 

 

 

 

 

포지션 청산하기 


위의 예제에서 롱으로 포지션을 진입을 하였고, 보유수량과 진입 가격을 알기 때문에 이제 포지션을 정리해보겠습니다. 롱 상태에서 정리를 하려면 sell(short)로 주문을 넣어야 하고 지정가(limit)로 주문을 넣어보겠습니다.

 

저는 진입가격(19,094k) 에서 1% 부분에서 익절을 내는 주문을 넣겠습니다. 아래와 같이 구현을 하면 됩니다. 아래 코드는 지금 본인이 누리고 있는 미실현 손익에 대한 %가 아닌, 진입 가격에 대한 1% 높은 부분에서 정리하겠다는 뜻입니다. 만약에 내가 정말 1% 수익만을 원한다면 설정한 레버리지 배율을 target_rate 값을 나누어서 주문을 넣으면 될 것입니다. 

또한 지금 예제로는 롱으로 포지션을 잡고 숏으로 정리를 하는데, 반대인 경우에 대해서는 부호가 반대로 되어야하는 것을 반드시 유의해주셔야 합니다. 

target_coin_ticker = "BTC/USDT"

# 진입 가격에대해서 어느 정도 익절을 하고 싶은지 설정. 
target_rate = 0.01

# 티커, 보유수량, 진입가격에서 원하는 익절 구간 만큼
print(binance.create_limit_sell_order(Target_Coin_Ticker, amt, entryPrice * (1.0 + target_rate)))

 

수행하는 즉시 Open Orders 탭을 누르면 진입가격(19,094k)에서 1.01배 높은 19,284k에 sell 주문이 정확하게 들어간 것을 알 수 있습니다. 

 

이제 앞으로 포지션을 진입할 때와 청산하고자 할 때, 특정 상황이나 조건을 각자 매매하기 이전에 세운 가설이나 여러 방법을 적용시켜서 매매를 해볼 수 있을 것입니다. 하지만 이렇게 단순하게 롱/숏으로 주문을 넣고 빼기에는 안전장치가 상대적으로 부족할 수 있습니다. 다음 글에서는 포지션 진입을 함과 동시에 본인이 감내할 수 있는 수준을 정하여 Stoploss 설정과 주문을 취소하는 과정에 대해 설명해보겠습니다. 


아래는 블로그 주인장의 토스 익명 후원 링크입니다. 글이 도움되거나 흡족스러웠다면 후원해주시면 감사하겠습니다.

https://toss.me/hotorch

 

hotorch님에게 보내주세요

토스아이디로 안전하게 익명 송금하세요.

toss.me

 

 

profile

호돌찌의 AI 연구소

@hotorch's AI Labs

포스팅이 도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!