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

Python 바이낸스 거래소 선물자동매매 개발 가이드 ep5.캔들 데이터 조회

by 행복론자 2023. 1. 6.

지난 글에서는 ep4. 잔고, 포지션 조회를 다뤄봤습니다

2023.01.05 - [파이썬/가상화폐] - Python 바이낸스 거래소 선물자동매매 개발 가이드 ep4.잔고 포지션 조회

 

Python 바이낸스 거래소 선물자동매매 개발 가이드 ep4.잔고 포지션 조회

지난 글에서는 ep3. 마진타입 설정을 다뤄봤습니다 2022.12.31 - [파이썬/가상화폐] - Python 바이낸스 거래소 선물자동매매 개발 가이드 ep3.마진타입 설정(교차 vs 격리) Python 바이낸스 거래소 선물자

jsp-dev.tistory.com

 

 

이번 글은 캔들 조회하는 방법을 알아보겠습니다. 

전체 내용&프로젝트 진행궁금하신 분들은 다음 글을 참고해주세요

2022.12.27 - [분류 전체보기] - [공지]바이낸스 코인선물자동매매 시스템 개발 방법을 담은 책이 출시되었습니다.

 

캔들 데이터 조회는 기본적으로 ohclv(open:시가, high:고가, close:종가, low:저가, volume:거래량)으로 구성된 캔들 데이터를 의미합니다. 우리는 이 캔들 데이터를 DataFrame이라는 데이터 형태로 저장해 트레이딩에 사용할 예정입니다.
그러면 바로 샘플 코드를 사용해보도록하겠습니다.
샘플 코드는 링크에서 확인하실 수 있습니다.
main.py

import logging
from binance.um_futures import UMFutures
from binance.lib.utils import config_logging

config_logging(logging, logging.DEBUG)

um_futures_client = UMFutures()

logging.info(um_futures_client.klines("BTCUSDT", "1d"))

 

 

캔들 데이터 조회는 특정 계정의 데이터가 아니기 때문에 API Key를 전달하지 않아도 조회할 수 있습니다.
데이터를 얻어오는 함수는 klines이며 첫번째 인자로 데이터를 조회해올 티커(ticker)를 전달합니다. 두번째 인자는 조회해올 캔들 데이터의 주기를 전달합니다. 샘플 코드에서 전달한 파라미터는 “1d”로 하루를 의미하며 함수의 호출결과는 일봉에 해당하는 여러개의 캔들 데이터가 리스트로 되어 있습니다. 만약 1분, 5분, 1시간봉을 얻어오고 싶다면 파라미터를 다음처럼 수정해 전달하면 됩니다. (1m, 5m, 1h)

그럼 실행결과를 보겠습니다.

 

 

마지막줄에 나오는 데이터가 일봉 데이터조회 결과입니다.
언뜻봐서는 조회해온 데이터가 무엇을 의미하는지 알 수 없으나 API 문서에 잘 정리가 되어 있으니 참고하시기 바랍니다.

 

조회해온 데이터는 위처럼 리스트를 포함하고 있는 리스트입니다. 
위 구조의 데이터 중 한 개의 데이터를 예시로 살펴보겠습니다. 

[[1627257600000, '35370.67', '48168.60', '35185.49', '37218.09', '1162332.857', 1627343999999, '44475672628.66526', 9156876, '586176.914', '22425600825.52282', '0']]

 

제일 먼저 등장하는 1627257600000는 캔들이 생성되기 시작한 시간을 의미합니다. 숫자로 되어 있지만 이를 날짜로 변환하는 코드는 다음과 같습니다.

from datetime import datetime

open_date = datetime.fromtimestamp(int(1627257600000) / 1000)
print(open_date)

 

시간을 숫자로 치환한 데이터였기 때문에 다시 역순으로 변환하면 원래의 시간 데이터가 나온다는 것을 알 수 있습니다.

2021-07-26 09:00:00

 

그런데 중요한 점은 이 책을 작성하는 시점(2022-12-07)에 조회해온 가장 마지막 데이터가 2021-07-26이면 그 이전 데이터는 어떻게 가져올 수 있을까요?
일단 um_futures_client.klines("BTCUSDT", "1d") 함수를 통해 얻어올 수 있는 최대 캔들의 갯수는 1000개이며(일봉으로 치면 1000일) 아무 설정도 하지 않고 호출할 경우는 최대 500개의 데이터를 가져옵니다. 
1000개의 데이터를 가져오고 싶으면 다음처럼 파라미터를 추가해 함수를 호출하면 됩니다.

