|
http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Board&no=37823 [복사]
import pyupbit
import numpy as np
import pandas as pd
import time
import datetime
import re
import os
import matplotlib.pyplot as plt
# 날짜 갯수 차이 구하기
def cal_data_different(coin, interval, day_count):
df = pd.read_excel(os.path.join(os.getcwd(),'C:/Users/mark/Desktop/',f"{coin}.xlsx"),index_col=0)
past = datetime.datetime.strptime(str(df.iloc[-1].name), f'%Y-%m-%d %H:%M:00')
now = datetime.datetime.now().strftime(f'%Y-%m-%d %H:%M:00')
now = datetime.datetime.strptime(now, f'%Y-%m-%d %H:%M:00')
diff = str(now-past)
n = re.sub(r'[^0-9]', '', interval, day_count)
h, m, s = list(map(int, diff.split(":")))
total_time_diff = (h * 60) + m + s # 분으로 환산
total_diff_num = int(total_time_diff / int(n))
if "day" in diff: # interval이 day이상 넘어갈 경우
print("Create new file")
df = pyupbit.get_ohlcv(coin, count=day_count, interval=interval)
time.sleep(0.1)
df = df.drop('value', axis=1)
df = cal_indicators(df)
df.to_excel(excel_writer="C:/Users/mark/Desktop/{coin}.xlsx") # 엑셀 저장
print(f"{coin} Data is saved. . . ")
return df
else:
if total_diff_num > 0: # 갱신이 필요할경우
print('Update Required.') # str(df.iloc[-1,0])
orig_df = df.copy()
dfs = pyupbit.get_ohlcv(coin, count=total_diff_num, interval=interval)
dfs = dfs.drop('value', axis=1)
df = pd.concat([df,dfs], ignore_index=False)
cal_df = cal_indicators(df[-50:])
df = pd.concat([orig_df,cal_df[-total_diff_num:]])
df.to_excel(excel_writer=f'C:/Users/mark/Desktop/{coin}.xlsx')
print(f"Success Update.({coin} update {total_diff_num} amount)")
return df
else: # 갱신이 필요 없을 경우
print("No update")
return df
# 데이터 실시간 저장하기
def save_DataFrame(coin, interval, day_count):
coin = coin # 코인명
interval = interval # 차트의 종류 (minute1,3,5,10,15,30,60), day
day_count = day_count # 데이터 수
if os.path.exists(os.path.join(os.getcwd(),'C:/Users/mark/Desktop/',f"{coin}.xlsx")): # data가 있을 경우
print("File exist.")
return cal_data_different(coin, interval, day_count)
else: # data 가 없을 경우
print("Create new Dataframe file")
df = pyupbit.get_ohlcv(coin, count=day_count, interval=interval)
time.sleep(0.1)
df = df.drop('value', axis=1)
df = cal_indicators(df)
df.to_excel(excel_writer=f"C:/Users/mark/Desktop/{coin}.xlsx") # 엑셀 저장
print(f"{coin} Data is saved. . . ")
return df
# 현재가 조회
def get_current_price(coin):
print(pyupbit.get_current_price(coin))
return pyupbit.get_current_price(coin)
# 보조지표 구하기
def cal_indicators(DataFrame):
df = DataFrame
# Moving Average
df['MA3'] = df['close'].rolling(window=3).mean()
df['MA5'] = df['close'].rolling(window=5).mean()
df['MA10'] = df['close'].rolling(window=10).mean()
df['MA15'] = df['close'].rolling(window=15).mean()
df['MA20'] = df['close'].rolling(window=20).mean() # 20일 평균 이동 : 중간 볼린저 밴드
df['MA30'] = df['close'].rolling(window=30).mean()
# RSI
rsi_interval = 14
df['U'] = np.where(df.diff(1)['close'] > 0, df.diff(1)['close'],0)
df['D'] = np.where(df.diff(1)['close'] < 0, df.diff(1)['close']*(-1), 0)
df['AU'] = df['U'].rolling(rsi_interval).mean()
df['AD'] = df['D'].rolling(rsi_interval).mean()
df['RSI'] = (df['AU'] / (df['AU']+df['AD'])) *100
# df['RSI_Signal'] = df['RSI'].rolling(9).mean()
del df['U'], df['D'], df['AU'], df['AD']
# MACD
df['MACD_EMA12'] = df['close'].ewm(span=12).mean()
df['MACD_EMA26'] = df['close'].ewm(span=26).mean()
df['MACD'] = df['MACD_EMA12'] - df['MACD_EMA26']
df['MACD_signal'] = df['MACD'].ewm(span=9).mean()
# Bollinger Band
df['Bollinger_stddev'] = df['close'].rolling(window=20).std() # 20일 이동 표준편차
df['Bollinger_upper'] = df['MA20'] + (df['Bollinger_stddev'] * 2) # 상단 볼린저 밴드
df['Bollinger_lower'] = df['MA20'] - (df['Bollinger_stddev'] * 2) # 상단 볼린저 밴드
return df
##############################################################################################
if __name__ =="__main__":
pd.set_option('mode.chained_assignment', None) # 경고 off
print("-----------------------Main-----------------------")
print(f'Stat time : {datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")}')
# 기본 셋팅
start_time = datetime.datetime.now()
coins = pyupbit.get_tickers(fiat="KRW-BTC") # 코인들
interval = "day" # 차트의 종류 (minute1,3,5,10,15,30,60), day
day_count = 365 # 조회할 데이터 양
# # 데이터 저장 혹은 불러오기, 데이터 가공하기
while True:
for coin in coins:
df = save_DataFrame(coin,interval,day_count)
time.sleep(1) |
Hit : 2042 Date : 2024/09/13 01:40
|