본문 바로가기
파이썬/가상화폐

Python Binance Websocket 비트코인 실시간 데이터 조회

by 행복론자 2022. 7. 26.

Kiwoom API나 pyupbit를 이용한 주식, 코인 데이터를 받아오는 과정은 

'클라이언트의 요청 > 서버의 응답 > 데이터 수신'이라는 일련의 단계를 거쳤습니다.

이런 요청은 1일, 4시간, 1시간 캔들 데이터를 얻어오는데는 괜찮을지 몰라도 1분, 3분 같은 다소 짧은 주기의 캔들 데이터를 조회해 사용한다면 약간의 문제가 될 수 있습니다.

 

이럴 때 필요한게 websocket입니다.

업비트에 들어가서 비트코인 시세를 보면 실시간으로 바뀌는데요.

우리가 사용하는 브라우저에서 아주 빠르게(?) 데이터를  요청하는게 아니라 업비트 서버로부터 websocket subscribe 후 데이터를 계~속 수신하는 것입니다. 

 

 

따라서 websocket을 사용하면 비트코인 실시간 데이터를 받아볼 수 있습니다.

이 websocket을 사용하는데는 api key, secret key를 이용한 인증절차가 필요 없어서 코드가 비교적 간단합니다.

(중간에 is_candle_closed는 1분봉이 마감되는 시점을 의미합니다.)

import websocket, json

symbol = 'btcusdt'
interval = '1m'

url = f'wss://stream.binance.com:9443/ws/{symbol}@kline_{interval}'


def on_message(ws, message):
    data = json.loads(message)
    print(data)
    candle = data['k']
    is_candle_closed = candle['x']
    close = candle['c']
    high = candle['h']
    low = candle['l']
    vol = candle['v']
    closes = []
    highs = []
    lows = []

    if is_candle_closed:
        closes.append(float(close))
        highs.append(float(high))
        lows.append(float(low))
        print(closes)
        print(highs)
        print(lows)


def on_close(ws):
    print("close")


ws = websocket.WebSocketApp(url, on_message=on_message, on_close=on_close)
ws.run_forever()

 

 

코드를 실행시키면 다음같은 데이터를 계속 수신합니다.

{'e': 'kline', 'E': 1658767442149, 's': 'BTCUSDT', 'k': {'t': 1658767440000, 'T': 1658767499999, 's': 'BTCUSDT', 'i': '1m', 'f': 1519989329, 'L': 1519989410, 'o': '21917.48000000', 'c': '21915.27000000', 'h': '21917.48000000', 'l': '21912.96000000', 'v': '1.08144000', 'n': 82, 'x': False, 'q': '23699.42408340', 'V': '0.07057000', 'Q': '1546.60654630', 'B': '0'}}
{'e': 'kline', 'E': 1658767444175, 's': 'BTCUSDT', 'k': {'t': 1658767440000, 'T': 1658767499999, 's': 'BTCUSDT', 'i': '1m', 'f': 1519989329, 'L': 1519989440, 'o': '21917.48000000', 'c': '21914.39000000', 'h': '21917.48000000', 'l': '21912.96000000', 'v': '1.41886000', 'n': 112, 'x': False, 'q': '31094.21365230', 'V': '0.38335000', 'Q': '8401.42534040', 'B': '0'}}
{'e': 'kline', 'E': 1658767446419, 's': 'BTCUSDT', 'k': {'t': 1658767440000, 'T': 1658767499999, 's': 'BTCUSDT', 'i': '1m', 'f': 1519989329, 'L': 1519989628, 'o': '21917.48000000', 'c': '21905.62000000', 'h': '21917.48000000', 'l': '21905.61000000', 'v': '10.90326000', 'n': 300, 'x': False, 'q': '238882.06543720', 'V': '2.16318000', 'Q': '47393.97660150', 'B': '0'}}
{'e': 'kline', 'E': 1658767448439, 's': 'BTCUSDT', 'k': {'t': 1658767440000, 'T': 1658767499999, 's': 'BTCUSDT', 'i': '1m', 'f': 1519989329, 'L': 1519989673, 'o': '21917.48000000', 'c': '21906.60000000', 'h': '21917.48000000', 'l': '21905.61000000', 'v': '12.58203000', 'n': 345, 'x': False, 'q': '275661.62726870', 'V': '3.77591000', 'Q': '82726.82370680', 'B': '0'}}
{'e': 'kline', 'E': 1658767450496, 's': 'BTCUSDT', 'k': {'t': 1658767440000, 'T': 1658767499999, 's': 'BTCUSDT', 'i': '1m', 'f': 1519989329, 'L': 1519989708, 'o': '21917.48000000', 'c': '21908.02000000', 'h': '21917.48000000', 'l': '21905.61000000', 'v': '13.18914000', 'n': 380, 'x': False, 'q': '288962.36097790', 'V': '4.12470000', 'Q': '90368.50321660', 'B': '0'}}

 

 

