본문 바로가기

코인/코인 개발

바이낸스 API와 Python TA-lib를 이용한 스토캐스틱, RSI 등 보조 지표 활용

이전 포스팅에서는 업비트 API와 Python TA-lib를 이용해 스토캐스틱, RSI 등의 보조 지표를 활용하는 방법을 알아보았었습니다.

 

이번 포스팅에서는 업비트가 아닌 바이낸스 데이터를 이용해 보조 지표를 활용하는 방법을 알아보겠습니다. 바이낸스의 경우 빠른 응답 속도와 웹소켓을 이용한 데이터 스트림의 제공으로 업비트보다 정교한 수준의 데이터 활용이 가능합니다. 먼저, API 이용을 위해서는 API Key를 발급받아야 하는데, 이는 이전 포스팅에서 다루었으니 참고 바랍니다.


먼저 이번 포스팅에서는 REST 형식으로 바이낸스에서 제공하는 Endpoint에 직접 호출하기보다는 바이낸스가 제공하는 SDK인 binance-connector를 이용하도록 하겠습니다. 설치 방법은 다음과 같이 pip를 이용할 수 있습니다.

pip install binance-connector

 

이번 포스팅에서 사용할 API는 다음과 같습니다.

  • Exchange Information
  • Kline/Candlestick Data

Exchange Information API는 바이낸스에서 거래 가능한 마켓이 어떠한 것이 있는지 확인하기 위해 사용하고, Kline/Candlestick Data는 개별 마켓에 대한 거래 정보를 가져오기 위해 사용합니다.

 

다음은 Exchange Information API를 사용하는 예제입니다.

from binance.spot import Spot as Client

client = Client(binance_access_key, binance_secret_key)
exchange_info = client.exchange_info()
symbols = exchange_info['symbols']

 

Exchange Information API 개발자 문서에 나온 것처럼 다양한 정보를 제공하고 있지만, 여기서는 개별 마켓에 대한 symbol을 확인하는 것만 진행하도록 하겠습니다. 현재 바이낸스에서 지원하는 symbol은 총 1555개로 여기서 모두 다루기는 쉽지 않으니 BTC/USDT 마켓 정보만을 다루도록 하겠습니다. 다음은 symbols 데이터 중 BTC/USDT 마켓의 정보입니다.

{
  'symbol': 'BTCUSDT',
  'status': 'TRADING',
  'baseAsset': 'BTC',
  'baseAssetPrecision': 8,
  'quoteAsset': 'USDT',
  'quotePrecision': 8,
  'quoteAssetPrecision': 8,
  'baseCommissionPrecision': 8,
  'quoteCommissionPrecision': 8,
  'orderTypes': [
    'LIMIT',
    'LIMIT_MAKER',
    'MARKET',
    'STOP_LOSS_LIMIT',
    'TAKE_PROFIT_LIMIT'
  ],
  'icebergAllowed': True,
  'ocoAllowed': True,
  'quoteOrderQtyMarketAllowed': True,
  'isSpotTradingAllowed': True,
  'isMarginTradingAllowed': True,
  'filters': [
    {
      'filterType': 'PRICE_FILTER',
      'minPrice': '0.01000000',
      'maxPrice': '1000000.00000000',
      'tickSize': '0.01000000'
    },
    {
      'filterType': 'PERCENT_PRICE',
      'multiplierUp': '5',
      'multiplierDown': '0.2',
      'avgPriceMins': 5
    },
    {
      'filterType': 'LOT_SIZE',
      'minQty': '0.00000100',
      'maxQty': '9000.00000000',
      'stepSize': '0.00000100'
    },
    {
      'filterType': 'MIN_NOTIONAL',
      'minNotional': '10.00000000',
      'applyToMarket': True,
      'avgPriceMins': 5
    },
    {
      'filterType': 'ICEBERG_PARTS',
      'limit': 10
    },
    {
      'filterType': 'MARKET_LOT_SIZE',
      'minQty': '0.00000000',
      'maxQty': '167.82349071',
      'stepSize': '0.00000000'
    },
    {
      'filterType': 'MAX_NUM_ORDERS',
      'maxNumOrders': 200
    },
    {
      'filterType': 'MAX_NUM_ALGO_ORDERS',
      'maxNumAlgoOrders': 5
    }
  ],
  'permissions': [
    'SPOT',
    'MARGIN'
  ]
}

 

 

Exchange Information API를 통해 거래 가능한 마켓을 확인했다면, 다음은 Kline/Candlestick Data API를 사용해 다음과 같이 거래 이력을 가져옵니다.

from datetime import datetime, timezone
import pandas as pd
from binance.spot import Spot as Client

client = Client(binance_access_key, binance_secret_key)

# 마켓: BTC/USDT, Interval: 4시간 봉, 캔들 갯수: 200개
klines = client.klines('BTCUSDT', '4h', limit=200)

df = pd.DataFrame(data={
	'open_time': [datetime.fromtimestamp(x[0] / 1000, timezone.utc) for x in klines],
	'open': [float(x[1]) for x in klines],
	'high': [float(x[2]) for x in klines],
	'low': [float(x[3]) for x in klines],
	'close': [float(x[4]) for x in klines],
	'volume': [float(x[5]) for x in klines],
	'close_time': [datetime.fromtimestamp(x[6] / 1000, timezone.utc) for x in klines],
})

 

이렇게 Kline/Candlestick Data API를 통해 가져온 데이터를 pandas.DataFrame으로 변환하고 나면 이전 포스팅에서 사용했던 TA-lib 등의 알려진 라이브러리를 이용해 다양한 보조 지표를 다음과 같이 활용할 수 있습니다.

# RSI
ta_rsi = ta.RSI(df['close'], timeperiod=14)

# Stochastic Oscillator
ta_stoch = ta.STOCH(high=df['high'], low=df['low'], close=df['close'], 
                    fastk_period=3, slowk_period=1, slowd_period=1)
                    
# MACD
ta_macd = ta.MACD(real=df['close'], fastperiod=12, slowperiod=26, signalperiod=9)

# ADX
ta_adx = ta.ADX(high=df['high'], low=df['low'], close=df['close'], timeperiod=14)

 

이러한 방식으로 획득한 보조 지표를 활용하는 방법은 특정 지표값에 Trigger를 걸고 알림 발송이나 매수/매도 거래 요청 등이 있겠습니다. pandas-ta(Technical Analysis Indicators - Pandas)는 pandas와 TA-lib를 결합해 만든 라이브러리로 다양한 보조 지표의 결합, 활용을 가능케 하는 TA Strategy를 지원하고 있습니다. 이와는 별도로, 바이낸스에서는 지속적인 마켓 정보를 획득하기 위해서 반복적인 호출(Polling)이 아닌, 웹소켓(WebSocket)을 사용한 데이터 스트리밍도 지원하고 있습니다. 이러한 추가적인 활용 방법에 대해서는 다음 기회에 다뤄보도록 하겠습니다.

 

8월 4일 업데이트:

2021.08.04 - [코인/코인 개발] - 바이낸스(Binance) 웹소켓(WebSocket)+파이썬(Python)으로 실시간 데이터 수신하기

 

바이낸스(Binance) 웹소켓(WebSocket)+파이썬(Python)으로 실시간 데이터 수신하기

이전 포스팅에서는 업비트 웹소켓을 사용해 실시간 차트 데이터를 얻는 방법을 설명했었습니다. 2021.08.03 - [코인/코인 개발] - 업비트(Upbit) 웹소켓(WebSocket)+파이썬(Python)으로 실시간 데이터 수신

blog.coinali.me