um_futures_client.klines("BTCUSDT", "1d", limit=1000)

 

하지만 이마저도 부족하다고 생각되는 경우는 유료로 과거 데이터를 제공하는 사이트들이 있으니 참고하시기 바랍니다. 
그럼 계속해서 조회해온 데이터를 살펴보겠습니다

[[1627257600000, '35370.67', '48168.60', '35185.49', '37218.09', '1162332.857', 1627343999999, '44475672628.66526', 9156876, '586176.914', '22425600825.52282', '0']]

 

 

맨 앞 데이터가 시작일자고 이후부터는 시가, 고가, 저가, 종가, 거래량, 캔들의 종료 시간을 의미합니다. 즉 35370.67는 Binance BTCUSDT 선물계약의 2021-07-26~2021-07-27의 시가이며 48168.60은 고가를 의미합니다. 

(계속해서 35185.49는 저가, 37218.09는 종가, 1162332.857는 거래량을 의미합니다.)
정확한 데이터인지 확인해보기 위해 실제로 Tradingview 사이트에 접속해서 확인해보니 동일함을 알 수 있습니다. 

 

이렇게 하루치에 해당하는 캔들 데이터를 살펴봤지만 실제로 조회해온 데이터는 최소 500개이고 이 데이터들간의 연산이 필요한 경우가 많습니다. 예를 들어 우리가 잘 아는 이동평균선이나 RSI, 볼린저밴드 계산이 그렇습니다. 
Python에서는 DataFrame이라는 데이터형을 이용해 위와 같은 연산을 쉽고 빠르게 할 수 있게 도와줍니다. 
DataFrame을 처음 접하신 분들은 생소하시겠지만 조금 더 쉽게 말해 컴퓨터가 데이터를 처리하고 또 우리가 사용 & 가공하기 쉬운 구조의 자료형태라고 생각해주시길 바랍니다. 

* DataFrame에 대한 학습 자료

 

DataFrame 사용을 위해 Anaconda를 실행해 Pandas를 설치합니다.

pip install pandas

 

Anaconda Prompt를 실행시키고 가상환경 trader_env를 활성화시킨 다음 위 명령어를 실행합니다.
pandas 패키지 설치하는 데에 다소 시간이 필요하며 Pycharm 프로젝트에서는 연결된 가상환경에 변경(pandas 설치)이 있으면 프로그램 실행이 안되니 잠시 여유를 갖고 기다리시기 바랍니다.

 

설치가 완료되었다면 다음 소스를 이용해 Binance API를 이용해 얻어온 캔들 데이터를 DataFrame으로 만들 수 있습니다. 
main.py

import logging
from binance.um_futures import UMFutures
from binance.lib.utils import config_logging
from datetime import datetime
import pandas as pd

config_logging(logging, logging.DEBUG)

um_futures_client = UMFutures()

candles = um_futures_client.klines("BTCUSDT", "1d")

df_1d = pd.DataFrame(columns=['Open_time', 'Open', 'High', 'Low', 'Close', 'Volume', 'Close_time'])
opentime, lopen, lhigh, llow, lclose, lvol, closetime = [], [], [], [], [], [], []

for candle in candles:
   opentime.append(datetime.fromtimestamp(int(candle[0]) / 1000))
   lopen.append(float(candle[1]))
   lhigh.append(float(candle[2]))
   llow.append(float(candle[3]))
   lclose.append(float(candle[4]))
   lvol.append(float(candle[5]))
   closetime.append(datetime.fromtimestamp(int(candle[6]) / 1000))

df_1d['Open_time'] = opentime
df_1d['Open'] = lopen
df_1d['High'] = lhigh
df_1d['Low'] = llow
df_1d['Close'] = lclose
df_1d['Volume'] = lvol
df_1d['Close_time'] = closetime
df_1d.set_index(['Open_time'], inplace=True)

logging.info(df_1d)

 

* 더 자세한 설명이 궁금하신 분만 전자책을 참조해보세요


같이 읽어보면 좋은 글

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

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

댓글