바이낸스 비트코인 선물 Kline/Candle 파일로 다운받기

Binance Futrues
Binance App

머신러닝에 필요한 만큼의 바이낸스 과거 Candlestick data를 API로 가져오려고 하는데... 헉! REST API 1회 호출로가져올수 있는 Candlestick은 최대 1,000개로 제한되어 있고 1일 최대로 호출할 수 있는 API호출 횟수도 제한 되어 있었다. (REST API가 비싸긴 하다지만... 살짝 기분이 상한다. 강제청산으로 뜯긴 내돈이 얼만데!! ㅠㅠ)

 

지나간 과거의 캔들 데이터를 API호출 제한에 상관 없이 받을 수 있는 "방법이 뭔가 있지 않을까?" 하고 뒤적뒤적 Binance 의 Github를 찾아 봤는데...

 

두둥! 보인다 보여! Binance Public data 다운로드 도구가!

 - 역시 전세계 1등 거래소인건가? -

(다른 거래소는 아직 안 찾아봐서 모르겠음)

github Binance public data
github Binance public data

인터넷을 찾아보면 대부분 바이낸스 RestAPI로 캔들 데이터를 다운받는 방법들을 설명하고 있는데 바이낸스에서는 이렇게 지난 과거 캔들 차트 데이터를  압축된 zip 파일로 S3를 통해 공개하고 있기 때문에 다운로드 받는 방법을 소스코드를 공개하고 있다. 덕분에 Rest API를 사용하지 않고 Binance 마켓 데이터를 빠르게 다운로드할 수 있었다.

 

1. Binance Market Data 다운로드 사이트

Readme의 내용에서 바이낸스에서 거래된 Candlestick Data들을 꽁쳐놓고(?) 다운로드 받는 위치를 알 수 있다.

data.binance.vision
data.binance.vision

 

https://data.binance.vision 주소로 이동해보니 친절하게도 마켓타입/년/월/일/데이터타입/Symbol/Timeframe 별로 잘 파티셔닝된 zip 파일들을 찾을수 있다. 페이지 소스에는 AWS S3에 Batch작업으로 아카이빙 된 주소가 보인다.

var BUCKET_URL = 'https://s3-ap-northeast-1.amazonaws.com/data.binance.vision';
var BUCKET_WEBSITE_URL = 'https://data.binance.vision'

 

https://www.binance.com/en/landing/data#data-futures 에서 다운로드 받는 파일도 위 주소에서 다운로드를 받는 것이다.

타임프레임 단위로 폴더 구분이 잘 되어 있다
zip파일로 가지런히 모여있다 ^^

 

바이낸스에서 이렇게 잘 정리해서 저장을 해준 것은 너무나도 고마운데...

이걸 수동으로 하나 하나 다운로드 받는것은 사람이 할짓이 좀 아닌 것 같다. (그쵸? 맞죠?)

 

그래서 바이낸스가 "다운로드 받는 도구를 줄터이니 이렇게 이렇게 다운 받아!" 라고 다운로드 도구를 제공하고 있는것.

Kline data가 Candle data에 해당한다.
Kline data가 Candle data에 해당한다.

 

2. Github: binance-public-data

요즘은 윈도우/리눅스/맥 대부분 OS플랫폼에 상관없이 Shell 명령어들을 사용할 수 있어 참 편해졌다.

그래서인지 바이낸스 퍼블릭데이터 다운로드 도구는 심플하게 커맨드라인으로 진행할 수 있도록 해놨다.

 

우선 git 커맨드로 다운로드 도구를 clone하자.

## git은 설치 되어 있으시죠? ^^
> git clone https://github.com/binance/binance-public-data.git
'binance-public-data'에 복제합니다...
remote: Enumerating objects: 252, done.
remote: Counting objects: 100% (169/169), done.
remote: Compressing objects: 100% (114/114), done.
remote: Total 252 (delta 101), reused 99 (delta 55), pack-reused 83
오브젝트를 받는 중: 100% (252/252), 6.50 MiB | 10.29 MiB/s, 완료.
델타를 알아내는 중: 100% (129/129), 완료.

> cd binance-public-data

 

2-1. Shell을 이용한 Candle data 다운로드 방법

~/binance-public-data/shell 폴더에는

Shell에서 바로 다운받을수 있도록 3개의 shell 커맨드를 제공하고 있다.

