비트코인 가격 데이터 csv로 얻기
바이낸스 API에서 과거 비트코인 가격 데이터를 요청한 다음 해당 데이터를 CSV 파일에 저장하는데 네 가지 옵션이 있다.
# valid intervals - 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M
# get timestamp of earliest date data is available
timestamp = client._get_earliest_valid_timestamp('BTCUSDT', '1d')
print(timestamp)
위의 코드 스니펫에서 함수를 호출 하고 BTCUSDT를 심볼로, 1d를 타임프레임으로 ._get_earliest_valid_timestamp전달한다.
# request historical candle (or klines) data
bars = client.get_historical_klines('BTCUSDT', '1d', timestamp, limit=1000)
다음으로 과거 데이터를 요청한다. 다시 한 번 기호와 변수를 넘겨줘야 한다. 또한 시작 날짜가 필요하며 이를 위해 타임스탬프 변수를 사용한다.
마지막으로 이 함수는 기본적으로 마지막 500개의 데이터 포인트를 호출한다. 최대값은 1000이다.
백그라운드에서 이 엔드포인트는 시작 시점부터 오늘까지의 모든 데이터가 반환될 때까지 한 번에 1000개의 가격 포인트를 수집하면서 루프에서 API를 계속 쿼리한다.
다음은 Binance API 설명서에 따라 반환되는 데이터의 정의이다.

이제 파일에 저장하는 네 가지 옵션을 살펴보겠다.
# option 1 - save to file using json method
with open('btc_bars.json', 'w') as e:
json.dump(bars, e)
첫 번째는 JSON 라이브러리를 사용하는 것이다. 이렇게 하면 목록의 목록인 데이터 구조가 유지된다. 이 옵션을 사용하려면 import json 을 해줘야 한다.(물론 디펜던시 역시 설치되어 있어야 한다.)
# option 2 - save as CSV file using the csv writer library
with open('btc_bars.csv', 'w', newline='') as f:
wr = csv.writer(f)
for line in bars:
wr.writerow(line)
두 번째 방법은 csv writer를 사용하여 목록을 CSV 파일로 저장하는 것이다. 이 옵션은 import csv 가 필요하다
# option 3 - save as CSV file without using a library.
with open('btc_bars2.csv', 'w') as d:
for line in bars:
d.write(f'{line[0]}, {line[1]}, {line[2]}, {line[3]}, {line[4]}\n')
세 번째 옵션은 라이브러리를 사용하지 않는다. Python 3 이상의 기본 기능인 f 문자열을 사용했다.
여기서는 date , open , high , low , close 의 처음 5개 열만 저장한다.
또는 필요하지 않은 경우 다음과 같이 추가 열을 삭제할 수도 있다.
# delete unwanted data - just keep date, open, high, low, close
for line in bars:
del line[5:]
마지막 옵션은 Pandas의 CSV로 내보내기 기능을 활용하는 것이다. 어쨌든 DataFrame에 데이터를 보유할 계획이라면 이 옵션을 사용하는 것이 좋다. (물론 pandas가 설치되어 있어야 한다.)
# option 4 - create a Pandas DataFrame and export to CSV
btc_df = pd.DataFrame(bars, columns=['date', 'open', 'high', 'low', 'close'])
btc_df.set_index('date', inplace=True)
print(btc_df.head())
데이터를 DataFrame으로 전달하고 열을 정의했다. 원치 않는 일부 열을 삭제했으므로 정의해야 하는 열은 5개뿐이다.
이것이 현재 DataFrame의 모습이다.

날짜 열은 시계열 인덱싱된 DataFrame을 만드는 인덱스로 설정되었다. 이렇게 하면 나중에 시간 프레임을 기준으로 조작하기가 더 쉽다. 또한 CSV로 저장하려고 할 때 필요하지 않은 추가 인덱스 열을 제거한다.
마지막으로 DataFrame을 CSV 파일로 내보낼 수 있다.
# export DataFrame to csv
btc_df.to_csv('btc_bars3.csv')
2021년 8월 30일 바이낸스는 현물 및 선물 시장 모두에 대한 과거 시장 데이터를 호스팅하는 새로운 웹사이트를 출시했다.
링크 : 바이낸스 데이터 수집 페이지
거기에서 관련 시장(현물 또는 선물)을 선택한다. 그런 다음 데이터의 기간을 선택할 수 있다.
이 시점에서 원하는 데이터 유형을 선택할 수 있다. 일반적인 데이터 유형은 다음과 같다.
- aggTrades – 10초 블록으로 집계된 틱 데이터
- klines – 캔들 또는 바. 이 데이터는 OHLC 형식(Open, High, Low, Close)을 갖는다.
- 거래 – 발생한 모든 거래의 기록. 틱 데이터라고도 함

