Files
DeepStock/JSDPattern_minutely.py
dsyoon d5e5316fce init
2024-04-26 07:47:48 +09:00

641 lines
38 KiB
Python

# https://bibot.tistory.com/63
# https://nonmeyet.tistory.com/entry/Python-TALib%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EB%B9%84%ED%8A%B8%EC%BD%94%EC%9D%B8%EC%A3%BC%EA%B0%80%EA%B8%B0%EC%88%A0%EB%B6%84%EC%84%9D-%EB%B3%B4%EC%A1%B0%EC%A7%80%ED%91%9C-%EC%B6%94%EA%B0%80
# https://lunadaddy.tistory.com/122
# https://wikidocs.net/186885
import numpy as np
np.seterr(divide='ignore', invalid='ignore')
from scipy.signal import argrelextrema
# https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib
# https://lunadaddy.tistory.com/122
import talib
import pandas as pd
from datetime import datetime, timedelta
from sklearn.preprocessing import MinMaxScaler
from JSDPattern import JSDPattern
class JSDPattern_minutely (JSDPattern):
scaler = None
def __init__(self, RESOURCE_PATH=None):
super().__init__(RESOURCE_PATH)
self.scaler = MinMaxScaler()
return
def get_Support_Resistance(self, df):
n = 10
support_df = df.iloc[argrelextrema(df.values, np.less_equal, order=n)[0]]
resistance_df = df.iloc[argrelextrema(df.values, np.greater_equal, order=n)[0]]
support, resistance = np.zeros(len(df)), np.zeros(len(df))
support[0], resistance[0] = df[0].iloc[0], df[0].iloc[0]
s_i, r_i = 0, 0
for i in range(1, len(df)):
if s_i < len(support_df) and df.index[i] == support_df.index[s_i]:
support[i] = support_df[0].iloc[s_i]
s_i += 1
else:
support[i] = support[i-1]
if r_i < len(resistance_df) and df.index[i] == resistance_df.index[r_i]:
resistance[i] = resistance_df[0].iloc[r_i]
r_i += 1
else:
resistance[i] = resistance[i-1]
return support, resistance
def analyze_raw(self, result):
result["volume"] = [result["volume"][i] if 0 < result["volume"][i] else 1 for i in range(len(result["volume"]))]
# 기본 캔들 정보
open_df = pd.DataFrame(result["open"])
close_df = pd.DataFrame(result["close"])
high_df = pd.DataFrame(result["high"])
low_df = pd.DataFrame(result["low"])
volume_df = pd.DataFrame(result["volume"])
# 중복 제거
ymd_df = pd.DataFrame(result["ymd"])
data_dup = pd.concat([ymd_df, open_df, close_df, high_df, low_df, volume_df], axis=1)
data_dup.columns = ["ymd", "open", "close", "high", "low", "volume"]
data_dup.index = pd.DatetimeIndex(result["ymd"])
data_dup_sorted = data_dup.sort_index(ascending=True)
data_dup_sorted = data_dup_sorted.drop_duplicates()
ymd_df = data_dup_sorted["ymd"]
open_df = data_dup_sorted["open"]
close_df = data_dup_sorted["close"]
high_df = data_dup_sorted["high"]
low_df = data_dup_sorted["low"]
volume_df = data_dup_sorted["volume"]
ymd = ymd_df.tolist()
open = open_df.tolist()
close = close_df.tolist()
high = high_df.tolist()
low = low_df.tolist()
volume = volume_df.tolist()
volume_rate = np.zeros(len(close))
head_rate, body_rate, tail_rate = np.zeros(len(close)), np.zeros(len(close)), np.zeros(len(close))
open_low_rate, open_high_rate, open_open_rate, open_close_rate = np.zeros(len(close)), np.zeros(len(close)), np.zeros(len(close)), np.zeros(len(close))
close_low_rate, close_high_rate, close_open_rate, close_close_rate = np.zeros(len(close)), np.zeros(len(close)), np.zeros(len(close)), np.zeros(len(close))
for i in range(len(close)):
length = high[i] - low[i]
if 0 < length:
max_value = max(open[i], close[i])
min_value = min(open[i], close[i])
head_rate[i] = (high[i] - max_value) / length
body_rate[i] = (max_value - min_value) / length
tail_rate[i] = (min_value - low[i]) / length
if 0 < i:
if 0 < volume[i-1]:
volume_rate[i] = volume[i]/volume[i-1]
open_low_rate[i] = (low[i] - open[i-1])/open[i-1]
open_high_rate[i] = (high[i] - open[i-1])/open[i-1]
open_open_rate[i] = (open[i] - open[i-1])/open[i-1]
open_close_rate[i] = (close[i] - open[i-1])/open[i-1]
close_low_rate[i] = (low[i] - close[i-1])/close[i-1]
close_high_rate[i] = (high[i] - close[i-1])/close[i-1]
close_open_rate[i] = (open[i] - close[i-1])/close[i-1]
close_close_rate[i] = (close[i] - close[i-1])/close[i-1]
support, resistance = self.get_Support_Resistance(pd.DataFrame(close))
#z = np.polyfit(df['speed'], df['dist'], 1) # 기울기와 절편 확인
#f = np.poly1d(z) # f(x): f함수
if 5 < len(close):
poly_5 = [0] * 4 + [np.polyfit(range(5), close[i - 4: i + 1], 1)[0] for i in range(4, len(close))]
else:
poly_5 = [0] * len(close)
if 10 < len(close):
poly_10 = [0] * 9 + [np.polyfit(range(10), close[i - 9: i + 1], 1)[0] for i in range(9, len(close))]
else:
poly_10 = [0] * len(close)
if 20 < len(close):
poly_20 = [0] * 19 + [np.polyfit(range(20), close[i - 19: i + 1], 1)[0] for i in range(19, len(close))]
else:
poly_20 = [0] * len(close)
if 60 < len(close):
poly_60 = [0] * 59 + [np.polyfit(range(60), close[i - 59: i + 1], 1)[0] for i in range(59, len(close))]
else:
poly_60 = [0] * len(close)
if 120 < len(close):
poly_120 = [0] * 119 + [np.polyfit(range(120), close[i - 119: i + 1], 1)[0] for i in range(119, len(close))]
else:
poly_120 = [0] * len(close)
if 240 < len(close):
poly_240 = [0] * 239 + [np.polyfit(range(240), close[i - 239: i + 1], 1)[0] for i in range(239, len(close))]
else:
poly_240 = [0] * len(close)
if 480 < len(close):
poly_480 = [0] * 479 + [np.polyfit(range(480), close[i - 479: i + 1], 1)[0] for i in range(479, len(close))]
else:
poly_480 = [0] * len(close)
if 720 < len(close):
poly_720 = [0] * 719 + [np.polyfit(range(720), close[i - 719: i + 1], 1)[0] for i in range(719, len(close))]
else:
poly_720 = [0] * len(close)
if 1440 < len(close):
poly_1440 = [0] * 1439 + [np.polyfit(range(1440), close[i - 1439: i + 1], 1)[0] for i in range(1439, len(close))]
else:
poly_1440 = [0] * len(close)
# 7일 신고가
new_high_7 = [0 for c in range(6)] + [1 if (close[c - 1] is not None and close[c] is not None and close[c - 1] < close[c]) and None not in close[c - 6:c + 1] and max(close[c - 6:c]) < close[c] else 0 for c in range(6, len(close))]
# 9일 신고가
new_high_9 = [0 for c in range(8)] + [1 if (close[c - 1] is not None and close[c] is not None and close[c - 1] < close[c]) and None not in close[c - 8:c + 1] and max(close[c - 8:c]) < close[c] else 0 for c in range(8, len(close))]
# 26일 신고가
new_high_26 = [0 for c in range(25)] + [1 if (close[c - 1] is not None and close[c] is not None and close[c - 1] < close[c]) and None not in close[c - 25:c + 1] and max(close[c - 25:c]) < close[c] else 0 for c in range(25, len(close))]
# 7일 신저가
new_low_7 = [0 for c in range(6)] + [1 if (close[c - 1] is not None and close[c] is not None and close[c - 1] < close[c]) and None not in close[c - 6:c + 1] and close[c - 6] < min(close[c - 6:c + 1]) else 0 for c in range(6, len(close))]
# 9일 신저가
new_low_9 = [0 for c in range(8)] + [1 if (close[c - 1] is not None and close[c] is not None and close[c - 1] < close[c]) and None not in close[c - 8:c + 1] and close[c - 8] < min(close[c - 8:c + 1]) else 0 for c in range(8, len(close))]
# 26일 신저가
new_low_26 = [0 for c in range(25)] + [1 if (close[c - 1] is not None and close[c] is not None and close[c - 1] < close[c]) and None not in close[c - 25:c + 1] and close[c - 25] < min(close[c - 25:c + 1]) else 0 for c in range(25, len(close))]
high_th = [0]
for i in range(1, len(close)):
count = 0
for c in range(i - 1, i - 30, -1):
if c < 0:
break
if close[i] < close[c]:
break
else:
count += 1
high_th.append(count)
# 이동 평균
close_df = pd.DataFrame(close)
avg5_df = close_df.ewm(5).mean()
avg10_df = close_df.ewm(10).mean()
avg20_df = close_df.ewm(20).mean()
avg60_df = close_df.ewm(60).mean()
avg120_df = close_df.ewm(120).mean()
avg240_df = close_df.ewm(240).mean()
avg480_df = close_df.ewm(480).mean()
avg720_df = close_df.ewm(720).mean()
avg1440_df = close_df.ewm(1440).mean()
# 이격도
disparity_avg5_df = (close_df / close_df.ewm(span=5, min_periods=5, adjust=False).mean())
disparity_avg5_df = disparity_avg5_df.replace({None: np.nan})
disparity_avg20_df = (close_df / close_df.ewm(span=20, min_periods=20, adjust=False).mean())
disparity_avg20_df = disparity_avg20_df.replace({None: np.nan})
disparity_avg60_df = (close_df / close_df.ewm(span=60, min_periods=60, adjust=False).mean())
disparity_avg60_df = disparity_avg60_df.replace({None: np.nan})
disparity_avg120_df = (close_df / close_df.ewm(span=120, min_periods=120, adjust=False).mean())
disparity_avg120_df = disparity_avg120_df.replace({None: np.nan})
disparity_avg240_df = (close_df / close_df.ewm(span=240, min_periods=240, adjust=False).mean())
disparity_avg240_df = disparity_avg240_df.replace({None: np.nan})
disparity_avg480_df = (close_df / close_df.ewm(span=480, min_periods=480, adjust=False).mean())
disparity_avg480_df = disparity_avg480_df.replace({None: np.nan})
disparity_avg720_df = (close_df / close_df.ewm(span=720, min_periods=720, adjust=False).mean())
disparity_avg720_df = disparity_avg720_df.replace({None: np.nan})
disparity_avg1440_df = (close_df / close_df.ewm(span=1440, min_periods=1440, adjust=False).mean())
disparity_avg1440_df = disparity_avg1440_df.replace({None: np.nan})
disparity_avg2880_df = (close_df / close_df.ewm(span=2880, min_periods=2880, adjust=False).mean())
disparity_avg2880_df = disparity_avg2880_df.replace({None: np.nan})
""""""
n, t = 20, 2
max_20 = close_df.rolling(window=n).mean()
stddev_20 = close_df.rolling(window=n).std()
upper_20 = max_20 + (stddev_20 * t) # 상단 볼리저 밴드
lower_20 = max_20 - (stddev_20 * t) # 하단 볼리저 밴드
middle_20 = (upper_20 + lower_20) / 2
width_df = (upper_20 - lower_20) / middle_20
width_min = np.min(width_df[0])
width_max = np.max(width_df[0])
bb_width_df = 100 * (width_df - width_min) / (width_max - width_min)
bb_pb_df = 100 * (close_df - lower_20) / (upper_20 - lower_20)
upper_20 = list(np.reshape(upper_20.values, -1))
lower_20 = list(np.reshape(lower_20.values, -1))
middle_20 = list(np.reshape(middle_20.values, -1))
np_high, np_low, np_close = np.array(high, dtype=np.float64), np.array(low, dtype=np.float64), np.array(close, dtype=np.float64)
slowk_5_df, slowd_5_df = talib.STOCH(np_high, np_low, np_close, fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0)
slowk_10_df, slowd_10_df = talib.STOCH(np_high, np_low, np_close, fastk_period=10, slowk_period=6, slowk_matype=0, slowd_period=6, slowd_matype=0)
slowk_20_df, slowd_20_df = talib.STOCH(np_high, np_low, np_close, fastk_period=20, slowk_period=12, slowk_matype=0, slowd_period=12, slowd_matype=0)
slowk_60_df, slowd_60_df = talib.STOCH(np_high, np_low, np_close, fastk_period=60, slowk_period=37, slowk_matype=0, slowd_period=37, slowd_matype=0)
slowk_120_df, slowd_120_df = talib.STOCH(np_high, np_low, np_close, fastk_period=120, slowk_period=74, slowk_matype=0, slowd_period=74, slowd_matype=0)
slowk_240_df, slowd_240_df = talib.STOCH(np_high, np_low, np_close, fastk_period=240, slowk_period=148, slowk_matype=0, slowd_period=148, slowd_matype=0)
slowk_480_df, slowd_480_df = talib.STOCH(np_high, np_low, np_close, fastk_period=480, slowk_period=296, slowk_matype=0, slowd_period=296, slowd_matype=0)
slowk_720_df, slowd_720_df = talib.STOCH(np_high, np_low, np_close, fastk_period=720, slowk_period=445, slowk_matype=0, slowd_period=445, slowd_matype=0)
slowk_1440_df, slowd_1440_df = talib.STOCH(np_high, np_low, np_close, fastk_period=1440, slowk_period=890, slowk_matype=0, slowd_period=890, slowd_matype=0)
willr = talib.WILLR(np_high, np_low, np_close, timeperiod=11) + 100
rsi = talib.RSI(np_close, timeperiod=9)
rsi_720 = talib.RSI(np_close, timeperiod=720)
rsi_1440 = talib.RSI(np_close, timeperiod=1440)
macd, macds, macdo = talib.MACD(np_close, fastperiod=24, slowperiod=52, signalperiod=18)
macd_720, macds_720, macdo_720 = talib.MACD(np_close, fastperiod=332, slowperiod=720, signalperiod=250)
macd_1440, macds_1440, macdo_1440 = talib.MACD(np_close, fastperiod=665, slowperiod=1440, signalperiod=498)
"""
"""
df_list = [
pd.DataFrame(ymd),
pd.DataFrame(open), pd.DataFrame(close), pd.DataFrame(high), pd.DataFrame(low), pd.DataFrame(volume),
pd.DataFrame(volume_rate), pd.DataFrame(head_rate), pd.DataFrame(body_rate), pd.DataFrame(tail_rate),
pd.DataFrame(open_low_rate), pd.DataFrame(open_high_rate), pd.DataFrame(open_open_rate), pd.DataFrame(open_close_rate), pd.DataFrame(close_low_rate), pd.DataFrame(close_high_rate), pd.DataFrame(close_open_rate), pd.DataFrame(close_close_rate),
pd.DataFrame(list(support)), pd.DataFrame(list(resistance)),
pd.DataFrame(poly_5), pd.DataFrame(poly_10), pd.DataFrame(poly_20), pd.DataFrame(poly_60), pd.DataFrame(poly_120), pd.DataFrame(poly_240), pd.DataFrame(poly_480), pd.DataFrame(poly_720), pd.DataFrame(poly_1440),
avg5_df, avg10_df, avg20_df, avg60_df, avg120_df, avg240_df, avg480_df, avg720_df, avg1440_df,
disparity_avg5_df, disparity_avg20_df, disparity_avg60_df, disparity_avg120_df, disparity_avg240_df, disparity_avg480_df, disparity_avg720_df, disparity_avg1440_df, disparity_avg2880_df,
pd.DataFrame(new_high_7), pd.DataFrame(new_high_9), pd.DataFrame(new_high_26), pd.DataFrame(new_low_7), pd.DataFrame(new_low_9), pd.DataFrame(new_low_26), pd.DataFrame(high_th),
pd.DataFrame(upper_20), pd.DataFrame(lower_20), pd.DataFrame(middle_20), bb_width_df, bb_pb_df, pd.DataFrame(willr),
pd.DataFrame(slowk_5_df), pd.DataFrame(slowd_5_df),
pd.DataFrame(slowk_10_df), pd.DataFrame(slowd_10_df),
pd.DataFrame(slowk_20_df), pd.DataFrame(slowd_20_df),
pd.DataFrame(slowk_60_df), pd.DataFrame(slowd_60_df),
pd.DataFrame(slowk_120_df), pd.DataFrame(slowd_120_df),
pd.DataFrame(slowk_240_df), pd.DataFrame(slowd_240_df),
pd.DataFrame(slowk_480_df), pd.DataFrame(slowd_480_df),
pd.DataFrame(slowk_720_df), pd.DataFrame(slowd_720_df),
pd.DataFrame(slowk_1440_df), pd.DataFrame(slowd_1440_df),
pd.DataFrame(rsi), pd.DataFrame(rsi_720), pd.DataFrame(rsi_1440),
pd.DataFrame(macd), pd.DataFrame(macds), pd.DataFrame(macdo),
pd.DataFrame(macd_720), pd.DataFrame(macds_720), pd.DataFrame(macdo_720),
pd.DataFrame(macd_1440), pd.DataFrame(macds_1440), pd.DataFrame(macdo_1440),
pd.DataFrame(open), pd.DataFrame(close), pd.DataFrame(high), pd.DataFrame(low), pd.DataFrame(volume),
]
data = pd.concat(df_list, axis=1)
column_names = [
'ymd',
'open', 'close', 'high', 'low', 'volume',
'volume_rate', 'head_rate', 'body_rate', 'tail_rate',
'open_low_rate', 'open_high_rate', 'open_open_rate', 'open_close_rate', 'close_low_rate', 'close_high_rate', 'close_open_rate', 'close_close_rate',
'support', 'resistance',
'poly_5', 'poly_10', 'poly_20', 'poly_60', 'poly_120', 'poly_240', 'poly_480', 'poly_720', 'poly_1440',
'avg5', 'avg10', 'avg20', 'avg60', 'avg120', 'avg240', 'avg480', 'avg720', 'avg1440',
'disparity_avg5', 'disparity_avg20', 'disparity_avg60', 'disparity_avg120', 'disparity_avg240', 'disparity_avg480', 'disparity_avg720', 'disparity_avg1440', 'disparity_avg2880',
'new_high_7', 'new_high_9', 'new_high_26', 'new_low_7', 'new_low_9', 'new_low_26', 'high_th',
'upper_20', 'lower_20', 'middle_20', 'bb_width', 'bb_pb', 'willr',
'slowk_5', 'slowd_5',
'slowk_10', 'slowd_10',
'slowk_20', 'slowd_20',
'slowk_60', 'slowd_60',
'slowk_120', 'slowd_120',
'slowk_240', 'slowd_240',
'slowk_480', 'slowd_480',
'slowk_720', 'slowd_720',
'slowk_1440', 'slowd_1440',
'rsi', 'rsi_720', 'rsi_1440',
'macd', 'macds', 'macdo',
'macd_720', 'macds_720', 'macdo_720',
'macd_1440', 'macds_1440', 'macdo_1440',
'open_raw', 'close_raw', 'high_raw', 'low_raw', 'volume_raw'
]
data.columns = column_names
data.index = pd.DatetimeIndex(ymd)
#data = data.dropna(axis=0)
return data, len(data)
def analyze_scale(self, result):
result["volume"] = [result["volume"][i] if 0 < result["volume"][i] else 1 for i in range(len(result["volume"]))]
# 기본 캔들 정보
open_df = pd.DataFrame(result["open"])
close_df = pd.DataFrame(result["close"])
high_df = pd.DataFrame(result["high"])
low_df = pd.DataFrame(result["low"])
volume_df = pd.DataFrame(result["volume"])
# 중복 제거
ymd_df = pd.DataFrame(result["ymd"])
data_dup = pd.concat([ymd_df, open_df, close_df, high_df, low_df, volume_df], axis=1)
data_dup.columns = ["ymd", "open", "close", "high", "low", "volume"]
data_dup.index = pd.DatetimeIndex(result["ymd"])
data_dup_sorted = data_dup.sort_index(ascending=True)
data_dup_sorted = data_dup_sorted.drop_duplicates()
ymd_df = data_dup_sorted["ymd"]
open_df = data_dup_sorted["open"]
close_df = data_dup_sorted["close"]
high_df = data_dup_sorted["high"]
low_df = data_dup_sorted["low"]
volume_df = data_dup_sorted["volume"]
ymd = ymd_df.tolist()
open = open_df.tolist()
close = close_df.tolist()
high = high_df.tolist()
low = low_df.tolist()
volume = volume_df.tolist()
open_scaled = (self.scaler.fit_transform(pd.DataFrame(open))).reshape(1,-1)[0]
open_scaled = [0.0000000001 if c==0 else c for c in open_scaled]
close_scaled = (self.scaler.fit_transform(pd.DataFrame(close))).reshape(1,-1)[0]
close_scaled = [0.0000000001 if c == 0 else c for c in close_scaled]
high_scaled = (self.scaler.fit_transform(pd.DataFrame(high))).reshape(1,-1)[0]
high_scaled = [0.0000000001 if c == 0 else c for c in high_scaled]
low_scaled = (self.scaler.fit_transform(pd.DataFrame(low))).reshape(1,-1)[0]
low_scaled = [0.0000000001 if c == 0 else c for c in low_scaled]
volume_scaled = (self.scaler.fit_transform(pd.DataFrame(volume))).reshape(1, -1)[0]
volume_scaled = [0.0000000001 if c == 0 else c for c in volume_scaled]
volume_rate = np.zeros(len(close))
head_rate, body_rate, tail_rate = np.zeros(len(close)), np.zeros(len(close)), np.zeros(len(close))
open_low_rate, open_high_rate, open_open_rate, open_close_rate = np.zeros(len(close)), np.zeros(len(close)), np.zeros(len(close)), np.zeros(len(close))
close_low_rate, close_high_rate, close_open_rate, close_close_rate = np.zeros(len(close)), np.zeros(len(close)), np.zeros(len(close)), np.zeros(len(close))
for i in range(len(close)):
length = high_scaled[i] - low_scaled[i]
if 0 < length:
max_value = max(open_scaled[i], close_scaled[i])
min_value = min(open_scaled[i], close_scaled[i])
head_rate[i] = (high_scaled[i] - max_value) / length
body_rate[i] = (max_value - min_value) / length
tail_rate[i] = (min_value - low_scaled[i]) / length
if 0 < i:
if 0 < volume[i-1]:
volume_rate[i] = volume_scaled[i]/volume_scaled[i-1]
open_low_rate[i] = (low_scaled[i] - open_scaled[i-1])/open_scaled[i-1]
open_high_rate[i] = (high_scaled[i] - open_scaled[i-1])/open_scaled[i-1]
open_open_rate[i] = (open_scaled[i] - open_scaled[i-1])/open_scaled[i-1]
open_close_rate[i] = (close_scaled[i] - open_scaled[i-1])/open_scaled[i-1]
close_low_rate[i] = (low_scaled[i] - close_scaled[i-1])/close_scaled[i-1]
close_high_rate[i] = (high_scaled[i] - close_scaled[i-1])/close_scaled[i-1]
close_open_rate[i] = (open_scaled[i] - close_scaled[i-1])/close_scaled[i-1]
close_close_rate[i] = (close_scaled[i] - close_scaled[i-1])/close_scaled[i-1]
support, resistance = self.get_Support_Resistance(pd.DataFrame(close_scaled))
#z = np.polyfit(df['speed'], df['dist'], 1) # 기울기와 절편 확인
#f = np.poly1d(z) # f(x): f함수
if 5 < len(close):
poly_5 = [0] * 4 + [np.polyfit(range(5), close[i - 4: i + 1], 1)[0] for i in range(4, len(close))]
else:
poly_5 = [0] * len(close)
if 10 < len(close):
poly_10 = [0] * 9 + [np.polyfit(range(10), close[i - 9: i + 1], 1)[0] for i in range(9, len(close))]
else:
poly_10 = [0] * len(close)
if 20 < len(close):
poly_20 = [0] * 19 + [np.polyfit(range(20), close[i - 19: i + 1], 1)[0] for i in range(19, len(close))]
else:
poly_20 = [0] * len(close)
if 60 < len(close):
poly_60 = [0] * 59 + [np.polyfit(range(60), close[i - 59: i + 1], 1)[0] for i in range(59, len(close))]
else:
poly_60 = [0] * len(close)
if 120 < len(close):
poly_120 = [0] * 119 + [np.polyfit(range(120), close[i - 119: i + 1], 1)[0] for i in range(119, len(close))]
else:
poly_120 = [0] * len(close)
if 240 < len(close):
poly_240 = [0] * 239 + [np.polyfit(range(240), close[i - 239: i + 1], 1)[0] for i in range(239, len(close))]
else:
poly_240 = [0] * len(close)
if 480 < len(close):
poly_480 = [0] * 479 + [np.polyfit(range(480), close[i - 479: i + 1], 1)[0] for i in range(479, len(close))]
else:
poly_480 = [0] * len(close)
if 720 < len(close):
poly_720 = [0] * 719 + [np.polyfit(range(720), close[i - 719: i + 1], 1)[0] for i in range(719, len(close))]
else:
poly_720 = [0] * len(close)
if 1440 < len(close):
poly_1440 = [0] * 1439 + [np.polyfit(range(1440), close[i - 1439: i + 1], 1)[0] for i in range(1439, len(close))]
else:
poly_1440 = [0] * len(close)
# 7일 신고가
new_high_7 = [0 for c in range(6)] + [1 if (close_scaled[c - 1] is not None and close_scaled[c] is not None and close_scaled[c - 1] < close_scaled[c]) and None not in close_scaled[c - 6:c + 1] and max(close_scaled[c - 6:c]) < close_scaled[c] else 0 for c in range(6, len(close_scaled))]
# 9일 신고가
new_high_9 = [0 for c in range(8)] + [1 if (close_scaled[c - 1] is not None and close_scaled[c] is not None and close_scaled[c - 1] < close_scaled[c]) and None not in close_scaled[c - 8:c + 1] and max(close_scaled[c - 8:c]) < close_scaled[c] else 0 for c in range(8, len(close_scaled))]
# 26일 신고가
new_high_26 = [0 for c in range(25)] + [1 if (close_scaled[c - 1] is not None and close_scaled[c] is not None and close_scaled[c - 1] < close_scaled[c]) and None not in close_scaled[c - 25:c + 1] and max(close_scaled[c - 25:c]) < close_scaled[c] else 0 for c in range(25, len(close_scaled))]
# 7일 신저가
new_low_7 = [0 for c in range(6)] + [1 if (close_scaled[c - 1] is not None and close_scaled[c] is not None and close_scaled[c - 1] < close_scaled[c]) and None not in close_scaled[c - 6:c + 1] and close_scaled[c - 6] < min(close_scaled[c - 6:c + 1]) else 0 for c in range(6, len(close_scaled))]
# 9일 신저가
new_low_9 = [0 for c in range(8)] + [1 if (close_scaled[c - 1] is not None and close_scaled[c] is not None and close_scaled[c - 1] < close_scaled[c]) and None not in close_scaled[c - 8:c + 1] and close_scaled[c - 8] < min(close_scaled[c - 8:c + 1]) else 0 for c in range(8, len(close_scaled))]
# 26일 신저가
new_low_26 = [0 for c in range(25)] + [1 if (close_scaled[c - 1] is not None and close_scaled[c] is not None and close_scaled[c - 1] < close_scaled[c]) and None not in close_scaled[c - 25:c + 1] and close_scaled[c - 25] < min(close_scaled[c - 25:c + 1]) else 0 for c in range(25, len(close_scaled))]
high_th = [0]
for i in range(1, len(close_scaled)):
count = 0
for c in range(i-1,i-30,-1):
if c < 0:
break
if close_scaled[i] < close_scaled[c]:
break
else:
count += 1
high_th.append(count)
# 이동 평균
close_df = pd.DataFrame(close_scaled)
avg5_df = close_df.ewm(5).mean()
avg10_df = close_df.ewm(10).mean()
avg20_df = close_df.ewm(20).mean()
avg60_df = close_df.ewm(60).mean()
avg120_df = close_df.ewm(120).mean()
avg240_df = close_df.ewm(240).mean()
avg480_df = close_df.ewm(480).mean()
avg720_df = close_df.ewm(720).mean()
avg1440_df = close_df.ewm(1440).mean()
# 이격도
disparity_avg5_df = (close_df / close_df.ewm(span=5, min_periods=5, adjust=False).mean())
disparity_avg5_df = disparity_avg5_df.replace({None: np.nan})
disparity_avg20_df = (close_df / close_df.ewm(span=20, min_periods=20, adjust=False).mean())
disparity_avg20_df = disparity_avg20_df.replace({None: np.nan})
disparity_avg60_df = (close_df / close_df.ewm(span=60, min_periods=60, adjust=False).mean())
disparity_avg60_df = disparity_avg60_df.replace({None: np.nan})
disparity_avg120_df = (close_df / close_df.ewm(span=120, min_periods=120, adjust=False).mean())
disparity_avg120_df = disparity_avg120_df.replace({None: np.nan})
disparity_avg240_df = (close_df / close_df.ewm(span=240, min_periods=240, adjust=False).mean())
disparity_avg240_df = disparity_avg240_df.replace({None: np.nan})
disparity_avg480_df = (close_df / close_df.ewm(span=480, min_periods=480, adjust=False).mean())
disparity_avg480_df = disparity_avg480_df.replace({None: np.nan})
disparity_avg720_df = (close_df / close_df.ewm(span=720, min_periods=720, adjust=False).mean())
disparity_avg720_df = disparity_avg720_df.replace({None: np.nan})
disparity_avg1440_df = (close_df / close_df.ewm(span=1440, min_periods=1440, adjust=False).mean())
disparity_avg1440_df = disparity_avg1440_df.replace({None: np.nan})
disparity_avg2880_df = (close_df / close_df.ewm(span=2880, min_periods=2880, adjust=False).mean())
disparity_avg2880_df = disparity_avg2880_df.replace({None: np.nan})
disparity_avg5_list = list(disparity_avg5_df.values.reshape(-1))
disparity_avg20_list = list(disparity_avg20_df.values.reshape(-1))
disparity_avg60_list = list(disparity_avg60_df.values.reshape(-1))
disparity_avg120_list = list(disparity_avg120_df.values.reshape(-1))
disparity_avg240_list = list(disparity_avg240_df.values.reshape(-1))
disparity_avg480_list = list(disparity_avg480_df.values.reshape(-1))
disparity_avg720_list = list(disparity_avg720_df.values.reshape(-1))
disparity_avg1440_list = list(disparity_avg1440_df.values.reshape(-1))
disparity_diff_20_5, disparity_diff_20_5_rate = self.getDiff_Rate(disparity_avg20_list, disparity_avg5_list, duration=20)
disparity_diff_60_20, disparity_diff_60_20_rate = self.getDiff_Rate(disparity_avg60_list, disparity_avg20_list, duration=60)
disparity_diff_120_20, disparity_diff_120_20_rate = self.getDiff_Rate(disparity_avg120_list, disparity_avg20_list, duration=120)
disparity_diff_240_20, disparity_diff_240_20_rate = self.getDiff_Rate(disparity_avg240_list, disparity_avg20_list, duration=240)
disparity_diff_480_20, disparity_diff_480_20_rate = self.getDiff_Rate(disparity_avg480_list, disparity_avg20_list, duration=480)
disparity_diff_720_20, disparity_diff_720_20_rate = self.getDiff_Rate(disparity_avg720_list, disparity_avg20_list, duration=720)
disparity_diff_1440_20, disparity_diff_1440_20_rate = self.getDiff_Rate(disparity_avg1440_list, disparity_avg20_list, duration=1440)
""""""
n, t = 20, 2
max_20 = close_df.rolling(window=n).mean()
stddev_20 = close_df.rolling(window=n).std()
upper_20 = max_20 + (stddev_20 * t) # 상단 볼리저 밴드
lower_20 = max_20 - (stddev_20 * t) # 하단 볼리저 밴드
middle_20 = (upper_20 + lower_20) / 2
width_df = (upper_20 - lower_20) / middle_20
width_min = np.min(width_df[0])
width_max = np.max(width_df[0])
bb_width_df = 100 * (width_df - width_min) / (width_max - width_min)
bb_pb_df = 100 * (close_df - lower_20) / (upper_20 - lower_20)
upper_20 = list(np.reshape(upper_20.values, -1))
lower_20 = list(np.reshape(lower_20.values, -1))
middle_20 = list(np.reshape(middle_20.values, -1))
np_high, np_low, np_close = np.array(high_scaled, dtype=np.float64), np.array(low_scaled, dtype=np.float64), np.array(close_scaled, dtype=np.float64)
slowk_5_df, slowd_5_df = talib.STOCH(np_high, np_low, np_close, fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0)
slowk_10_df, slowd_10_df = talib.STOCH(np_high, np_low, np_close, fastk_period=10, slowk_period=6, slowk_matype=0, slowd_period=6, slowd_matype=0)
slowk_20_df, slowd_20_df = talib.STOCH(np_high, np_low, np_close, fastk_period=20, slowk_period=12, slowk_matype=0, slowd_period=12, slowd_matype=0)
slowk_60_df, slowd_60_df = talib.STOCH(np_high, np_low, np_close, fastk_period=60, slowk_period=37, slowk_matype=0, slowd_period=37, slowd_matype=0)
slowk_120_df, slowd_120_df = talib.STOCH(np_high, np_low, np_close, fastk_period=120, slowk_period=74, slowk_matype=0, slowd_period=74, slowd_matype=0)
slowk_240_df, slowd_240_df = talib.STOCH(np_high, np_low, np_close, fastk_period=240, slowk_period=148, slowk_matype=0, slowd_period=148, slowd_matype=0)
slowk_480_df, slowd_480_df = talib.STOCH(np_high, np_low, np_close, fastk_period=480, slowk_period=296, slowk_matype=0, slowd_period=296, slowd_matype=0)
slowk_720_df, slowd_720_df = talib.STOCH(np_high, np_low, np_close, fastk_period=720, slowk_period=445, slowk_matype=0, slowd_period=445, slowd_matype=0)
slowk_1440_df, slowd_1440_df = talib.STOCH(np_high, np_low, np_close, fastk_period=1440, slowk_period=890, slowk_matype=0, slowd_period=890, slowd_matype=0)
willr = talib.WILLR(np_high, np_low, np_close, timeperiod=11) + 100
rsi = talib.RSI(np_close, timeperiod=9)
rsi_720 = talib.RSI(np_close, timeperiod=720)
rsi_1440 = talib.RSI(np_close, timeperiod=1440)
macd, macds, macdo = talib.MACD(np_close, fastperiod=24, slowperiod=52, signalperiod=18)
macd_720, macds_720, macdo_720 = talib.MACD(np_close, fastperiod=332, slowperiod=720, signalperiod=250)
macd_1440, macds_1440, macdo_1440 = talib.MACD(np_close, fastperiod=665, slowperiod=1440, signalperiod=498)
"""
"""
df_list = [
pd.DataFrame(ymd),
pd.DataFrame(open_scaled), pd.DataFrame(close_scaled), pd.DataFrame(high_scaled), pd.DataFrame(low_scaled), pd.DataFrame(volume_scaled),
pd.DataFrame(volume_rate), pd.DataFrame(head_rate), pd.DataFrame(body_rate), pd.DataFrame(tail_rate),
pd.DataFrame(open_low_rate), pd.DataFrame(open_high_rate), pd.DataFrame(open_open_rate), pd.DataFrame(open_close_rate), pd.DataFrame(close_low_rate), pd.DataFrame(close_high_rate), pd.DataFrame(close_open_rate), pd.DataFrame(close_close_rate),
pd.DataFrame(list(support)), pd.DataFrame(list(resistance)),
pd.DataFrame(poly_5), pd.DataFrame(poly_10), pd.DataFrame(poly_20), pd.DataFrame(poly_60), pd.DataFrame(poly_120), pd.DataFrame(poly_240), pd.DataFrame(poly_480), pd.DataFrame(poly_720), pd.DataFrame(poly_1440),
avg5_df, avg10_df, avg20_df, avg60_df, avg120_df, avg240_df, avg480_df, avg720_df, avg1440_df,
disparity_avg5_df, disparity_avg20_df, disparity_avg60_df, disparity_avg120_df, disparity_avg240_df, disparity_avg480_df, disparity_avg720_df, disparity_avg1440_df, disparity_avg2880_df,
pd.DataFrame(disparity_diff_20_5), pd.DataFrame(disparity_diff_20_5_rate),
pd.DataFrame(disparity_diff_60_20), pd.DataFrame(disparity_diff_60_20_rate),
pd.DataFrame(disparity_diff_120_20), pd.DataFrame(disparity_diff_120_20_rate),
pd.DataFrame(disparity_diff_240_20), pd.DataFrame(disparity_diff_240_20_rate),
pd.DataFrame(disparity_diff_480_20), pd.DataFrame(disparity_diff_480_20_rate),
pd.DataFrame(disparity_diff_720_20), pd.DataFrame(disparity_diff_720_20_rate),
pd.DataFrame(disparity_diff_1440_20), pd.DataFrame(disparity_diff_1440_20_rate),
pd.DataFrame(new_high_7), pd.DataFrame(new_high_9), pd.DataFrame(new_high_26), pd.DataFrame(new_low_7), pd.DataFrame(new_low_9), pd.DataFrame(new_low_26), pd.DataFrame(high_th),
pd.DataFrame(upper_20), pd.DataFrame(lower_20), pd.DataFrame(middle_20), bb_width_df, bb_pb_df, pd.DataFrame(willr),
pd.DataFrame(slowk_5_df), pd.DataFrame(slowd_5_df),
pd.DataFrame(slowk_10_df), pd.DataFrame(slowd_10_df),
pd.DataFrame(slowk_20_df), pd.DataFrame(slowd_20_df),
pd.DataFrame(slowk_60_df), pd.DataFrame(slowd_60_df),
pd.DataFrame(slowk_120_df), pd.DataFrame(slowd_120_df),
pd.DataFrame(slowk_240_df), pd.DataFrame(slowd_240_df),
pd.DataFrame(slowk_480_df), pd.DataFrame(slowd_480_df),
pd.DataFrame(slowk_720_df), pd.DataFrame(slowd_720_df),
pd.DataFrame(slowk_1440_df), pd.DataFrame(slowd_1440_df),
pd.DataFrame(rsi), pd.DataFrame(rsi_720), pd.DataFrame(rsi_1440),
pd.DataFrame(macd), pd.DataFrame(macds), pd.DataFrame(macdo),
pd.DataFrame(macd_720), pd.DataFrame(macds_720), pd.DataFrame(macdo_720),
pd.DataFrame(macd_1440), pd.DataFrame(macds_1440), pd.DataFrame(macdo_1440),
pd.DataFrame(open), pd.DataFrame(close), pd.DataFrame(high), pd.DataFrame(low), pd.DataFrame(volume)
]
data = pd.concat(df_list, axis=1)
column_names = [
'ymd',
'open', 'close', 'high', 'low', 'volume',
'volume_rate', 'head_rate', 'body_rate', 'tail_rate',
'open_low_rate', 'open_high_rate', 'open_open_rate', 'open_close_rate', 'close_low_rate', 'close_high_rate', 'close_open_rate', 'close_close_rate',
'support', 'resistance',
'poly_5', 'poly_10', 'poly_20', 'poly_60', 'poly_120', 'poly_240', 'poly_480', 'poly_720', 'poly_1440',
'avg5', 'avg10', 'avg20', 'avg60', 'avg120', 'avg240', 'avg480', 'avg720', 'avg1440',
'disparity_avg5', 'disparity_avg20', 'disparity_avg60', 'disparity_avg120', 'disparity_avg240', 'disparity_avg480', 'disparity_avg720', 'disparity_avg1440', 'disparity_avg2880',
'disparity_diff_20_5', 'disparity_diff_20_5_rate',
'disparity_diff_60_20', 'disparity_diff_60_20_rate',
'disparity_diff_120_20', 'disparity_diff_120_20_rate',
'disparity_diff_240_20', 'disparity_diff_240_20_rate',
'disparity_diff_480_20', 'disparity_diff_480_20_rate',
'disparity_diff_720_20', 'disparity_diff_720_20_rate',
'disparity_diff_1440_20', 'disparity_diff_1440_20_rate',
'new_high_7', 'new_high_9', 'new_high_26', 'new_low_7', 'new_low_9', 'new_low_26', 'high_th',
'upper_20', 'lower_20', 'middle_20', 'bb_width', 'bb_pb', 'willr',
'slowk_5', 'slowd_5',
'slowk_10', 'slowd_10',
'slowk_20', 'slowd_20',
'slowk_60', 'slowd_60',
'slowk_120', 'slowd_120',
'slowk_240', 'slowd_240',
'slowk_480', 'slowd_480',
'slowk_720', 'slowd_720',
'slowk_1440', 'slowd_1440',
'rsi', 'rsi_720', 'rsi_1440',
'macd', 'macds', 'macdo',
'macd_720', 'macds_720', 'macdo_720',
'macd_1440', 'macds_1440', 'macdo_1440',
'open_raw', 'close_raw', 'high_raw', 'low_raw', 'volume_raw'
]
data.columns = column_names
data.index = pd.DatetimeIndex(ymd)
#data = data.dropna(axis=0)
return data, len(data)
def getData(self, ticker, mins=None, ymd=None, get_days=14):
if ymd is None:
result = self.getCoinData(ticker, mins=mins, get_days=get_days)
else:
result = self.getCoinData(ticker, mins=mins, ymd=ymd, get_days=get_days)
if len(result['ymd']) < 1:
return None, None, None
#result_tic = self.makeTickData(result_m1, mins=minute)
data_scale, ci = self.analyze_scale(result)
data, ci = self.analyze_raw(result)
ticker['disparity_low_min'] = self.getDisparity_low_min(ticker, min='minutely')
return data, data_scale, ci