download-futures-klines-simultaneously.sh 선물거래 Data를 다운로드 받는데 사용한다.
download-klines.sh 현물거래 Data를 다운로드 받는데 사용한다. 
fetch-all-trading-pairs.sh 거래종류별 symbol들을 txt 파일 타입으로 저장하는데 사용한다.

 

나는 비트코인 선물거래에만 관심이 있음으로 'download-futures-klines-simultaneously.sh'를 사용하면 될 것 같은데.

스크립트의 내용을 보니 스크립트가 인자를 받아서 처리하는 방식이 아니라 스크립트의 내용을 수정한후 실행을 해야 하는 방식이다.

그래서 이렇게 살짝 수정후 사용을 하도록 해야 한다. (download_futures.sh 를 만들어서 진행하자.)

 

- 복사본을 하나 만들어서 수정하자 -

> cp download-futures-klines-simultaneously.sh download_futures.sh
> chmod +x download_futures.sh
> vim download_futures.sh

 

바이낸스 선물 USDT Market에서 비트코인 1분 지표를 2020년~2023년까지 다운로드 받기 위해 아래와 같이 수정했다.

# Bash script who permit to download the perpetuals futures klines simultaneously.
# That's mean that the script create few sub-processes for download the data asynchronously


CM_OR_UM="um"
SYMBOLS=(BTCUSDT)
INTERVALS=("1m")
YEARS=("2020" "2021" "2022" "2023")
MONTHS=("01" "02" "03" "04" "05" "06" "07" "08" "09" "10" "11" "12")


# First we verify if the CM_OR_UM is correct, if not, we exit
if [ "$CM_OR_UM" = "cm" ] || [ "$CM_OR_UM" == "um" ]; then
  BASE_URL="https://data.binance.vision/data/futures/${CM_OR_UM}/monthly/klines"
else
  echo "CM_OR_UM can be only cm or um"
  exit 0
fi

# Function who download the URL, this function is called asynchronously by several child processes
download_url() {
  url=$1

  response=$(wget --server-response -q ${url} 2>&1 | awk 'NR==1{print $2}')
  if [ ${response} == '404' ]; then
    echo "File not exist: ${url}"
  else
    echo "downloaded: ${url}"
  fi
}


# Main loop who iterate over all the arrays and launch child processes
for symbol in ${SYMBOLS[@]}; do
  for interval in ${INTERVALS[@]}; do
    for year in ${YEARS[@]}; do
      for month in ${MONTHS[@]}; do
        url="${BASE_URL}/${symbol}/${interval}/${symbol}-${interval}-${year}-${month}.zip"
        download_url "${url}" &
      done
      wait
    done
  done
done

 

1분도 안걸려 2020년~2023년 까지의 1분 타임프레임 캔들을 손쉽게 다운 받을 수 있었다. (Rest API로는 다운 받을 엄두도 안나는 양이다)

2020년 이후외 1분지표를 모조리 다운 받았다.
오옷! 이렇게 쉽게?

 

2020년 1월부터 2023년 10월까지의 비트코인 1분 지표가 모두 다운로드 되었다.

(5분 지표라면 용량은 더 작을 것이다)

월단위에 1분지표가 다운로드 되었다
1분 지표 3년치가 모두 다운로드 되었다!

 

이렇게 Monthly 단위의 코인별 타임프레임 파일로 다운로드 받을 수 있지만,

최근까지의 Daily 단위까지 다운로드 받으려면 Python을 이용해 다운로드 받는 것이 좋다.

 

2-2. Python을 이용한 Candle data 다운로드 방법 (권장)

Shell보다 오히려 Python으로 다운로드를 받는것이 더 편한 것 같다. 다운로드 받은 ~/binance-public-data/python 폴더의 Readme 내용을 살짝 보고 진행해 보았다. (휴~ RestAPI로 1만번 넘게 캔들 데이터 가져오는 짓을 할뻔했는데 ㅠㅠ)

 

- 다운로드를 시작하기 전에 STORE_DIRECTORY 변수에 저장할 위치를 지정해야 한다. -

## STORE_DIRECTORY 변수에 다운로드 위치를 지정해야 한다.
> cd ~/binance-public-data/python
> pip install -r requirements.txt
> export STORE_DIRECTORY=~/binance-public-data

 

아래와 같이 하면 현재을 시간기준으로 (2023년 11월 2일)

 