바이낸스에서 다운로드 가능한 시장 데이터
데이터는 ZIP 형식입니다. 압축을 풀면 CSV 형식
웹사이트는 시장 데이터를 대량으로 다운로드할 수 있는 좋은 방법이다. Binance는 대량의 데이터를 다운로드하기 위해 API 사용을 시도하고 억제하기 위해 만들었다. 이는 주문 전송과 같은 다른 사용을 위해 API를 우선적으로 사용할 수 있도록 하기 위한 것이다.
API를 사용하여 과거 데이터를 대량으로 다운로드하는 경우 시간이 오래 걸린다는 것을 알 수 있다. 이는 Binance가 이러한 유형의 API 요청을 조절하기 때문이다.
또한 python-binance 라이브러리는 특정 시장 데이터 요청(예: 틱 데이터)에서 지연을 구현하여 API 과부하로 인해 실수로 API 차단을 받지 않도록 한다.
선물 또는 현물?
선물 시장에서는 나중에 암호화폐를 구매하는 계약을 체결할 수 있다. 즉, 거래를 시작하면 실제 소유권을 가지지 않는다.
선물 거래의 가장 큰 장점은 소유하지 않은 자산을 공매도할 수 있다는 것이다. 이는 차익 거래 및 헤징 전략에 유용할 수 있다.
선물 거래의 또 다른 측면은 그것이 마진으로 이루어진다는 것이다. 즉, 거래 가치의 일부만 올리면 레버리지를 사용할 수 있다.
바이낸스는 마진으로 현물 시장을 거래할 수 있는 별도의 옵션이 있다. 그러나 공매도 한도는 상당히 낮고 이자(차입 비용)는 선물 거래보다 훨씬 높다.
다양한 운반 비용으로 인해 선물 가격은 일반적으로 주요 시장과 다르거나 현물 가격으로 알려져 있다. 그러나 가격은 일반적으로 선물 계약 만기일까지 수렴된다.
바이낸스와 함께 선물 거래의 큰 장점은 거래 수수료가 현물에 비해 상당히 낮다는 것이다.
Binance API는 선물 거래를 위해 다른 Endpoint 를 사용한다. 그러나 python-binance 라이브러리를 사용하는 경우 이러한 엔드포인트는 이미 라이브러리에 구성되어 있다.
예를 들어 현물 거래를 하는 경우 다음 기능을 사용하여 미결 주문에 액세스할 수 있다.
client.get_open_orders
선물을 거래하는 경우 다음을 사용한다.
client.futures_get_open_orders
20 SMA와 같은 기술 지표에 액세스하는 방법
기술 지표 계산 과정을 쉽게 해주는 여러 라이브러리가 있다.
DataFrame을 CSV 파일로 내보낼 수 있는 방법은 이미 알아보았다. Pandas로 할 수 있는 일이 훨씬 더 많으며 이동 평균 계산도 그 중 하나이다.
예를 들면 다음과 같다.
import btalib
import pandas as pd
# load DataFrame
btc_df = pd.read_csv('btc_bars3.csv', index_col=0)
btc_df.set_index('date', inplace=True)
btc_df.index = pd.to_datetime(btc_df.index, unit='ms')
# calculate 20 moving average using Pandas
btc_df['20sma'] = btc_df.close.rolling(20).mean()
print(btc_df.tail(5))
위의 코드에서는 이전에 만든 CSV 파일에서 데이터를 로드했다. 그런 다음 mean() 함수를 사용하여 닫기 열의 평균을 계산한다.
롤링 기능을 사용하면 이동 평균 기간을 설정할 수 있다. 이 모든 것이 기존 DataFrame에 추가된다.

보다시피 이동 평균이 20인 새 열이 생성되었다.
현재 이동 평균이 어디에 있는지만 알면 된다고 가정해 보겠다. 또는 DataFrame의 마지막 가격대를 기준으로 하겠다.
동일한 mean() 함수를 사용하고 다음과 같이 DataFrame의 마지막 20개 행에서 실행할 수 있다.
# calculate just the last value for the 20 moving average
mean = btc_df.close.tail(20).mean()
Pandas가 할 수 있는 일이 훨씬 더 많다. 다음과 같이 올해 거래된 비트코인 최고가를 쉽게 파악할 수 있다.
# get the highest closing price in 2020
max_val = btc_df.close['2020'].max()
그러나 Pandas는 RSI 또는 MACD와 같은 다른 기술 지표를 계산할 수 없다.
따라서 추가적인 라이브러리를 알아보자.
다음과 같이 PIP를 사용하여 Bta-lib를 설치할 수 있다.
pip install bta-lib
비교를 위해 라이브러리를 사용하여 동일한 이동 평균을 계산해 보면.
sma = btalib.sma(btc_df.close)
print(sma.df)
이제 이동 평균 값을 포함하는 별도의 DataFrame이 생긴다.

bta-lib는 객체를 sma 변수로 반환한다. 그 안에 포함된 DataFrame에 액세스하려면 .df변수 이름 다음에 입력하기만 하면 된다.
기본적으로 라이브러리는 30주기 이동 평균을 사용한다.
이전에 사용했던 것과 동일한 함수를 복제하고 20 이동 평균을 계산하고 이를 원래 DataFrame에 열로 첨부할 수 있다.
# create sma and attach as column to original df
btc_df['sma'] = btalib.sma(btc_df.close, period=20).df
print(btc_df.tail())
몇 가지 지표를 더 알아보자. 다음은 bta-lib 라이브러리를 사용하여 RSI를 계산하는 방법이다.
rsi = btalib.rsi(btc_df, period=14)
다시 한 번 df를 포함하는 개체가 반환되었다. 이와 같이 맨 마지막 값에 액세스할 수 있다.
print(rsi.df.rsi[-1])
다음은 bta-lib에서 비트코인의 MACD를 계산하는 방법이다.
macd = btalib.macd(btc_df, pfast=20, pslow=50, psignal=13)
마지막으로 RSI 및 MACD 값을 원래 Bitcoin 가격 DataFrame에 결합한다.
# join the rsi and macd calculations as columns in original df
btc_df = btc_df.join([rsi.df, macd.df])
print(btc_df.tail())
이제 하나의 DataFrame에서 모든 계산에 쉽게 액세스할 수 있다.

'Project > AlgoTrading' 카테고리의 다른 글
| Elliott Wave Analyzer 적용 [1] (0) | 2023.06.12 |
|---|---|
| Binance API 기초 [4] (0) | 2023.06.07 |
| Binance API 기초 [2] (0) | 2023.06.06 |
| Binance API 기초 [1] (0) | 2023.06.06 |
| Binance API를 이용한 Algorithm trading (0) | 2023.06.04 |