[파이썬] 업비트 코인별 가격 데이터 - 크롤링

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파일로 저장한 것이다.

 

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')

 

반응형