이 데이터가 무엇인지는 binance api 문서에 잘 정리되어 있습니다.

(처음 보시는 분들은 이 문서가 보기 조금 불편하게 느껴질 수도 있습니다)

{
  "e": "kline",     // Event type
  "E": 1638747660000,   // Event time
  "s": "BTCUSDT",    // Symbol
  "k": {
    "t": 1638747660000, // Kline start time
    "T": 1638747719999, // Kline close time
    "s": "BTCUSDT",  // Symbol
    "i": "1m",      // Interval
    "f": 100,       // First trade ID
    "L": 200,       // Last trade ID
    "o": "0.0010",  // Open price
    "c": "0.0020",  // Close price
    "h": "0.0025",  // High price
    "l": "0.0015",  // Low price
    "v": "1000",    // Base asset volume
    "n": 100,       // Number of trades
    "x": false,     // Is this kline closed?
    "q": "1.0000",  // Quote asset volume
    "V": "500",     // Taker buy base asset volume
    "Q": "0.500",   // Taker buy quote asset volume
    "B": "123456"   // Ignore
  }
}

 

 

변수와 주기를 조절해 비트코인뿐만 아니라 다른 코인들의 캔들정보도 가져올 수 있습니다.

import websocket, json

symbol = 'btcusdt'  # 비트코인 말고 다른 것도 가능
interval = '1m'  # 1m > 1분

url = f'wss://stream.binance.com:9443/ws/{symbol}@kline_{interval}'

 

코드의 예시는 binance 거래소를 대상으로 데이터를 가져오지만 url 부분을 바꾸면 upbit, ftx, bybit 등 다른 거래소들의 데이터도 수신할 수 있습니다. 

다만 이럴 경우 응답부가 다르기 때문에 해당 거래소 api를 보고 적절히 수정해야 할 것 같습니다.

 

오늘은 이렇게 websocket을 이용한 데이터 수신을 알아봤습니다.

그냥 api 호출해서 가격 데이터 가져오면 되지 이게 굳이 뭐하러 필요하냐 하실 수도 있지만

많은 가상화폐거래소 api 이용을 인터페이스하는 ccxt을 사용할 때 websocket까지 사용하려면 돈을 내야합니다.

그만큼 복잡하면서(?) 중요한 데이터라고 할 수 있겠습니다.

아무튼 이 웹소켓을 이용해 binance 거래소의 비트코인 시세를 실시간으로 전달 받아 각자의 아이디어에 맞게 다양하게 활용할 수 있을 것 같습니다.

2022.10.28 - [파이썬/가상화폐] - 업비트 파이썬 웹소켓 실시간 체결가격 조회 예시코드 Python Upbit Websocket connect

 


같이 읽어보면 좋은 글

2022.12.27 - [파이썬/가상화폐] - [전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.

 

[전자책] 바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.

🎁 바이낸스 자동매매 시스템 개발 방법을 담은 책이 출시되었습니다. "나 대신 일해주는 코인선물자동매매 프로그램 개발, 노하우 및 소스를 모두 공개합니다" ✔️ Q: 무슨 내용인가요? Python

jsp-dev.tistory.com

 

2022.11.05 - [파이썬/가상화폐] - [공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프리미엄

 

[공지] 코인거래소별 프리미엄 체크봇 개발 가이드와 풀소스 전자책 | binance bybit | 업비트 김치프

https://kmong.com/gig/417785 거래소별 코인 프리미엄 알림봇 개발 가이드를 드립니다 | 36000원부터 시작 가능한 총 평점 5점의 3개 총 작업 개수 완료한 총 평점 5점인 JSDEV의 전자책, 투잡·재테크 전자

jsp-dev.tistory.com

 

반응형
이 포스팅은 쿠팡파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

댓글