가상화폐 자동매매

#3. 가상화폐 일봉 데이터 불러오기 (파이썬 소스 포함)

NAKYUP 2021. 1. 31. 10:56

빗썸 거래소 비트코인 자동매매 봇 만들기 #3. 가상화폐 일봉 데이터 불러오기

 

구글이나 네이버 등에서 파이썬을 이용한 가상화폐 자동매매를 검색하면, wikidocs 사이트가 자주 나옵니다. 내용도 충실하고 상세하게 설명되어 있어서 많은 도움이 됩니다. 하지만, 아쉽게도 시간이 지나면서 일부 코드가 먹통인것을 알 수 있습니다.

자동매매 프로그램의 시작이 일봉 데이터 불러오기인데요, https://wikidocs.net/21890 에 소개되고 있는 아래 코드 pybithumb.get_ohlcv는 지금은 아무값도 없는 None값을 반환하고 있어서 사용이 불가능합니다.

 

1
2
3
4
5
# ch07/07_01.py
1import pybithumb
2:  
3: df = pybithumb.get_ohlcv("BTC")
4print(df.tail())
cs

그래서, 이제는 빗썸이 제공하는 캔들스틱 시세정보를 json형식으로 받은 후, 데이터를 가공해서 일봉 데이터로 만드는 작업이 필요해졌습니다.

코드의 작동 원리 이해는 프로그래머 아니면 중요하지 않겠죠. 그래서, 저는 데이터가 어떻게 받아지는지만 확인해보겠습니다.

우선 빗썸사이트에서 캔들스틱 정보를 어떻게 안내하고 있는지 확인해보겠습니다.

REST API를 이용한 방식으로, Candlestick API는 시간 및 구간 별 빗썸 거래소 가상자산 가격, 거래량 정보를 제공합니다.

GEThttps://api.bithumb.com/public/candlestick/{order_currency}_{payment_currency}/{chart_intervals}

 

{order_currency} = 주문 통화(코인), 기본값 : BTC{payment_currency} = 결제 통화(마켓), 기본값 : KRW{chart_intervals} = 차트 간격, 기본값 : 24h {1m, 3m, 5m, 10m, 30m, 1h, 6h, 12h, 24h 사용 가능}  <출처: 빗썸 API>

 

 


기본값을 입력해서 어떤 데이터가 오는지 보겠습니다.

인터넷 주소창에 "https://api.bithumb.com/public/candlestick/BTC_KRW/24h" 입력했더니 아래와 같은 데이터가 나옵니다.

 

 

 

 

 

처음 보시는 분들은 당황하실 수도 있겠지만, { } 괄호 안에, "data":[[시간, 시가, 종가, 고가, 저가] [...] 반복] 자료 형식임을 알 수 있습니다.

그럼, data 자료를 가져와서 표 형식으로 바꾸면 된다는 걸 알 수 있습니다.

 

파이썬으로 구현하기 위해, 우선 아래와 같이 세가지 모듈을 불러오신 후,

1
2
3
import pybithumb
import requests
import pandas as pd
cs

이어서, 'data'를 변수 data로 뽑아오고, pandas DataFrame으로 변환합니다.

1
2
3
4
data=requests.get('https://api.bithumb.com/public/candlestick/BTC_KRW/24h')
data=data.json()
data=data.get("data")
df=pd.DataFrame(data)
 
cs

 

 
<df 출력 결과>


0~5까지의 컬럼명을 time, "시가", "종가", "고가", "저가"로 바꾸겠습니다. 

그리고, 시간정보의 순서가 뒤바뀌기도 하기때문에 시간순으로 '정렬하기' df.sort_values("time", inplace=True)를 해줍니다. 
 
총 2497일간의 시세 정보를 얻었는데, 너무 많은 것 같네요. 1년치만 남기도록 하고,
가격 정보가 모두 object 로 확인되니, 숫자 연산을 위해 모두 float 형식으로 바꿔줍니다.
 
 

 

1
2
3
4
5
df.rename(columns={0:'time',1:"시가"2:"종가"3:"고가",4:"저가",5:"거래량"}, inplace=True)
df.sort_values("time", inplace=True)
df=df.tail(365)
df=df[['time',"시가""종가""고가","저가","거래량"]].astype("float")
df.reset_index(drop=True, inplace=True)
cs

 

 
다시 df를 출력해보면, 보기 좋은 일봉 데이터를 얻었습니다.  👌?
 

데이터 연산을 위해서는 time 형식이 바뀌지 않는 것이 좋습니다만, 좀 더 보기좋게 바꿔보도록 해볼께요. 다만, 후속 코딩에서는 특별히 출력하지 않는 경우는 위 시간 형식을 이용하겠습니다.
 
1
2
import time
df["date"]=df["time"].apply(lambda x:time.strftime('%Y-%m-%d %H:%M', time.localtime(x/1000)))
cs

마지막 코드를 실행하고 df를 출력한 최종 화면입니다.< /p>

 

끝으로, 이 데이터프레임을 엑셀로 저장합니다. df.to_excel("btc.xlsx")

 

2021/01/31 - [주식,가상화폐 백테스팅] - [백테스팅 3] 최적 보조지표 선정을 위한 백테스팅 결과 (파이썬 소스 포함)

 

[백테스팅 3] 최적 보조지표 선정을 위한 백테스팅 결과 (파이썬 소스 포함)

앞서 게시한 백테스팅 구문을 함수로 변경하고 4가지 보조지표로 테스트한 결과를 공개합니다. MACD 보조지표를 기준으로 거래했을 때, 총 14번의 거래를 수행하고 예상 수익률이 233%로 나옵니다.

nakyup.tistory.com

반응형