[파이썬] 업비트 코인별 가격 데이터 - 크롤링
2023. 9. 30. 15:12ㆍ자동매매/업비트
반응형
코인의 가격 데이터를 크롤링 해서 csv 파일로 저장해 놓으면, 자동매매를 하기 위해서 각종 지표들을 계산할 때 마다 매번 API를 호출하지 않아도 된다.
따라서 장기간의 데이터로 계산을 해야되는 지표들을 사용할 때, 데이터를 다운받는 시간을 줄일 수 있고, 그로 인해서 지표 계산과 매수/매도 주문이 지연되는 것도 예방할 수 있다.
아래의 코드를 실행하면, 업비트에서 KRW 마켓, BTC 마켓, USDT 마켓에서 거래 가능한 코인들의 가격 데이터를 코드가 실행되는 날짜 기준으로 과거 400일 동안의 데이터를 각 코인별로 csv 파일로 저장(400일 이상 거래된 코인에 한함)이 된다.
import json import time import pandas as pd import pyupbit import urllib.request # 데이터 400개 받아오기 def get_ohlcv400(ticker): df = pyupbit.get_ohlcv(ticker, interval="day", count=400) return df # 400일 이동평균선 정의 def get_ma400(ticker): ma400 = df['close'].rolling(400).mean().iloc[-1] return ma400 # 업비트 티커 url url = "https://api.upbit.com/v1/market/all" # 데이터프레임 입력용 krw_market = [] btc_market = [] usdt_market = [] t1 = urllib.request.urlopen(url) t2 = json.loads( t1.read().decode("utf-8")) # 리스트내 티커 탐색용 n = 0 try: while True: b = t2[n]["market"] if "KRW-" in b: krw_market.append(b) elif "BTC-" in b: btc_market.append(b) elif "USDT-" in b: usdt_market.append(b) n = n + 1 except: pass print() print() print(krw_market) print() print("KRW Market Qty : ", len(krw_market)) print() print() print(btc_market) print() print("BTC Market Qty : ", len(btc_market)) print() print() print(usdt_market) print() print("USDT Market Qty : ", len(usdt_market)) |
print() print("Listing Period checking......") ########## KRW Market ########## print() for xx in krw_market: time.sleep(1) df = get_ohlcv400(xx) # index를 칼럼으로 이동 df.reset_index(inplace=True) # 칼럼 이름을 'datetime'으로 변경 df.rename(columns={'index': 'datetime'}, inplace=True) # 'datetime' 칼럼을 문자열로 변환 df['datetime'] = df['datetime'].astype(str) # 'datetime' 칼럼을 날짜와 시간으로 나누어 'date'와 'time' 칼럼 생성 df['date'] = df['datetime'].str[:10] # 처음 10글자는 날짜 df['time'] = df['datetime'].str[11:] # 11번째 글자부터 끝까지는 시간 # 'datetime' 칼럼은 더 이상 필요하지 않으므로 삭제 df.drop(columns=['datetime'], inplace=True) # 칼럼의 순서 변경 df = df[['date', 'time', 'open', 'high', 'low', 'close', 'volume', 'value']] # 'date' 칼럼을 날짜 형식으로 변경 df['date'] = pd.to_datetime(df['date']) # 'time' 칼럼을 시간 형식으로 변경 df['time'] = pd.to_datetime(df['time'], format='%H:%M:%S').dt.time # 이동평균 구하기 = 원하는 기간만큼 데이터가 있는지 확인용 ma400 = get_ma400(xx) if ma400 > 0: print(df) df.to_csv(f'{xx}.csv', index=False) else: print(str(xx), "deleted") krw_market.remove(xx) ########## BTC Market ########## print() for yy in btc_market: time.sleep(1) df = get_ohlcv400(yy) # index를 칼럼으로 이동 df.reset_index(inplace=True) # 칼럼 이름을 'datetime'으로 변경 df.rename(columns={'index': 'datetime'}, inplace=True) # 'datetime' 칼럼을 문자열로 변환 df['datetime'] = df['datetime'].astype(str) # 'datetime' 칼럼을 날짜와 시간으로 나누어 'date'와 'time' 칼럼 생성 df['date'] = df['datetime'].str[:10] # 처음 10글자는 날짜 df['time'] = df['datetime'].str[11:] # 11번째 글자부터 끝까지는 시간 # 'datetime' 칼럼은 더 이상 필요하지 않으므로 삭제 df.drop(columns=['datetime'], inplace=True) # 칼럼의 순서 변경 df = df[['date', 'time', 'open', 'high', 'low', 'close', 'volume', 'value']] # 'date' 칼럼을 날짜 형식으로 변경 df['date'] = pd.to_datetime(df['date']) # 'time' 칼럼을 시간 형식으로 변경 df['time'] = pd.to_datetime(df['time'], format='%H:%M:%S').dt.time # 이동평균 구하기 = 원하는 기간만큼 데이터가 있는지 확인용 ma400 = get_ma400(yy) if ma400 > 0: print(df) df.to_csv(f'{yy}.csv', index=False) else: print(str(yy), "deleted") btc_market.remove(yy) ########## USDT Market ########## print() for zz in usdt_market: time.sleep(1) df = get_ohlcv400(zz) # index를 칼럼으로 이동 df.reset_index(inplace=True) # 칼럼 이름을 'datetime'으로 변경 df.rename(columns={'index': 'datetime'}, inplace=True) # 'datetime' 칼럼을 문자열로 변환 df['datetime'] = df['datetime'].astype(str) # 'datetime' 칼럼을 날짜와 시간으로 나누어 'date'와 'time' 칼럼 생성 df['date'] = df['datetime'].str[:10] # 처음 10글자는 날짜 df['time'] = df['datetime'].str[11:] # 11번째 글자부터 끝까지는 시간 # 'datetime' 칼럼은 더 이상 필요하지 않으므로 삭제 df.drop(columns=['datetime'], inplace=True) # 칼럼의 순서 변경 df = df[['date', 'time', 'open', 'high', 'low', 'close', 'volume', 'value']] # 'date' 칼럼을 날짜 형식으로 변경 df['date'] = pd.to_datetime(df['date']) # 'time' 칼럼을 시간 형식으로 변경 df['time'] = pd.to_datetime(df['time'], format='%H:%M:%S').dt.time # 이동평균 구하기 = 원하는 기간만큼 데이터가 있는지 확인용 ma400 = get_ma400(zz) if ma400 > 0: print(df) df.to_csv(f'{zz}.csv', index=False) else: print(str(xx), "deleted") usdt_market.remove(zz) |
반응형
아래의 첨부파일은 2023년 9월 29일 기준으로 과거 400일 동안의 코인별 가격 데이터를 크롤링하여 csv파일로 저장한 것이다.
이렇게 저장된 csv 파일을 불러와서 사용하려면 아래의 코드를 실행시키면 된다.
import pandas as pd df = pd.read_csv('파일이름.csv') |
반응형
'자동매매 > 업비트' 카테고리의 다른 글
[파이썬] 업비트 비트코인 머신러닝 가격예측 2 (0) | 2024.01.24 |
---|---|
[파이썬] 업비트 비트코인 머신러닝 가격예측 1 (0) | 2023.12.02 |
[파이썬] 업비트 티커 리스트 - 상장 400일 이하 제거 (1) | 2023.05.20 |
[파이썬] 업비트 티커 리스트 - 크롤링 (0) | 2023.05.17 |
[파이썬] 업비트 지표 구하기 - RSI(상대강도지수) (2) | 2023.03.06 |