매우 짧고 간단한 스크립트로 Binance 선물/현물 데이터 모두 다운받기

2021. 6. 9. 14:44Quant Trading & Investment/CryptoCurrency APIs

0. 사용 가능한 스크립트만 받아다 쓰실 분들은 맨 밑에 깃헙 링크가 있으니 가서 받고 쓰시면 된다.

1. CCXT

CCXT(CryptoCurrency eXchange Trading library) 는 매우 많은 암호화폐 거래소 API를 커버하는 라이브러리이다. php, python, js 등을 지원하는 매우 활용도가 높은 라이브러리이다. 데이터 다운로드, 주문 등이 가능하다.

 

 

2. Binance

Binance는 거래대금 기준 세계 1위 선물거래소이다. 아주 다양한 (현재 시점 100개 이상) 의 USDT 기반 선물과 인버스 선물을 지원한다. 미국 등을 제외한 바이낸스가 사용가능한 국가에서는 대부분 바이낸스를 쓰는 것 같다. 

 

3. 스크립트

그럼 긴말없이 CCXT를 이용해 모든 바이낸스 선물 데이터를 다운받아 보도록 하겠다.

 

1. CCXT 설치

pip를 이용해 쉽게 받을 수 있다

 

2. sqlite3 알아보기

sqlite3은 동시성 지원 등이 미약하지만 아주 가볍게 쓸 수 있어 로컬용 DB로 많이 활용된다. 로컬에 데이터 저장해 놓은건 동시에 누가 억세스 하거나 할 일이 없으니 매우 좋은 선택이라고 생각한다. python에 sqlite3은 기본 내장되어 있으니 그냥 쓰면 된다.

 

SQLite를 간단하게 사용하는 법은 다음 코드를 참조하시면 된다.

3. 데이터 받고 DB에 쓰기

이런 식으로 CCXT 바이낸스 객체를 초기화한다. 데이터만 받을 것이니 api 키는 필요 없다.

fetch_markets() 를 이용하면 어떤 티커가 있는지 다 받을 수 있다.

fetch_ohlcv를 이용하면 시간과 ohlcv (캔들스틱과 거래량)을 1500개 제한으로 받을 수 있다. 많은 타임프레임이 있지만 오늘은 1m으로 받아서 리샘플링 해서 쓰는걸로 하자.

 

그냥 이거 이용해서 계속 받고, DB에 쓰고 하면 된다. 데이터 가져오고, 가져온 데이터 마지막 타임스탬프 + 1부터 다시 가져오고...

사실 이 코드가 실행되기 전에 테이블을 만들고 데이터를 어디서부터 다시 받아야 하는지 체크하는 코드가 필요하다. 테이블 이름이 _symbol.replace("/", "")인 이유는, 테이블 이름은 숫자로 시작할 수 없고 / 같은 문자를 포함할 수 없어서다.

 

4. 로딩하기

sqlite에서 쿼리한 데이터는 리스트 형태로 주므로 다시 DataFrame 등으로 맨날 가공해야 한다. 게다가 쿼리문도 써야 하는데 쿼리문에 모두가 익숙하지는 않을 것이다. 그러므로 이걸 해주는 함수도 하나 만들었다.

 

5. csv 익스포팅

누구에게 데이터 일부를 검증용으로 주거나 할 때는 db보다는 csv가 당연히 편하고, 그냥 csv 포맷이 편하거나 한 사람도 있을 수 있다. 그런 사람들을 고려해서 DB에서 쿼리해 csv로 담아주는 함수도 하나 만들었다.

6. 커맨드라인 인터페이스

코드를 수정하기 좋아하는 사람은 없다. 익스포팅 모드/다운로드 모드로 동작하는 커맨드라인 인터페이스를 만들었다. 코드 구조상 db가 있는 상태에서 다운로드를 실행하시면 데이터가 어디부터 없는지 체크하고 거기서부터 다시 받으니 걱정 마시길.

 

*2021.6.11부로 깃허브에 있는 코드 버전에는 --market [spot or future] 옵션을 이용해 선/현물 데이터를 모두 다운받을 수 있다. 

7. 실행

아무 옵션 없이 그대로 실행하면 파일이 있는 경로에 디비를 만들고 모든 심볼의 데이터를 채워넣기 시작할 것이다.

 

8. 깃허브

풀 코드는 여기에 있으니, 즐겁게 사용하시고 오류나 개선사항이 있다면 이슈로 보내주시면 된다.

https://github.com/Yeachan-Heo/Binance-CCXT-Data-Downloader

 

9. 바이낸스 레퍼럴

혹시나 이 글 보고 바이낸스 가입하시면 레퍼럴(추천인) 코드에 90697590 입력해주시면 가입하시는 분도 필자도 수수료 혜택을 준다고 한다. 혹시나 생각나시면 부탁드리겠다.