반응형
코인의 가격 데이터를 크롤링 해서 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파일로 저장한 것이다.
KRW_Market-400days.zip
1.26MB
BTC_Market-400days.zip
1.45MB
USDT_Market-400days.zip
0.17MB
이렇게 저장된 csv 파일을 불러와서 사용하려면 아래의 코드를 실행시키면 된다.
import pandas as pd df = pd.read_csv('파일이름.csv') |
반응형
'Finance > 업비트' 카테고리의 다른 글
[파이썬] 업비트 비트코인 머신러닝 가격예측 2 (3) | 2024.01.24 |
---|---|
[파이썬] 업비트 비트코인 머신러닝 가격예측 1 (0) | 2023.12.02 |
[파이썬] 업비트 티커 리스트 - 상장 400일 이하 제거 (1) | 2023.05.20 |
[파이썬] 업비트 티커 리스트 - 크롤링 (0) | 2023.05.17 |
[파이썬] 업비트 지표 구하기 - RSI(상대강도지수) (2) | 2023.03.06 |