Monthly 단위 파일로 2020년 ~2023년 10월까지의 파일과, Daily 단위의 2023년 11월의 일자별 데이터를 다운 받을 수 있다.

## 첫번째 명령을 통해 skip-daily로 2022~2023년 까지의 월(Monthly)단위 파일을 다운로드 받는다.  
> python3 download-kline.py -s BTCUSDT -t um -i 1m -skip-daily 1 -startDate 2020-01-01 -endDate 2023-10-31
    Found 1 symbols
    [1/1] - start download monthly BTCUSDT klines

    File Download: /Users/name/binance-public-data/data/futures/um/monthly/klines/BTCUSDT/1m/2020-01-01_2023-10-31/BTCUSDT-1m-2020-01.zip
    [##################################################]
    File Download: /Users/name/binance-public-data/data/futures/um/monthly/klines/BTCUSDT/1m/2020-01-01_2023-10-31/BTCUSDT-1m-2020-02.zip
    [##################################################]
    ... 생략 ...
    File Download: /Users/name/binance-public-data/data/futures/um/monthly/klines/BTCUSDT/1m/2020-01-01_2023-10-31/BTCUSDT-1m-2023-09.zip
    [##################################################]
    File Download: /Users/name/binance-public-data/data/futures/um/monthly/klines/BTCUSDT/1m/2020-01-01_2023-10-31/BTCUSDT-1m-2023-10.zip
    [##################################################]

## 두번째 명령을 통해 skip-monthly로 11월의 일(Daily)단위 파일을 다운로드 받는다.
> python3 download-kline.py -s BTCUSDT -t um -i 1m -skip-monthly 1 -startDate 2023-11-01 -endDate 2023-11-30
    Found 1 symbols
    [1/1] - start download daily BTCUSDT klines

    File Download: /Users/name/binance-public-data/data/futures/um/daily/klines/BTCUSDT/1m/2023-11-01_2023-11-30/BTCUSDT-1m-2023-11-01.zip
    [##################################################]
    File not found: https://data.binance.vision/data/futures/um/daily/klines/BTCUSDT/1m/BTCUSDT-1m-2023-11-02.zip

 

월별/일별 2개 폴더에 다운로드가 완료 되었다.

 

(현재 기준으로 11월은 마감이 안되었음으로 11월 지표는 월단위 파일이 없다)

Binance 비트코인 선물 1m지표를 모두 다운로드 했다
다운로드가 가능한 바이낸스 선물 1m지표를 모두 얻었다!

 

이렇게 바이낸스 선물 1분지표 캔들을 데이터를 RestAPI를 사용하는 것보다 훨씬 빠르게 다운로드를 완료할 수 있었다. 여기에 하루전까지의 1분 Candle Data를 Binance RestAPI로 2번만 조회하면 모든 Binance Candle Data를 얻을 수 있게 된다. (속이 다 시원하다 ^^)

 

다음으로는...

국내외 통틀어 코인 거래에 있어 Binance는 명실상부 가장 많은 거래량을 가지고 있어 특히 코인 선물거래에 관심이 있다면 한번쯤은 바이낸스 계정을 만들어 사용해봤을 것이다. 수동으로 바이낸스 거래를 하기도 하지만 파이썬으로 바이낸스 API를 이용한 자동거래를 만들어가는 중인데. 오토트레이딩에 머신러닝을 활용하기 위해서 REST API로 받은 1일간의 1분지표 데이터와 파이썬으로 다운로드가 완료된 3년간의 1분지표 Data까지 파이썬으로 zip파일을 압축을 해제하고 csv 파일들을 하나로 합쳐 Pandas Dataframe으로 사용할 수 있도록 해보겠다. (단계적으로 Websoket 실시간 Data를 수신해 활용하는 방향으로 가야할 것 같다)

 

바이낸스 비트코인 선물 Kline/Candle 파일로 다운받아 합치기

 

바이낸스 비트코인 선물 Kline/Candle 파일로 다운받아 합치기

Python으로 바이낸스 3년간의 비트코인 선물 1분지표 Candle 데이터를 파일로 빠르게 다운받아 머신러닝에 필요한 데이터를 얻어 낼 수 있게 되었다. 하지만 zip 파일로 다운로드만 빠르게 되었을뿐,

axgo.tistory.com

 

참고자료

https://www.binance.com/en/landing/data#data-futures

https://github.com/binance

https://github.com/binance/binance-public-data

https://data.binance.vision/