From 1eed2ea40e3612a62b8866186b07e5ba38f3a54b Mon Sep 17 00:00:00 2001 From: dosangyoon Date: Tue, 16 Aug 2022 21:23:40 +0900 Subject: [PATCH] init --- Simulation.py | 19 +- VitTrainer.py | 1 + hts/BuySellChecker.py | 1212 ++++++++++-------------------------- resources/hts.db | Bin 44855296 -> 44855296 bytes stock/util/LabelMaker.py | 140 +++-- stock/util/Stock2Vector.py | 14 +- 6 files changed, 435 insertions(+), 951 deletions(-) diff --git a/Simulation.py b/Simulation.py index bba5fb4..e29a77d 100644 --- a/Simulation.py +++ b/Simulation.py @@ -52,9 +52,8 @@ class Simulation (HTS): 'avg6': 'float', 'avg9': 'float', 'avg12': 'float', - 'avg24': 'float', - 'avg30': 'float', - 'avg60': 'float', + 'avg27': 'float', + 'avg54': 'float', 'fast_k': 'float', 'slow_k': 'float', 'slow_d': 'float', @@ -70,7 +69,7 @@ class Simulation (HTS): buy_line[i] = nan buy_size.append(0) else: - buy_colors.append("#D87D0F") + buy_colors.append("#B2028C") buy_size.append(10 + (5 * buy_weight_line[i])) sell_colors = [] @@ -90,8 +89,8 @@ class Simulation (HTS): avg6 = go.Scatter(x=data['date'], y=data["avg6"], name="avg6", line_color='#089B5B') avg9 = go.Scatter(x=data['date'], y=data["avg9"], name="avg9", line_color='#ff00ff') avg12 = go.Scatter(x=data['date'], y=data["avg12"], name="avg12", line_color='#1469F4') - avg24 = go.Scatter(x=data['date'], y=data["avg24"], name="avg24", line_color='#000000') - avg30 = go.Scatter(x=data['date'], y=data["avg30"], name="avg30", line_color='#008000') + avg27 = go.Scatter(x=data['date'], y=data["avg27"], name="avg27", line_color='#000000') + avg54 = go.Scatter(x=data['date'], y=data["avg54"], name="avg54", line_color='#008000') candle_stick = go.Candlestick(x=data['date'], open=data['open'], high=data['high'], low=data['low'], close=data['close'], increasing_line_color='red', decreasing_line_color='blue') volume_line = go.Scatter(x=data['date'], y=data["volume"], mode='lines', name='volume') @@ -107,7 +106,7 @@ class Simulation (HTS): rsi_line = go.Scatter(x=data['date'], y=data["rsi"], mode='lines', name='rsi') rsis_line = go.Scatter(x=data['date'], y=data["rsis"], mode='lines', name='rsis') - candle_data = [candle_stick, upper, lower, avg3, avg6, avg9, avg12, avg24, avg30, buy_check, sell_check] + candle_data = [candle_stick, upper, lower, avg3, avg6, avg9, avg12, avg27, avg54, buy_check, sell_check] volume_data = [volume_line] macd_data = [macd_line, macd_s_line, macd_o_line] stochastic_data = [slow_k_line, slow_d_line] @@ -180,11 +179,11 @@ if __name__ == "__main__": # to check bying stock_codes = { - "252670": ['20220805', '20220808', '20220809', '20220810', '20220811'], - "122630": ['20220805', '20220808', '20220809', '20220810', '20220811'], + #"252670": ['20220801', '20220802', '20220803', '20220804', '20220805', '20220808', '20220809', '20220810', '20220811', '20220812'], + "122630": ['20220801', '20220802', '20220803', '20220804', '20220805', '20220808', '20220809', '20220810', '20220811', '20220812'], } - method = "ml" # "rule", "ml", "answer" + method = "rule" # "rule", "ml", "answer" for stock_code in stock_codes: simulation = Simulation(RESOURCE_PATH) diff --git a/VitTrainer.py b/VitTrainer.py index 57ca910..2b5564a 100755 --- a/VitTrainer.py +++ b/VitTrainer.py @@ -191,6 +191,7 @@ class VitTrainer: return def getData(self, stock_code, sDate, eDate): + # Instance Normalization를 NumPy 및 PyTorch로 구현하는 방법! (https://ndb796.tistory.com/653) data = self.stock2Vector.getTrainData(stock_code, sDate, eDate) #X, Y = self.stock2Vector.getDataset2D(data) X, Y = self.stock2Vector.getVectorData(data) diff --git a/hts/BuySellChecker.py b/hts/BuySellChecker.py index 775ef4b..54e8a17 100644 --- a/hts/BuySellChecker.py +++ b/hts/BuySellChecker.py @@ -184,7 +184,7 @@ class BuySellChecker: # 곱버스에 해당함 - def getBuyPriceAndWeight_3000(self, data, i): + def getBuyPriceAndWeight_252670(self, data, i): buy, weight = -1, -1 START_TIME_INDEX = 0 @@ -196,246 +196,39 @@ class BuySellChecker: if i > START_TIME_INDEX: # 매수 분석 - if i > 710: - # "14:30" 까지만 매수 - return buy, weight + param = 1 + if (data["macd"][i] < -1.741263068 and + data["diff_avg27"][i] < -0.299978341*param and + data["diff_avg3_avg27"][i] < -3.600823045 * param and + data["diff_avg3_avg54"][i] < -6.423001949 * param and - if i > 380 + 30 and data["macd"][i] < -25: - if data["avg3"][i] > min(data["avg6"][i], data["avg9"][i], data["avg12"][i]): - buy = data["high"][i] - if i < 381 + 40: - weight = 1 - else: - weight = 5 - return buy, weight + data["diff_avg6_avg27"][i] < -2.889322071 * param and + data["diff_avg6_avg54"][i] < -5.711500975*param and + + data["diff_avg9_avg27"][i] < -2.216807451 * param and + data["diff_avg9_avg54"][i] < -5.038986355*param and + + data["diff_avg12_avg27"][i] < -1.70023825 * param and + data["diff_avg12_avg54"][i] < -4.522417154*param and + + data["diff_change_lead1"][i] < -6.425438596 * param and + data["diff_open_lead1"][i] < -7.302631579*param and + data["diff_close_lead1"][i] < -7.711988304*param and + data["diff_high_lead1"][i] < -4.875730994*param and + data["diff_low_lead1"][i] < -11.74707602*param and + + data["diff_upper_lower"][i] < 19.2091055*param + 11.75882982/3 and + data["diff_change_base"][i] < -2.616959064*param + ): - if i > 380 + 30 and data["macd"][i] < -5 and data["rsi"][i] < 30: - if data["avg3"][i] > min(data["avg6"][i], data["avg9"][i], data["avg12"][i]): buy = int((data["open"][i] + data["close"][i]) / 2) - weight = 2 + weight = 1 return buy, weight - if i > 380 + 30 and data["slow_k"][i] < 10 and data["rsi"][i] < 30: - if data["slow_k"][i - 1] < min(data["slow_k"][i - 2], data["slow_k"][i]): - if data["avg3"][i] > min(data["avg6"][i], data["avg9"][i], data["avg12"][i]): - buy = int((data["open"][i] + data["close"][i]) / 2) - weight = 2 - return buy, weight - - - - # 3분선이 5분선이 돌파가 이전보다 높은 경우 매수 - if data["slow_k"][i] < 70 and data["avg3"][i - 1] < data["avg6"][i - 1] and data["avg3"][i] > data["avg6"][i]: - max_avg3 = 0 - p_avg3 = 999999 - for c in range(1, 50): - if max_avg3 < data["avg6"][i - c]: - max_avg3 = data["avg6"][i - c] - if data["avg3"][i-c-2] < data["avg6"][i-c-2] and data["avg3"][i-c-1] <= data["avg6"][i-c-1] and data["avg3"][i-c] > data["avg6"][i-c]: - p_avg3 = data["avg3"][i-c] - break - if data["avg3"][i] > p_avg3 and max_avg3 < data["avg3"][i]: - #if data["avg6"][i-10] > data["avg6"][i]: - if data['macd'][i] <= 0: - if i == 382 or i == 383: - if data["close"][i] != data["high"][i]: - return -1, -1 - buy = data["low"][i] - weight = 1 - return buy, weight - - """ - # 3분선이 10분 이상 7분선 아래에 있다가 7분선 위로 올라옴 - if i >= 381 + 10: - vaild = True - for c in range(2, 10): - if data["avg3"][i - c] > data["avg7"][i - c]: - vaild = False - break - if vaild: - if data["avg3"][i - 1] >= data["avg7"][i - 1] and data["avg3"][i] >= data["avg7"][i]: - buy = int(data["avg3"][i] - data["avg3"][i]%5) - weight = 1 - return self.getBuyCheck(data, i, buy, weight) - """ - - """ - # 중위선 20분선 아래에서 볼린져 상단을 뚫고 종료할 때 - # (2022-07-06 11:17) (2022-07-07 14:29) (2022-07-08 12:41 12:44) (2022-07-11 13:58) - # (2022-07-13 12:02 12:03) (2022-07-14 10:50) (2022-07-15 09:52) - if data["open"][i] < data["avg10"][i] < data["avg20"][i] < data["avg30"][i] < data["close"][i]: - if data["avg20"][i - 2] <= data["avg20"][i - 1] <= data["avg20"][i]: - buy = int((data["close"][i] + data["low"][i])/2) - weight = 2 - return self.getBuyCheck(data, i, buy, weight) - - # 30일 이전부터 모든 선이 좁혀졌다 녋혀지면서 다시 상승하며 좁혀짐 - # (2022-07-08 10:52), (2022-07-14 14:33 14:36) - if max(data["avg3"][i], data["avg5"][i], data["avg10"][i], data["avg20"][i], data["avg30"][i]) - min( - data["avg3"][i], data["avg5"][i], data["avg10"][i], data["avg20"][i], data["avg30"][i]) < 5: - if (data["close"][i] > (data["avg3"][i] and data["avg5"][i] and data["avg10"][i] and data["avg20"][i] and data["avg30"][i])): - if data["close"][i] > data["open"][i]: - check1 = False - check2 = False - for c in range(30, 0, -1): - if not check1 and not check2: - if max(data["avg3"][i-c], data["avg5"][i-c], data["avg10"][i-c], data["avg20"][i-c], data["avg30"][i-c]) - min(data["avg3"][i-c], data["avg5"][i-c], data["avg10"][i-c], data["avg20"][i-c], data["avg30"][i-c]) < 2: - check1 = True - continue - if check1 and not check2: - if max(data["avg3"][i-c], data["avg5"][i-c], data["avg10"][i-c], data["avg20"][i-c], data["avg30"][i-c]) - min(data["avg3"][i-c], data["avg5"][i-c], data["avg10"][i-c], data["avg20"][i-c], data["avg30"][i-c]) > 10: - if data["avg20"][i-c] < data["avg10"][i-c] < data["avg5"][i-c] < data["avg3"][i-c]: - check2 = True - break - if check1 and check2: - buy = int((data["close"][i] + data["low"][i]) / 2) - weight = 7 - return buy, weight - - # 최근 양봉 3개가 나오면, - # 최근 10개 중에서 9개가 음봉이었음. 이 상태에서 양봉 3개가 나오면, 중간값에서 매수한다. - # (2022-07-05 09:22 11:01 11:14) (2022-07-05 09:56 12:47) - # (2022-07-06 14:25) (2022-07-07 09:50 11:29 11:52 12:23 12:50) (2022-07-08 09:06 10:05 10:49 11:35 14:14) (2022-07-11 09:25 09:59 11:54) - # (2022-07-12 10:37 12:49 14:52) (2022-07-13 09:06 09:13 10:12 12:30) (2022-07-14 11:16 13:50) (2022-07-15 11:39) - if data["open"][i-2] < data["close"][i-2] and data["open"][i-1] <= data["close"][i-1] and data["open"][i] < data["close"][i]: - umbong = 0 - for c in range(13, 3, -1): - if (data['close'][i-c] < data['open'][i-c] or data['close'][i-c] == data['open'][i-c] == data['low'][i-c] < data['high'][i-c]): - umbong += 1 - if umbong >= 8: - if data["open"][i] < data["open"][i-10]: - buy = data["open"][i] - weight = 7 - return self.getBuyCheck(data, i, buy, weight) - - - # 최근 양봉 3개가 나오면, - # 9시 3분이나 4분에 장 시작 양봉 연속 3개면 매수 - # (2022-07-11 09:03), (2022-07-14 14:33 14:36) - if data.index[i].strftime("%H:%M") == "09:03": - if data["low"][i - 2] <= data["open"][i - 2] < data["close"][i - 2] <= data["high"][i - 2]: - if data["low"][i - 1] <= data["open"][i - 1] < data["close"][i - 1] <= data["high"][i - 1]: - if data["low"][i] <= data["open"][i] < data["close"][i] <= data["high"][i]: - buy = data["high"][i] + 5 - weight = 5 - return buy, weight - - # 장시작 5개 high가 볼린져 상단 위에 있을 때 중간 값에서 매수 - if data.index[i].strftime("%H:%M") == "09:05": - if data["upper"][i-4] < data["high"][i-4] and data["upper"][i-3] < data["high"][i-3] and data["upper"][i-2] < data["high"][i-2] and data["upper"][i-1] < data["high"][i-1] and data["upper"][i] < data["high"][i]: - buy = (data["open"][i]+data["close"][i])/2 - weight = 5 - return self.getBuyCheck(data, i, buy, weight) - - # 장 초기 (시작 9분 이내), 볼린져 하단에서 시작하여 이병선을 모두 상승하여 마감한 경우 high 값에서 매수한다. - # (2022-07-15 09:08 09:09) - if i <= 381 + 10: - if data["close"][i] > max(data["avg3"][i], data["avg5"][i], data["avg10"][i], data["avg20"][i], data["avg30"][i]): - c = 382 - # 장 시작 역배열 상태임 - if data["avg3"][c] < data["avg5"][c] < data["avg10"][c] < data["avg20"][c] < data["avg30"][c] and data["close"][c] < data["lower"][c]: - if data["upper"][i] < data["high"][i]: - buy = data["close"][i] - else: - buy = data["high"][i] - weight = 7 - return buy, weight - - # 이동선을 이용한 매매 - # 3분선과 10분선이 30분 이상 내려오다가 3분선이 10분선을 넘어 서는 순간 매수 - # (2022-07-07 11:26) (2022-07-08 10:05) - if int(data["avg3"][i]) > int(data["avg10"][i]): - valid = True - same_count = 0 - for c in range(1, 30): - if int(data["avg3"][i-c]) == int(data["avg10"][i-c]): - same_count += 1 - if int(data["avg3"][i-c]) > int(data["avg10"][i-c]): - valid = False - break - if valid and same_count < 2: - buy = data["close"][i] - 5 - weight = 3 - return self.getBuyCheck(data, i, buy, weight) - - - # MACD를 이용한 다이버젼스 - # lower를 하단으로 깼을 때, 5분선 기준으로 이전 저점보다 낮거나 같은데, MACD는 더 높은 경우 매수한다. - # 오전 10시 이후일 때만 해당함 - if data["close"][i] < data["lower"][i]: - if data['macd'][i] < -2: - low = 99999999999 - high = 0 - idx = 0 - for c in range(30, 60): - if i-c > 381: - if data['macd'][i-c] < -2 and data['low'][i-c] < low: - low = data['low'][i-c] - idx = i-c - - for c in range(i-1, idx, -1): - if high < data['high'][c]: - high = data['high'][c] - - if data['macd'][idx] < data['macd'][i] and data['low'][i] <= data['low'][idx] and high-data['high'][i] > 20: - buy = (data["open"][i]+data["close"][i])/2 - weight = 7 - return self.getBuyCheck(data, i, buy, weight) - """ - - - - - - """ - # 이동선을 이용한 매매 - # 20분선이 30분선에 돌파 후 지지하는지 확인하고 해당 시점이 양봉이면 매수함 - if hts['avg20'][i] > hts['avg30'][i]: - diff1 = hts['avg20'][i] - hts['avg30'][i] - diff2 = hts['avg20'][i-1] - hts['avg30'][i-1] - diff3 = hts['avg20'][i-2] - hts['avg30'][i-2] - diff4 = hts['avg20'][i-3] - hts['avg30'][i-3] - diff5 = hts['avg20'][i-4] - hts['avg30'][i-4] - if 0 < diff3 < diff2 < diff1: - if hts['high'][i-2] <= hts['high'][i-1] <= hts['high'][i]: - if hts['open'][i - 2] <= hts['close'][i - 2] and hts['open'][i-1] <= hts['close'][i-1] and hts['open'][i] <= hts['close'][i]: - if diff5 < diff4 < 0: - if hts["rsi"][i] < 30: - buy = (hts["open"][i]+hts["close"][i])/2 - weight = 7 - return self.getBuyCheck(hts, i, buy, weight) - - # 이동선을 이용한 매매 - # 3분선과 5분선이 10분 이상 내려오다가 3분선이 5분선을 넘어 서는 순간 매수 - # (2022-07-04 09:22) (2022-07-05 09:38) (2022-07-07 09:35) (2022-07-08 09:06) (2022-07-11 09:25) (2022-07-13 10:12) (2022-07-15 14:48) - if int(hts["avg3"][i]) > int(hts["avg5"][i]): - valid = True - same_count = 0 - for c in range(1, 11): - if int(hts["avg3"][i-c]) == int(hts["avg5"][i-c]): - same_count += 1 - if int(hts["avg3"][i-c]) > int(hts["avg5"][i-c]): - valid = False - break - if valid and same_count < 2: - if hts['macd'][i] < -5: - buy = hts["close"][i] - 5 - weight = 1 - return self.getBuyCheck(hts, i, buy, weight) - - # 만약 30원 이상 장대 양봉이 나온 경우, 다음이나 다다음 중간 값에서 매수를 한다. - if (hts["close"][i] - hts["low"][i]) >= 30: - middle = int((hts["close"][i] + hts["low"][i])/2) - buy = middle - weight = 1 - return self.getBuyCheck(hts, i, buy, weight) - """ - return buy, weight - - def getSellPriceAndWeight_3000(self, data, i): + def getSellPriceAndWeight_252670(self, data, i): sell, weight = -1, -1 START_TIME_INDEX = 0 @@ -444,101 +237,58 @@ class BuySellChecker: START_TIME_INDEX = c break - if i >= START_TIME_INDEX: - # 매도 분석 + if i > START_TIME_INDEX: + # 매수 분석 - # 10분선 위에서 3분선이 5분선을 하향 돌파 하는 경우 매도 - if data["slow_k"][i - 1] > 70 and data["avg3"][i - 1] >= data["avg6"][i - 1] and data["avg3"][i] < data["avg6"][i]: - if max(data["avg3"][i], data["avg6"][i]) < data["avg9"][i]: - sell = int((data["open"][i] + data["close"][i]) / 2) - weight = 1 - return sell, weight - # 3분선이 5분 이상 5분선 위에 있다가 5분선 아래로 내려옴 + # 3분선이 10분 이상 6분선 위에 있다가 5분선 아래로 내려옴 if i >= 381 + 5: vaild = True + count = 0 for c in range(1, 11): + if data["avg3"][i - c] == data["avg6"][i - c]: + count += 1 if data["avg3"][i - c] < data["avg6"][i - c]: vaild = False break - if vaild: + if vaild and count < 3: if data["avg3"][i] < data["avg6"][i]: sell = int(data["avg3"][i] - data["avg3"][i]%5) weight = 1 return sell, weight - """ - # 3분 선이 40분 전부터 게속 20분선 위에 있다가 아래로 내려오면 매도함 - if data["avg3"][i] < data["avg20"][i]: - valid = True - for c in range(1, 41): - if data["avg3"][i-c] < data["avg20"][i-c]: - valid = False - break - if valid: - sell = data["high"][i] - return sell, weight - + param = 1 + if ( + data["diff_avg27"][i] > 0.371828521*param and + data["diff_avg3_avg27"][i] > 6.254009915 * param and + data["diff_avg3_avg54"][i] > 8.234179061 * param and - # 3분 선이 60분 전부터 게속 30분선 위에 있다가 아래로 내려오면 매도함 - if data["avg3"][i] < data["avg30"][i]: - valid = True - for c in range(1, 61): - if data["avg3"][i-c] < data["avg30"][i-c]: - valid = False - break - if valid: - sell = data["high"][i] - return sell, weight + data["diff_avg6_avg27"][i] > 4.87605716 * param and + data["diff_avg6_avg54"][i] > 6.856226305*param and - # rsi와 rsis가 75이상에서 slow_k가 slow_d 아래롸 내려온 경우 - if data["rsi"][i] >= 70 and data["rsis"][i] >= 70: - if data["rsi"][i-1] > data["rsis"][i-1] and data["rsi"][i] < data["rsis"][i]: - sell = data["high"][i] - return sell, weight + data["diff_avg9_avg27"][i] > 3.664333625 * param and + data["diff_avg9_avg54"][i] > 5.64450277*param and + data["diff_avg12_avg27"][i] > 2.802566346 * param and + data["diff_avg12_avg54"][i] > 4.782735491*param and - # slow_k와 slow_d가 90이상에서 slow_k가 slow_d 아래롸 내려온 경우 - if data["slow_k"][i] >= 90 and data["slow_d"][i] >= 90: - if data["slow_k"][i-1] > data["slow_d"][i-1] and data["slow_k"][i] < data["slow_d"][i]: - if data["avg3"][i] < data["avg5"][i]: - sell = data["high"][i] - if data.index[i].strftime("%H:%M") < "12:00" and data['rsis'][i] < 70: - return -1, -1 - return sell, weight + data["diff_change_lead1"][i] > 7.057086614 * param and + data["diff_open_lead1"][i] > 10.34448819*param and + data["diff_close_lead1"][i] > 11.17125984*param and + data["diff_high_lead1"][i] > 13.69094488*param and + data["diff_low_lead1"][i] > 7.234251969*param and - # 양봉 5개 이후 음봉이 나온 경우 - if ((data["low"][i-5] <= data["open"][i-5] <= data["close"][i-5] <= data["high"][i-5] and - data["low"][i-4] <= data["open"][i-4] <= data["close"][i-4] <= data["high"][i-4] and - data["low"][i-3] <= data["open"][i-3] <= data["close"][i-3] <= data["high"][i-3] and - data["low"][i-2] <= data["open"][i-2] <= data["close"][i-2] <= data["high"][i-2] and - data["low"][i-1] <= data["open"][i-1] <= data["close"][i-1] <= data["high"][i-1]) and - data["high"][i-5] <= data["high"][i-4] <= data["high"][i-3] <= data["high"][i-2] <= data["high"][i-1]): + data["diff_upper_lower"][i] > 19.77913348*param and + data["diff_change_base"][i] > 3.011811024*param + ): - if data["avg30"][i-1] < data["avg20"][i-1] < data["avg10"][i-1] < data["avg5"][i-1] < data["avg3"][i-1]: - if data["close"][i] < data["open"][i] and data["low"][i] < data["low"][i-1]: - if data["slow_k"][i] >= 95: - sell = data["high"][i] - weight = 1 - return sell, weight + buy = int((data["open"][i] + data["close"][i]) / 2) + weight = 1 + return buy, weight - if i > 381 + 15: - # 볼린저를 돌파했거나 고가가 모든 선위에 있다가 3번 이상 음봉 맞은 경우 - if ((data["high"][i-4] > data["upper"][i-4] or data["high"][i-4] > data["avg3"][i-4] > data["avg5"][i-4] > data["avg10"][i-4] > data["avg20"][i-4] > data["avg30"][i-4]) or - (data["high"][i-3] > data["upper"][i-3] or data["high"][i-3] > data["avg3"][i-3] > data["avg5"][i-3] > data["avg10"][i-3] > data["avg20"][i-3] > data["avg30"][i-3])): - if self.isUmbong(data, i-2) and self.isUmbong(data, i-1) and self.isUmbong(data, i): - if data["slow_k"][i] >= 80: - sell = int((data["high"][i] + data["low"][i])/2) - weight = 1 - return sell, weight - """ return sell, weight - - - - # 레버리지에 해당함 - def getBuyPriceAndWeight_15000(self, data, i): + def getBuyPriceAndWeight_122630(self, data, i): buy, weight = -1, -1 START_TIME_INDEX = 0 @@ -547,248 +297,48 @@ class BuySellChecker: START_TIME_INDEX = c break - if i >= START_TIME_INDEX: + if i > START_TIME_INDEX: # 매수 분석 - if i > 710: - # "14:30" 까지만 매수 - return buy, weight + param = 1 + if (data["macd"][i] < -1.481742793 and data["macdo"][i] < -0.966054903 and + data["diff_avg27"][i] < -0.522721303 * param and + data["diff_avg3_avg27"][i] < -6.486734962 * param and + data["diff_avg3_avg54"][i] < -4.764250066 * param and - if i > 380 + 30 and data["macd"][i] < -25: - if data["avg3"][i] > min(data["avg6"][i], data["avg9"][i], data["avg12"][i]): - buy = data["high"][i] - if i < 381 + 40: - weight = 1 - else: - weight = 5 - return buy, weight + data["diff_avg6_avg27"][i] < -3.106120305 * param and + data["diff_avg6_avg54"][i] < -1.383635408 * param and - if i > 380 + 30 and data["macd"][i] < -5 and data["rsi"][i] < 30: - if data["avg3"][i] > min(data["avg6"][i], data["avg9"][i], data["avg12"][i]): - buy = int((data["open"][i] + data["close"][i]) / 2) - weight = 2 - return buy, weight + data["diff_avg9_avg27"][i] < -3.007617547 * param and + data["diff_avg9_avg54"][i] < -1.28513265 * param and - if i > 380 + 30 and data["slow_k"][i] < 10 and data["rsi"][i] < 30: - if data["slow_k"][i - 1] < min(data["slow_k"][i - 2], data["slow_k"][i]): - if data["avg3"][i] > min(data["avg6"][i], data["avg9"][i], data["avg12"][i]): - buy = int((data["open"][i] + data["close"][i]) / 2) - weight = 2 - return buy, weight + data["diff_avg12_avg27"][i] < -3.206593118 * param and + data["diff_avg12_avg54"][i] < -1.484108222 * param and - # 3분선이 5분선이 돌파가 이전보다 높은 경우 매수 - if (data["avg3"][i - 1] < data["avg9"][i - 1] and data["avg3"][i] > data["avg9"][i] or - data["avg3"][i - 2] < data["avg9"][i - 2] and data["avg3"][i - 1] > data["avg9"][i - 1] and data["avg3"][i] > data["avg9"][i]): - max_avg3 = 0 - p_avg3 = 999999 - for c in range(2, 50): - if max_avg3 < data["avg9"][i - c]: - max_avg3 = data["avg9"][i - c] - if data["avg3"][i - c - 2] < data["avg9"][i - c - 2] and data["avg3"][i - c - 1] <= data["avg9"][i - c - 1] and data["avg3"][i - c] > data["avg9"][i - c]: - p_avg3 = data["avg3"][i - c] - break - if data["avg3"][i] > p_avg3+3 and max_avg3 < data["avg3"][i]: - # if data["avg6"][i-10] > data["avg6"][i]: - if data['macd'][i] <= 0: - if i == 382 or i == 383: - if data["close"][i] != data["high"][i]: - return -1, -1 - buy = data["low"][i] - weight = 1 - return buy, weight - """ - # 3분선이 10분 이상 7분선 아래에 있다가 7분선 위로 올라옴 - if i >= 381 + 10: - vaild = True - for c in range(2, 10): - if data["avg3"][i - c] > data["avg7"][i - c]: - vaild = False - break - if vaild: - if data["avg3"][i - 1] >= data["avg7"][i - 1] and data["avg3"][i] >= data["avg7"][i]: - buy = int(data["avg3"][i] - data["avg3"][i] % 5) - weight = 1 - return self.getBuyCheck(data, i, buy, weight) - """ + data["diff_change_lead1"][i] < -2.872340426 * param and + data["diff_open_lead1"][i] < -4.787234043 * param and + data["diff_close_lead1"][i] < -12.34042553 * param and + data["diff_high_lead1"][i] < 0.106382979 * param and + data["diff_low_lead1"][i] < -17.69503546 * param and - """ - # 30일 이전부터 모든 선이 좁혀졌다 녋혀지면서 다시 상승하며 좁혀짐 - if max(data["avg3"][i], data["avg5"][i], data["avg10"][i], data["avg20"][i], data["avg30"][i]) - min(data["avg3"][i], data["avg5"][i], data["avg10"][i], data["avg20"][i]) < 5: - if data["avg3"][i - 1] < data["avg3"][i] and data["macd"][i] < 20: - if (data["close"][i] > (data["avg3"][i] and data["avg5"][i] and data["avg10"][i] and data["avg20"][i] and data["avg30"][i])): - if data["close"][i] > data["open"][i]: - check1 = False - check2 = False - high = 0 - for c in range(1, 30): - if not check1 and not check2: - if max(data["avg3"][i - c], data["avg5"][i - c], data["avg10"][i - c], data["avg20"][i - c], data["avg30"][i - c]) - min(data["avg3"][i - c], data["avg5"][i - c], data["avg10"][i - c], data["avg20"][i - c]) < 20: - check1 = True - if high < data['high'][i-c]: - high = data['high'][i-c] - continue - if check1 and not check2: - if max(data["avg3"][i - c], data["avg5"][i - c], data["avg10"][i - c], data["avg20"][i - c], data["avg30"][i - c]) - min(data["avg3"][i - c], data["avg5"][i - c], data["avg10"][i - c], data["avg20"][i - c], data["avg30"][i - c]) > 60: - if data["avg20"][i - c] < data["avg10"][i - c] < data["avg5"][i - c] < data["avg3"][i - c]: - check2 = True - if high < data['high'][i - c]: - high = data['high'][i - c] - break - if check1 and check2: - if high - data["close"][i] >= 20: - buy = int((data["close"][i] + data["low"][i]) / 2) - weight = 1 - return self.getBuyCheck(data, i, buy, weight) + data["diff_upper_lower"][i] < 110.7506807 * param + 124.7189534 / 3 and + data["diff_change_base"][i] < -7.712765957 * param and - # 최근 양봉 3개가 나오면, - # 최근 10개의 min(open, close)가 계속 낮아지거나 동일함 - if data["low"][i - 2] <= data["open"][i - 2] < data["close"][i - 2] <= data["high"][i - 2]: - if data["low"][i - 1] <= data["open"][i - 1] < data["close"][i - 1] <= data["high"][i - 1]: - if data["low"][i] <= data["open"][i] <= data["close"][i] <= data["high"][i]: - if data['close'][i-2]-data['open'][i-2] >= 20 or data['close'][i-1]-data['open'][i-1] >= 20 or data['close'][i]-data['open'][i] >= 20: - if data['high'][i-7] > data['high'][i]: - invalid = False - for c in range(4, 8): - if max(data['open'][i-c], data['close'][i-c]) > max(data['open'][i-c-1], data['close'][i-c-1]): - invalid = True - if not invalid: - buy = data["close"][i] - weight = 1 - return self.getBuyCheck(data, i, buy, weight) - - # 최근 양봉 3개가 나오면, - # 9시 3분이나 4분에 장 시작 양봉 연속 3개면 매수 - # (2022-07-11 09:03), (2022-07-14 14:33 14:36) - if data.index[i].strftime("%H:%M") == "09:03": - if data["low"][i - 2] <= data["open"][i - 2] < data["close"][i - 2] <= data["high"][i - 2]: - if data["low"][i - 1] <= data["open"][i - 1] < data["close"][i - 1] <= data["high"][i - 1]: - if data["low"][i] <= data["open"][i] < data["close"][i] <= data["high"][i]: - buy = data["high"][i] + 5 - weight = 1 - return self.getBuyCheck(data, i, buy, weight) - - - # 최근 양봉 5개가 나오면, - # 최근 10개의 min(open, close)가 계속 낮아지거나 동일함 - if data["low"][i - 4] <= data["open"][i - 4] <= data["close"][i - 4] <= data["high"][i - 4]: - if data["low"][i - 3] <= data["open"][i - 3] <= data["close"][i - 3] <= data["high"][i - 3]: - if data["low"][i - 2] <= data["open"][i - 2] <= data["close"][i - 2] <= data["high"][i - 2]: - if data["low"][i - 1] <= data["open"][i - 1] <= data["close"][i - 1] <= data["high"][i - 1]: - if data["low"][i] <= data["open"][i] <= data["close"][i] <= data["high"][i]: - down = 0 - for c in range(5, 21): - if max(data['open'][i-c], data['close'][i-c]) < max(data['open'][i-c-1], data['close'][i-c-1]): - down += 1 - if down >= 10: - buy = data["close"][i] - weight = 1 - return self.getBuyCheck(data, i, buy, weight) - - - # 장시작 5개 high가 볼린져 상단 위에 있을 때 중간 값에서 매수 - if data.index[i].strftime("%H:%M") == "09:05": - if data["upper"][i - 4] < data["high"][i - 4] and data["upper"][i - 3] < data["high"][i - 3] and \ - data["upper"][i - 2] < data["high"][i - 2] and data["upper"][i - 1] < data["high"][i - 1] and \ - data["upper"][i] < data["high"][i]: - buy = int((data["open"][i] + data["close"][i]) / 2) - weight = 1 - return self.getBuyCheck(data, i, buy, weight) - - # 장 초기 (시작 9분 이내), 볼린져 하단에서 시작하여 이병선을 모두 상승하여 마감한 경우 high 값에서 매수한다. - if i < 381 + 9: - if data["close"][i] > max(data["avg3"][i], data["avg5"][i], data["avg10"][i], data["avg20"][i], data["avg30"][i]): - c = 382 - # 장 시작 역배열 상태임 - if data["avg3"][c] < data["avg5"][c] < data["avg10"][c] < data["avg20"][c] < data["avg30"][c] and data["close"][c] < data["lower"][c]: - if data["upper"][i] < data["high"][i]: - buy = data["close"][i] - else: - buy = data["high"][i] - weight = 1 - return self.getBuyCheck(data, i, buy, weight) - - # 이동선을 이용한 매매 - # 3분선과 10분선이 30분 이상 내려오다가 3분선이 10분선을 넘어 서는 순간 매수 - # (2022-07-08 14:57) (2022-07-04 10:39) (2022-07-11 11:09) (2022-07-15 09:36) - if i < 381 * 2 - 50: - if int(data["avg3"][i]) > int(data["avg10"][i]): - valid = True - same_count = 0 - for c in range(1, 30): - if int(data["avg3"][i - c]) == int(data["avg10"][i - c]): - same_count += 1 - if int(data["avg3"][i - c]) > int(data["avg10"][i - c]): - valid = False - break - if valid and same_count < 2: - buy = data["close"][i] - 5 - weight = 1 - return self.getBuyCheck(data, i, buy, weight) - - # 음봉이 4개 이상 이후 이전 2개의 음봉 위로 올라오는 장대 양봉 - if data["close"][i-4] < data["open"][i-4] and data["close"][i-3] < data["open"][i-3] and data["close"][i-2] < data["open"][i-2] and data["close"][i-1] < data["open"][i-1]: - if data["close"][i-1] <= data["open"][i] and data["open"][i-2] <= data["close"][i]: - if data["close"][i] - data["open"][i] >= 20: - buy = data["close"][i] + 5 - weight = 1 - return self.getBuyCheck(data, i, buy, weight) - - # 30분 이내로 역배열에서 현재 정배열 시작 - if i > 381 + 30: - if max(data["avg3"][i-2], data["avg5"][i-2], data["avg10"][i-2], data["avg20"][i-2],data["avg30"][i-2]) - min(data["avg3"][i-2], data["avg5"][i-2], data["avg10"][i-2],data["avg20"][i-2]) < 7: - if data["avg3"][i-2] > data["avg5"][i-2] > data["avg10"][i-2] > data["avg20"][i-2] > data["avg30"][i-2]: - if data["avg3"][i] > data["avg5"][i] > data["avg10"][i] > data["avg20"][i] > data["avg30"][i]: - for c in range(10, 38): - if data["avg3"][i-c] < data["avg5"][i-c] < data["avg10"][i-c] < data["avg20"][i-c] < data["avg30"][i-c]: - buy = data["close"][i] - weight = 1 - return self.getBuyCheck(data, i, buy, weight) - - if i > 381 + 18: - # 최근 저점이 이전 저점보다 avg3는 크지만, rsi는 높은 경우 - if data['avg3'][i-2] < data['avg3'][i-1] < data['avg3'][i]: - if data['avg3'][i-2] < data['avg3'][i-3] < data['avg3'][i-4] < data['avg3'][i-5]: - if data['open'][i-1] < data['close'][i-1] and data['open'][i] < data['close'][i]: - if data['avg3'][i-1] < data['avg3'][i] and data['avg5'][i-1] < data['avg5'][i] and data['avg10'][i-1] < data['avg10'][i]: - if data['close'][i] - data['open'][i] >= 10: - if max(data["avg3"][i - 2], data["avg5"][i - 2], data["avg10"][i - 2],data["avg20"][i - 2], data["avg30"][i - 2]) - min(data["avg3"][i - 2], data["avg5"][i - 2], data["avg10"][i - 2], data["avg20"][i - 2]) > 15: - idx = -1 - value = 9999999999 - for c in range(6, 18): - if data['avg3'][i-c] < value: - value = data['avg3'][i-c] - idx = i-c - - if data['avg3'][idx] < data['avg3'][i-2] and data['rsi'][i-2] < data['rsi'][idx]: - buy = data["high"][i] - weight = 1 - return self.getBuyCheck(data, i, buy, weight) - - if data['close'][i] - data['open'][i] >= 90 and data['close'][i] == data['high'][i]: + data["diff_avg3"][i] < -4.621749409 * param and + data["diff_avg6"][i] < -1.88534279 * param and + data["diff_avg9"][i] < -0.996847912 * param and + data["diff_avg12"][i] < -1.025413712 * param and + data["diff_avg27"][i] < -0.522721303 * param and + data["diff_avg54"][i] < 0.005910165 * param + ): buy = int((data["open"][i] + data["close"][i]) / 2) weight = 1 return buy, weight - - - # 장 초기 (시작 9분 이내), 볼린져 하단에서 시작하여 이병선을 모두 상승하여 마감한 경우 high 값에서 매수한다. - # (2022-07-15 09:08 09:09) - if i <= 381 + 4: - if data["close"][381] < min(data["lower"][381], data["avg3"][381], data["avg5"][381], data["avg10"][381], data["avg20"][381], data["avg30"][381]): - for c in range(1, 4): - if i-c < 382: - break - if data["close"][i-c] > max(data["upper"][i-c], data["avg3"][i-c], data["avg5"][i-c], data["avg10"][i-c], data["avg20"][i-c], data["avg30"][i-c]): - buy = data["high"][i] - weight = 3 - return buy, weight - """ - - return buy, weight - def getSellPriceAndWeight_15000(self, data, i): + def getSellPriceAndWeight_122630(self, data, i): sell, weight = -1, -1 START_TIME_INDEX = 0 @@ -797,189 +347,63 @@ class BuySellChecker: START_TIME_INDEX = c break - if i >= START_TIME_INDEX: - # 매도 분석 - - # 10분선 위에서 3분선이 5분선을 하향 돌파 하는 경우 매도 - if data["slow_k"][i - 1] > 50 and data["avg3"][i - 1] >= data["avg6"][i - 1] and data["avg3"][i] < data["avg6"][i]: - if max(data["avg3"][i], data["avg6"][i]) < data["avg9"][i]: - sell = int((data["open"][i] + data["close"][i]) / 2) - weight = 1 - return sell, weight + if i > START_TIME_INDEX: + # 매수 분석 # 3분선이 10분 이상 6분선 위에 있다가 5분선 아래로 내려옴 if i >= 381 + 5: vaild = True + count = 0 for c in range(1, 11): + if data["avg3"][i - c] == data["avg6"][i - c]: + count += 1 if data["avg3"][i - c] < data["avg6"][i - c]: vaild = False break - if vaild: + if vaild and count < 3: if data["avg3"][i] < data["avg6"][i]: sell = int(data["avg3"][i] - data["avg3"][i]%5) weight = 1 return sell, weight - """ - # 3분 선이 40분 전부터 게속 20분선 위에 있다가 아래로 내려오면 매도함 - if data["avg3"][i] < data["avg20"][i]: - valid = True - for c in range(1, 41): - if data["avg3"][i - c] < data["avg20"][i - c]: - valid = False - break - if valid: - sell = int((data["open"][i] + data["close"][i]) / 2) - return sell, weight + param = 2 + if (data["macd"][i] > 11.4590339 and + data["diff_avg27"][i] > 2.261904762 * param and + data["diff_avg3_avg27"][i] > 28.83730159 * param and + data["diff_avg3_avg54"][i] > 40.84391534 * param and - # 3분 선이 60분 전부터 게속 30분선 위에 있다가 아래로 내려오면 매도함 - if data["avg3"][i] < data["avg30"][i]: - valid = True - for c in range(1, 61): - if data["avg3"][i - c] < data["avg30"][i - c]: - valid = False - break - if valid: - sell = int((data["open"][i] + data["close"][i]) / 2) - return sell, weight + data["diff_avg6_avg27"][i] > 22.49801587 * param and + data["diff_avg6_avg54"][i] > 34.50462963 * param and - # rsi와 rsis가 75이상에서 slow_k가 slow_d 아래롸 내려온 경우 - if data["rsi"][i] >= 70 and data["rsis"][i] >= 70: - if data["rsi"][i - 1] > data["rsis"][i - 1] and data["rsi"][i] < data["rsis"][i]: - sell = int((data["open"][i] + data["close"][i]) / 2) - return sell, weight + data["diff_avg9_avg27"][i] > 17.6984127 * param and + data["diff_avg9_avg54"][i] > 29.70502646 * param and - # slow_k와 slow_d가 90이상에서 slow_k가 slow_d 아래롸 내려온 경우 - if data["slow_k"][i] >= 90 and data["slow_d"][i] >= 90: - if data["slow_k"][i - 1] > data["slow_d"][i - 1] and data["slow_k"][i] < data["slow_d"][i]: - if data["avg3"][i] < data["avg5"][i]: - sell = int((data["open"][i] + data["close"][i]) / 2) + data["diff_avg12_avg27"][i] > 13.59920635 * param and + data["diff_avg12_avg54"][i] > 25.60582011 * param and - if data.index[i].strftime("%H:%M") < "12:00" and data['rsis'][i] < 70: - return -1, -1 + data["diff_change_lead1"][i] > 40.82142857 * param and + data["diff_open_lead1"][i] > 53.48214286 * param and + data["diff_close_lead1"][i] > 58.23214286 * param and + data["diff_high_lead1"][i] > 63.125 * param and + data["diff_low_lead1"][i] > 49.41071429 * param and - return sell, weight + data["diff_upper_lower"][i] < 70.63330362 * param + 124.7189534 / 3 and + data["diff_change_base"][i] > 16.73214286 * param and - # 양봉 5개 이후 음봉이 나온 경우 - if ((data["low"][i - 5] <= data["open"][i - 5] <= data["close"][i - 5] <= data["high"][i - 5] and - data["low"][i - 4] <= data["open"][i - 4] <= data["close"][i - 4] <= data["high"][i - 4] and - data["low"][i - 3] <= data["open"][i - 3] <= data["close"][i - 3] <= data["high"][i - 3] and - data["low"][i - 2] <= data["open"][i - 2] <= data["close"][i - 2] <= data["high"][i - 2] and - data["low"][i - 1] <= data["open"][i - 1] <= data["close"][i - 1] <= data["high"][i - 1]) and - data["high"][i - 5] <= data["high"][i - 4] <= data["high"][i - 3] <= data["high"][i - 2] <= data["high"][i - 1]): - - if data["avg30"][i - 1] < data["avg20"][i - 1] < data["avg10"][i - 1] < data["avg5"][i - 1] < data["avg3"][i - 1]: - if data["close"][i] < data["open"][i] and data["low"][i] < data["low"][i - 1]: - if data["slow_k"][i] >= 95: - sell = data["close"][i] - weight = 1 - return sell, weight - - if i > 381 + 15: - # 볼린저를 돌파했거나 고가가 모든 선위에 있다가 3번 이상 음봉 맞은 경우 - if (data["high"][i - 3] > data["upper"][i - 3] or data["high"][i - 3] > data["avg3"][i - 3] > data["avg5"][i - 3] > data["avg10"][i - 3] > data["avg20"][i - 3] > data["avg30"][i - 3]): - if data["close"][i - 2] < data["open"][i - 2] and data["close"][i - 1] < data["open"][i - 1] and data["close"][i] < data["open"][i]: - sell = data["low"][i] - weight = 1 - return sell, weight - """ + data["diff_avg3"][i] > 4.714285714 * param and + data["diff_avg6"][i] > 3.857142857 * param and + data["diff_avg9"][i] > 3.373015873 * param and + data["diff_avg12"][i] > 3.026785714 * param and + data["diff_avg27"][i] > 2.261904762 * param and + data["diff_avg54"][i] > 1.18452381 * param + ): + buy = int((data["open"][i] + data["close"][i]) / 2) + weight = 1 + return buy, weight return sell, weight def analyze(self, result): - open = result["open"] - close = result["close"] - high = result["high"] - low = result["low"] - vol = result["vol"] - - close_df = pd.DataFrame(close) - avg3_list = close_df.rolling(window=3).mean().fillna(close[0]).values.tolist() - avg3 = [item[0] for item in avg3_list] - avg6_list = close_df.rolling(window=6).mean().fillna(close[0]).values.tolist() - avg6 = [item[0] for item in avg6_list] - avg9_list = close_df.rolling(window=9).mean().fillna(close[0]).values.tolist() - avg9 = [item[0] for item in avg9_list] - avg12_list = close_df.rolling(window=12).mean().fillna(close[0]).values.tolist() - avg12 = [item[0] for item in avg12_list] - avg24_list = close_df.rolling(window=24).mean().fillna(close[0]).values.tolist() - avg24 = [item[0] for item in avg24_list] - avg30_list = close_df.rolling(window=30).mean().fillna(close[0]).values.tolist() - avg30 = [item[0] for item in avg30_list] - avg60_list = close_df.rolling(window=60).mean().fillna(close[0]).values.tolist() - avg60 = [item[0] for item in avg60_list] - - df = pd.DataFrame(close) - max20 = df.rolling(window=20).mean() - stddev20 = df.rolling(window=20).std() - upper_df = max20 + (stddev20 * 2) # 상단 볼린저 밴드 - lower_df = max20 - (stddev20 * 2) # 하단 볼린저 밴드 - - upper, lower = [], [] - for i in range(len(upper_df)): - if i < 10: - upper.append(upper_df.values[0][0]) - lower.append(lower_df.values[0][0]) - else: - upper.append(upper_df.values[i][0]) - lower.append(lower_df.values[i][0]) - - point_temp = result["time"] - - STOCK = [] - for i in range(len(open)): - STOCK.append({'volume': vol[i], 'close': close[i], 'open': open[i], 'high': high[i], 'low': low[i], - 'avg3': avg3[i], 'avg6': avg6[i], 'avg9': avg9[i], 'avg12': avg12[i],'avg24': avg24[i],'avg30': avg30[i],'avg60': avg60[i]}) - - # stochastic 계산 - stochastic_df = self.stochastic.apply(STOCK, n=30, m=5, t=5) - stochastic_df = stochastic_df.fillna(100) - fast_k = stochastic_df['fast_k'].values.tolist() - slow_k = stochastic_df['slow_k'].values.tolist() - slow_d = stochastic_df['slow_d'].values.tolist() - - # macd 계산 - macd_df = self.macd.apply(STOCK, short=12, long=26, t=9) - macd_df = macd_df.fillna(100) - macd = macd_df['macd'].values.tolist() - macds = macd_df['macds'].values.tolist() - macdo = macd_df['macdo'].values.tolist() - - # rsi 계산 - rsi_df = self.rsi.apply(STOCK, period=30, window=5) - rsi_df = rsi_df.fillna(100) - rsi = rsi_df['rsi'].values.tolist() - rsis = rsi_df['rsis'].values.tolist() - - # ichimokuCloud 계산 - # ichimokuCloud_df = self.ichimokuCloud.apply(STOCK, c=9, b=26, l=52) - # ichimokuCloud_df = rsi_df.fillna(100) - # changeLine = rsi_df['changeLine'].values.tolist() - # baseLine = rsi_df['baseLine'].values.tolist() - # leadingSpan1 = rsi_df['leadingSpan1'].values.tolist() - # leadingSpan2 = rsi_df['leadingSpan2'].values.tolist() - - temp = {"date": point_temp, - "open": open, "high": high, "low": low, "close": close, "volume": vol, "upper": upper, "lower": lower, - "avg3": avg3, "avg6": avg6, "avg9": avg9, "avg12": avg12, "avg24": avg24, "avg30": avg30, "avg60": avg60, - "macd": macd, "macds": macds, "macdo": macdo, - "fast_k": fast_k, "slow_k": slow_k, "slow_d": slow_d, - "rsi": rsi, "rsis": rsis} - data = pd.DataFrame(temp) - df_final_time = pd.DatetimeIndex(point_temp) - data.index = df_final_time - - return data - - def getSign(self, data1, data2): - diff_sign = [] - for i in range(0, len(data1)): - if data1[i] > data2[i]: diff_sign.append(2) - elif data1[i] == data2[i]: diff_sign.append(1) - else: diff_sign.append(0) - return diff_sign - - def getVectorFeature(self, result): # 기본 캔들 정보 open = result["open"] close = result["close"] @@ -992,80 +416,78 @@ class BuySellChecker: height = [close[i] - open[i] for i in range(0, len(close))] top_tail_height = [high[i] - max(open[i], close[i]) for i in range(0, len(close))] bottom_tail_height = [min(open[i], close[i]) - low[i] for i in range(0, len(close))] - diff_price = [close[i] - close[i - 1] for i in range(1, len(close))] - diff_price.insert(0, 0) - diff_price_sign = [] - for i in range(1, len(close)): - if close[i] > close[i - 1]: diff_price_sign.append(2) - elif close[i] == close[i - 1]: diff_price_sign.append(1) - else: diff_price_sign.append(0) - diff_price_sign.insert(0, 0) # 이동 평균 close_df = pd.DataFrame(close) avg3_list = close_df.rolling(window=3).mean().fillna(close[0]).values.tolist() avg3 = [item[0] for item in avg3_list] - avg5_list = close_df.rolling(window=5).mean().fillna(close[0]).values.tolist() - avg5 = [item[0] for item in avg5_list] avg6_list = close_df.rolling(window=6).mean().fillna(close[0]).values.tolist() avg6 = [item[0] for item in avg6_list] avg9_list = close_df.rolling(window=9).mean().fillna(close[0]).values.tolist() avg9 = [item[0] for item in avg9_list] - avg10_list = close_df.rolling(window=10).mean().fillna(close[0]).values.tolist() - avg10 = [item[0] for item in avg10_list] avg12_list = close_df.rolling(window=12).mean().fillna(close[0]).values.tolist() avg12 = [item[0] for item in avg12_list] - avg20_list = close_df.rolling(window=20).mean().fillna(close[0]).values.tolist() - avg20 = [item[0] for item in avg20_list] - avg24_list = close_df.rolling(window=24).mean().fillna(close[0]).values.tolist() - avg24 = [item[0] for item in avg24_list] - avg30_list = close_df.rolling(window=30).mean().fillna(close[0]).values.tolist() - avg30 = [item[0] for item in avg30_list] - avg60_list = close_df.rolling(window=60).mean().fillna(close[0]).values.tolist() - avg60 = [item[0] for item in avg60_list] + avg27_list = close_df.rolling(window=27).mean().fillna(close[0]).values.tolist() + avg27 = [item[0] for item in avg27_list] + avg54_list = close_df.rolling(window=54).mean().fillna(close[0]).values.tolist() + avg54 = [item[0] for item in avg54_list] + + abs_avg_1 = [max(avg3[i], avg6[i], avg9[i], avg12[i], avg27[i], avg54[i]) - min(avg3[i], avg6[i], avg9[i], avg12[i], avg27[i], avg54[i]) for i in range(0, len(close))] + abs_avg_2 = [max(avg3[i], avg6[i], avg9[i], avg12[i], avg27[i]) - min(avg3[i], avg6[i], avg9[i], avg12[i], avg27[i]) for i in range(0, len(close))] + abs_avg_3 = [max(avg3[i], avg6[i], avg9[i], avg12[i]) - min(avg3[i], avg6[i], avg9[i], avg12[i]) for i in range(0, len(close))] + abs_avg_4 = [max(avg3[i], avg6[i], avg9[i]) - min(avg3[i], avg6[i], avg9[i]) for i in range(0, len(close))] + abs_avg_5 = [max(avg3[i], avg6[i]) - min(avg3[i], avg6[i]) for i in range(0, len(close))] + + diff_open, diff_close, diff_low, diff_high = [], [], [], [] + diff_open.append(0) + for i in range(1, len(open)): + diff_open.append(open[i] - open[i - 1]) + diff_close.append(0) + for i in range(1, len(close)): + diff_close.append(close[i] - close[i - 1]) + diff_low.append(0) + for i in range(1, len(low)): + diff_low.append(low[i] - low[i - 1]) + diff_high.append(0) + for i in range(1, len(high)): + diff_high.append(high[i] - high[i - 1]) + + diff_avg3, diff_avg6, diff_avg9, diff_avg12, diff_avg27, diff_avg54 = [], [], [], [], [], [] + diff_avg3.append(0) + for i in range(1, len(avg3)): + diff_avg3.append(avg3[i]-avg3[i-1]) + diff_avg6.append(0) + for i in range(1, len(avg6)): + diff_avg6.append(avg6[i] - avg6[i - 1]) + diff_avg9.append(0) + for i in range(1, len(avg9)): + diff_avg9.append(avg9[i] - avg9[i - 1]) + diff_avg12.append(0) + for i in range(1, len(avg12)): + diff_avg12.append(avg12[i] - avg12[i - 1]) + diff_avg27.append(0) + for i in range(1, len(avg27)): + diff_avg27.append(avg27[i] - avg27[i - 1]) + diff_avg54.append(0) + for i in range(1, len(avg54)): + diff_avg54.append(avg54[i] - avg54[i - 1]) + - abs_avg_1 = [max(avg3[i], avg5[i], avg6[i], avg9[i], avg10[i], avg12[i], avg20[i], avg24[i], avg30[i], avg60[i]) - min(avg3[i], avg5[i], avg6[i], avg9[i], avg10[i], avg12[i], avg20[i], avg30[i], avg60[i]) for i in range(0, len(close))] - abs_avg_2 = [max(avg3[i], avg5[i], avg6[i], avg9[i], avg10[i], avg12[i], avg20[i], avg24[i], avg30[i]) - min(avg3[i], avg5[i], avg6[i], avg9[i], avg10[i], avg12[i], avg20[i], avg24[i], avg30[i]) for i in range(0, len(close))] - abs_avg_3 = [max(avg3[i], avg5[i], avg6[i], avg9[i], avg10[i], avg12[i], avg20[i]) - min(avg3[i], avg5[i], avg6[i], avg9[i], avg10[i], avg12[i], avg20[i]) for i in range(0, len(close))] - abs_avg_4 = [max(avg3[i], avg5[i], avg6[i], avg9[i], avg12[i]) - min(avg3[i], avg5[i], avg6[i], avg9[i], avg12[i]) for i in range(0, len(close))] - abs_avg_5 = [max(avg3[i], avg5[i], avg6[i], avg9[i]) - min(avg3[i], avg5[i], avg6[i], avg9[i]) for i in range(0, len(close))] - abs_avg_6 = [max(avg3[i], avg5[i], avg6[i]) - min(avg3[i], avg5[i], avg6[i]) for i in range(0, len(close))] - diff_avg3_avg5 = [avg3[i]-avg5[i] for i in range(0, len(close))] diff_avg3_avg6 = [avg3[i] - avg6[i] for i in range(0, len(close))] diff_avg3_avg9 = [avg3[i] - avg9[i] for i in range(0, len(close))] - diff_avg3_avg10 = [avg3[i] - avg10[i] for i in range(0, len(close))] diff_avg3_avg12 = [avg3[i] - avg12[i] for i in range(0, len(close))] - diff_avg3_avg20 = [avg3[i] - avg20[i] for i in range(0, len(close))] - diff_avg3_avg30 = [avg3[i] - avg30[i] for i in range(0, len(close))] - diff_avg3_avg60 = [avg3[i] - avg60[i] for i in range(0, len(close))] - diff_avg5_avg10 = [avg5[i] - avg10[i] for i in range(0, len(close))] - diff_avg5_avg20 = [avg5[i] - avg20[i] for i in range(0, len(close))] - diff_avg5_avg30 = [avg5[i] - avg30[i] for i in range(0, len(close))] - diff_avg5_avg60 = [avg5[i] - avg60[i] for i in range(0, len(close))] - diff_avg10_avg20 = [avg10[i] - avg20[i] for i in range(0, len(close))] - diff_avg10_avg30 = [avg10[i] - avg30[i] for i in range(0, len(close))] - diff_avg10_avg60 = [avg10[i] - avg60[i] for i in range(0, len(close))] - diff_avg20_avg30 = [avg20[i] - avg30[i] for i in range(0, len(close))] - diff_avg20_avg60 = [avg20[i] - avg60[i] for i in range(0, len(close))] - diff_avg30_avg60 = [avg30[i] - avg60[i] for i in range(0, len(close))] - diff_avg3_avg5_sign = self.getSign(avg3, avg5) - diff_avg3_avg6_sign = self.getSign(avg3, avg6) - diff_avg3_avg9_sign = self.getSign(avg3, avg9) - diff_avg3_avg10_sign = self.getSign(avg3, avg10) - diff_avg3_avg12_sign = self.getSign(avg3, avg12) - diff_avg3_avg20_sign = self.getSign(avg3, avg20) - diff_avg3_avg30_sign = self.getSign(avg3, avg30) - diff_avg3_avg60_sign = self.getSign(avg3, avg60) - diff_avg5_avg10_sign = self.getSign(avg5, avg10) - diff_avg5_avg20_sign = self.getSign(avg5, avg20) - diff_avg5_avg30_sign = self.getSign(avg5, avg30) - diff_avg5_avg60_sign = self.getSign(avg5, avg60) - diff_avg10_avg20_sign = self.getSign(avg10, avg20) - diff_avg10_avg30_sign = self.getSign(avg10, avg30) - diff_avg10_avg60_sign = self.getSign(avg10, avg60) - diff_avg20_avg30_sign = self.getSign(avg20, avg30) - diff_avg20_avg60_sign = self.getSign(avg20, avg60) - diff_avg30_avg60_sign = self.getSign(avg30, avg60) + diff_avg3_avg27 = [avg3[i] - avg27[i] for i in range(0, len(close))] + diff_avg3_avg54 = [avg3[i] - avg54[i] for i in range(0, len(close))] + diff_avg6_avg9 = [avg6[i] - avg9[i] for i in range(0, len(close))] + diff_avg6_avg12 = [avg6[i] - avg12[i] for i in range(0, len(close))] + diff_avg6_avg27 = [avg6[i] - avg27[i] for i in range(0, len(close))] + diff_avg6_avg54 = [avg6[i] - avg54[i] for i in range(0, len(close))] + diff_avg9_avg12 = [avg9[i] - avg12[i] for i in range(0, len(close))] + diff_avg9_avg27 = [avg9[i] - avg27[i] for i in range(0, len(close))] + diff_avg9_avg54 = [avg9[i] - avg54[i] for i in range(0, len(close))] + diff_avg12_avg27 = [avg12[i] - avg27[i] for i in range(0, len(close))] + diff_avg12_avg54 = [avg12[i] - avg54[i] for i in range(0, len(close))] + diff_avg27_avg54 = [avg27[i] - avg54[i] for i in range(0, len(close))] # 볼린져 밴드 df = pd.DataFrame(close) @@ -1087,7 +509,7 @@ class BuySellChecker: STOCK = [] for i in range(len(open)): STOCK.append({'volume': vol[i], 'close': close[i], 'open': open[i], 'high': high[i], 'low': low[i], - 'avg3': avg3[i], 'avg5': avg5[i],'avg6': avg6[i],'avg9': avg9[i],'avg10': avg10[i],'avg12': avg12[i],'avg20': avg20[i],'avg30': avg30[i],'avg60': avg60[i]}) + 'avg3': avg3[i], 'avg6': avg6[i],'avg9': avg9[i],'avg12': avg12[i],'avg27': avg27[i],'avg54': avg54[i]}) # stochastic stochastic_df = self.stochastic.apply(STOCK, n=30, m=5, t=5) @@ -1126,15 +548,6 @@ class BuySellChecker: diff_low_lower = [low[i] - lower[i] for i in range(0, len(low))] diff_low_upper = [low[i] - upper[i] for i in range(0, len(low))] - diff_upper_lower_sign = self.getSign(upper, lower) - diff_open_lower_sign = self.getSign(open, lower) - diff_open_upper_sign = self.getSign(open, upper) - diff_close_lower_sign = self.getSign(close, lower) - diff_close_upper_sign = self.getSign(close, upper) - diff_high_lower_sign = self.getSign(high, lower) - diff_high_upper_sign = self.getSign(high, upper) - diff_low_lower_sign = self.getSign(low, lower) - diff_low_upper_sign = self.getSign(low, upper) ##### 일목균형표 diff_lead1_lead2 = [leadingSpan1[i] - leadingSpan2[i] for i in range(0, len(leadingSpan1))] @@ -1164,62 +577,86 @@ class BuySellChecker: diff_rsi_rsis = [rsi[i] - rsis[i] for i in range(0, len(rsi))] - diff_lead1_lead2_sign = self.getSign(leadingSpan1, leadingSpan2) - diff_change_base_sign = self.getSign(changeLine, baseLine) - diff_base_lead1_sign = self.getSign(baseLine, leadingSpan1) - diff_base_lead2_sign = self.getSign(baseLine, leadingSpan2) - diff_change_lead1_sign = self.getSign(changeLine, leadingSpan1) - diff_change_lead2_sign = self.getSign(changeLine, leadingSpan2) - diff_open_lead2_sign = self.getSign(open, leadingSpan2) - diff_open_lead1_sign = self.getSign(open, leadingSpan1) - diff_open_change_sign = self.getSign(open, changeLine) - diff_open_base_sign = self.getSign(open, baseLine) - diff_close_lead2_sign = self.getSign(close, leadingSpan2) - diff_close_lead1_sign = self.getSign(close, leadingSpan1) - diff_close_change_sign = self.getSign(close, changeLine) - diff_close_base_sign = self.getSign(close, baseLine) - diff_high_lead2_sign = self.getSign(high, leadingSpan2) - diff_high_lead1_sign = self.getSign(high, leadingSpan1) - diff_high_change_sign = self.getSign(high, changeLine) - diff_high_base_sign = self.getSign(high, baseLine) - diff_low_lead2_sign = self.getSign(low, leadingSpan2) - diff_low_lead1_sign = self.getSign(low, leadingSpan1) - diff_low_change_sign = self.getSign(low, changeLine) - diff_low_base_sign = self.getSign(low, baseLine) - diff_macd_macds_sign = self.getSign(macd, macds) - diff_slowk_slowd_sign = self.getSign(slow_k, slow_d) - diff_rsi_rsis_sign = self.getSign(rsi, rsis) + diff_macd, diff_macdo, diff_macds = [], [], [] + diff_macd.append(0) + for i in range(1, len(macd)): + diff_macd.append(macd[i] - macd[i - 1]) + diff_macdo.append(0) + for i in range(1, len(macdo)): + diff_macdo.append(macdo[i] - macdo[i - 1]) + diff_macds.append(0) + for i in range(1, len(macds)): + diff_macds.append(macds[i] - macds[i - 1]) + + diff_fast_k, diff_slow_k, diff_slow_d = [], [], [] + diff_fast_k.append(0) + for i in range(1, len(fast_k)): + diff_fast_k.append(fast_k[i] - fast_k[i - 1]) + diff_slow_k.append(0) + for i in range(1, len(slow_k)): + diff_slow_k.append(slow_k[i] - slow_k[i - 1]) + diff_slow_d.append(0) + for i in range(1, len(slow_d)): + diff_slow_d.append(slow_d[i] - slow_d[i - 1]) + + diff_rsi, diff_rsis = [], [] + diff_rsi.append(0) + for i in range(1, len(rsi)): + diff_rsi.append(rsi[i] - rsi[i - 1]) + diff_rsis.append(0) + for i in range(1, len(rsis)): + diff_rsis.append(rsis[i] - rsis[i - 1]) + + diff_changeLine, diff_baseLine = [], [] + diff_changeLine.append(0) + for i in range(1, len(changeLine)): + diff_changeLine.append(changeLine[i] - changeLine[i - 1]) + diff_baseLine.append(0) + for i in range(1, len(baseLine)): + diff_baseLine.append(baseLine[i] - baseLine[i - 1]) + + diff_upper, diff_lower = [], [] + diff_upper.append(0) + for i in range(1, len(upper)): + diff_upper.append(upper[i] - upper[i - 1]) + diff_lower.append(0) + for i in range(1, len(lower)): + diff_lower.append(lower[i] - lower[i - 1]) # 결과 temp = { "date": point_temp, "open": open, "high": high, "low": low, "close": close, "volume": vol, - "avg3": avg3, "avg5": avg5, "avg6": avg6, "avg9": avg9, "avg10": avg10, "avg12": avg12, "avg20": avg20, "avg30": avg30, "avg60": avg60, + "avg3": avg3, "avg6": avg6, "avg9": avg9, "avg12": avg12, "avg27": avg27, "avg54": avg54, "upper": upper, "lower": lower, "macd": macd, "macds": macds, "macdo": macdo, "fast_k": fast_k, "slow_k": slow_k, "slow_d": slow_d, "rsi": rsi, "rsis": rsis, "changeLine": changeLine, "baseLine": baseLine, "leadingSpan1": leadingSpan1, "leadingSpan2": leadingSpan2, - "diff_price": diff_price, "height": height, "top_tail_height": top_tail_height, "bottom_tail_height": bottom_tail_height, - "abs_avg_1": abs_avg_1, "abs_avg_2": abs_avg_2, "abs_avg_3": abs_avg_3, "abs_avg_4": abs_avg_4, "abs_avg_5": abs_avg_5, "abs_avg_6": abs_avg_6, - "diff_avg3_avg5": diff_avg3_avg5, + "height": height, "top_tail_height": top_tail_height, "bottom_tail_height": bottom_tail_height, + "abs_avg_1": abs_avg_1, "abs_avg_2": abs_avg_2, "abs_avg_3": abs_avg_3, "abs_avg_4": abs_avg_4, "abs_avg_5": abs_avg_5, + "diff_open": diff_open, "diff_close": diff_close, "diff_low": diff_low, "diff_high": diff_high, + "diff_avg3":diff_avg3, "diff_avg6":diff_avg6, "diff_avg9":diff_avg9, "diff_avg12":diff_avg12, "diff_avg27":diff_avg27, "diff_avg54":diff_avg54, + "diff_macd":diff_macd, "diff_macdo":diff_macdo, "diff_macds":diff_macds, + "diff_fast_k":diff_fast_k, "diff_slow_k":diff_slow_k, "diff_slow_d":diff_slow_d, + "diff_rsi":diff_rsi, "diff_rsis":diff_rsis, + "diff_changeLine":diff_changeLine, "diff_baseLine":diff_baseLine, + "diff_upper":diff_upper, "diff_lower":diff_lower, "diff_avg3_avg6": diff_avg3_avg6, "diff_avg3_avg9": diff_avg3_avg9, - "diff_avg3_avg10": diff_avg3_avg10, "diff_avg3_avg12": diff_avg3_avg12, - "diff_avg3_avg20": diff_avg3_avg20, - "diff_avg3_avg30": diff_avg3_avg30, - "diff_avg3_avg60": diff_avg3_avg60, - "diff_avg5_avg10": diff_avg5_avg10, - "diff_avg5_avg20": diff_avg5_avg20, - "diff_avg5_avg30": diff_avg5_avg30, - "diff_avg5_avg60": diff_avg5_avg60, - "diff_avg10_avg20": diff_avg10_avg20, - "diff_avg10_avg30": diff_avg10_avg30, - "diff_avg10_avg60": diff_avg10_avg60, - "diff_avg20_avg30": diff_avg20_avg30, - "diff_avg20_avg60": diff_avg20_avg60, - "diff_avg30_avg60": diff_avg30_avg60, + "diff_avg3_avg27": diff_avg3_avg27, + "diff_avg3_avg54": diff_avg3_avg54, + "diff_avg6_avg9": diff_avg6_avg9, + "diff_avg6_avg12": diff_avg6_avg12, + "diff_avg6_avg27": diff_avg6_avg27, + "diff_avg6_avg54": diff_avg6_avg54, + "diff_avg9_avg12": diff_avg9_avg12, + "diff_avg9_avg27": diff_avg9_avg27, + "diff_avg9_avg54": diff_avg9_avg54, + "diff_avg12_avg27": diff_avg12_avg27, + "diff_avg12_avg54": diff_avg12_avg54, + "diff_avg27_avg54": diff_avg27_avg54, "diff_upper_lower": diff_upper_lower, "diff_open_lower": diff_open_lower, "diff_open_upper": diff_open_upper, @@ -1254,56 +691,7 @@ class BuySellChecker: "diff_macd_macds": diff_macd_macds, "diff_slowk_slowd": diff_slowk_slowd, "diff_rsi_rsis": diff_rsi_rsis, - "diff_price_sign": diff_price_sign, - "diff_avg3_avg5_sign": diff_avg3_avg5_sign, - "diff_avg3_avg10_sign": diff_avg3_avg10_sign, - "diff_avg3_avg20_sign": diff_avg3_avg20_sign, - "diff_avg3_avg30_sign": diff_avg3_avg30_sign, - "diff_avg3_avg60_sign": diff_avg3_avg60_sign, - "diff_avg5_avg10_sign": diff_avg5_avg10_sign, - "diff_avg5_avg20_sign": diff_avg5_avg20_sign, - "diff_avg5_avg30_sign": diff_avg5_avg30_sign, - "diff_avg5_avg60_sign": diff_avg5_avg60_sign, - "diff_avg10_avg20_sign": diff_avg10_avg20_sign, - "diff_avg10_avg30_sign": diff_avg10_avg30_sign, - "diff_avg10_avg60_sign": diff_avg10_avg60_sign, - "diff_avg20_avg30_sign": diff_avg20_avg30_sign, - "diff_avg20_avg60_sign": diff_avg20_avg60_sign, - "diff_avg30_avg60_sign": diff_avg30_avg60_sign, - "diff_upper_lower_sign": diff_upper_lower_sign, - "diff_open_lower_sign": diff_open_lower_sign, - "diff_open_upper_sign": diff_open_upper_sign, - "diff_close_lower_sign": diff_close_lower_sign, - "diff_close_upper_sign": diff_close_upper_sign, - "diff_high_lower_sign": diff_high_lower_sign, - "diff_high_upper_sign": diff_high_upper_sign, - "diff_low_lower_sign": diff_low_lower_sign, - "diff_low_upper_sign": diff_low_upper_sign, - "diff_lead1_lead2_sign": diff_lead1_lead2_sign, - "diff_change_base_sign": diff_change_base_sign, - "diff_base_lead1_sign": diff_base_lead1_sign, - "diff_base_lead2_sign": diff_base_lead2_sign, - "diff_change_lead1_sign": diff_change_lead1_sign, - "diff_change_lead2_sign": diff_change_lead2_sign, - "diff_open_lead2_sign": diff_open_lead2_sign, - "diff_open_lead1_sign": diff_open_lead1_sign, - "diff_open_change_sign": diff_open_change_sign, - "diff_open_base_sign": diff_open_base_sign, - "diff_close_lead2_sign": diff_close_lead2_sign, - "diff_close_lead1_sign": diff_close_lead1_sign, - "diff_close_change_sign": diff_close_change_sign, - "diff_close_base_sign": diff_close_base_sign, - "diff_high_lead2_sign": diff_high_lead2_sign, - "diff_high_lead1_sign": diff_high_lead1_sign, - "diff_high_change_sign": diff_high_change_sign, - "diff_high_base_sign": diff_high_base_sign, - "diff_low_lead2_sign": diff_low_lead2_sign, - "diff_low_lead1_sign": diff_low_lead1_sign, - "diff_low_change_sign": diff_low_change_sign, - "diff_low_base_sign": diff_low_base_sign, - "diff_macd_macds_sign": diff_macd_macds_sign, - "diff_slowk_slowd_sign": diff_slowk_slowd_sign, - "diff_rsi_rsis_sign": diff_rsi_rsis_sign, + "label": label } @@ -1314,6 +702,97 @@ class BuySellChecker: data = data.fillna(close[0]) return data + def write(self, outFp, df, i): + outFp.write(str(df["macd"][i]) + "\t") + outFp.write(str(df["macds"][i]) + "\t") + outFp.write(str(df["macdo"][i]) + "\t") + outFp.write(str(df["fast_k"][i]) + "\t") + outFp.write(str(df["slow_k"][i]) + "\t") + outFp.write(str(df["slow_d"][i]) + "\t") + outFp.write(str(df["rsi"][i]) + "\t") + outFp.write(str(df["rsis"][i]) + "\t") + outFp.write(str(df["height"][i]) + "\t") + outFp.write(str(df["top_tail_height"][i]) + "\t") + outFp.write(str(df["bottom_tail_height"][i]) + "\t") + outFp.write(str(df["abs_avg_1"][i]) + "\t") + outFp.write(str(df["abs_avg_2"][i]) + "\t") + outFp.write(str(df["abs_avg_3"][i]) + "\t") + outFp.write(str(df["abs_avg_4"][i]) + "\t") + outFp.write(str(df["abs_avg_5"][i]) + "\t") + outFp.write(str(df["diff_open"][i]) + "\t") + outFp.write(str(df["diff_close"][i]) + "\t") + outFp.write(str(df["diff_low"][i]) + "\t") + outFp.write(str(df["diff_high"][i]) + "\t") + outFp.write(str(df["diff_avg3"][i]) + "\t") + outFp.write(str(df["diff_avg6"][i]) + "\t") + outFp.write(str(df["diff_avg9"][i]) + "\t") + outFp.write(str(df["diff_avg12"][i]) + "\t") + outFp.write(str(df["diff_avg27"][i]) + "\t") + outFp.write(str(df["diff_avg54"][i]) + "\t") + outFp.write(str(df["diff_macd"][i]) + "\t") + outFp.write(str(df["diff_macdo"][i]) + "\t") + outFp.write(str(df["diff_macds"][i]) + "\t") + outFp.write(str(df["diff_fast_k"][i]) + "\t") + outFp.write(str(df["diff_slow_k"][i]) + "\t") + outFp.write(str(df["diff_slow_d"][i]) + "\t") + outFp.write(str(df["diff_rsi"][i]) + "\t") + outFp.write(str(df["diff_rsis"][i]) + "\t") + outFp.write(str(df["diff_changeLine"][i]) + "\t") + outFp.write(str(df["diff_baseLine"][i]) + "\t") + outFp.write(str(df["diff_upper"][i]) + "\t") + outFp.write(str(df["diff_lower"][i]) + "\t") + outFp.write(str(df["diff_avg3_avg6"][i]) + "\t") + outFp.write(str(df["diff_avg3_avg9"][i]) + "\t") + outFp.write(str(df["diff_avg3_avg12"][i]) + "\t") + outFp.write(str(df["diff_avg3_avg27"][i]) + "\t") + outFp.write(str(df["diff_avg3_avg54"][i]) + "\t") + outFp.write(str(df["diff_avg6_avg9"][i]) + "\t") + outFp.write(str(df["diff_avg6_avg12"][i]) + "\t") + outFp.write(str(df["diff_avg6_avg27"][i]) + "\t") + outFp.write(str(df["diff_avg6_avg54"][i]) + "\t") + outFp.write(str(df["diff_avg9_avg12"][i]) + "\t") + outFp.write(str(df["diff_avg9_avg27"][i]) + "\t") + outFp.write(str(df["diff_avg9_avg54"][i]) + "\t") + outFp.write(str(df["diff_avg12_avg27"][i]) + "\t") + outFp.write(str(df["diff_avg12_avg54"][i]) + "\t") + outFp.write(str(df["diff_avg27_avg54"][i]) + "\t") + outFp.write(str(df["diff_upper_lower"][i]) + "\t") + outFp.write(str(df["diff_open_lower"][i]) + "\t") + outFp.write(str(df["diff_open_upper"][i]) + "\t") + outFp.write(str(df["diff_close_lower"][i]) + "\t") + outFp.write(str(df["diff_close_upper"][i]) + "\t") + outFp.write(str(df["diff_high_lower"][i]) + "\t") + outFp.write(str(df["diff_high_upper"][i]) + "\t") + outFp.write(str(df["diff_low_lower"][i]) + "\t") + outFp.write(str(df["diff_low_upper"][i]) + "\t") + outFp.write(str(df["diff_lead1_lead2"][i]) + "\t") + outFp.write(str(df["diff_change_base"][i]) + "\t") + outFp.write(str(df["diff_base_lead1"][i]) + "\t") + outFp.write(str(df["diff_base_lead2"][i]) + "\t") + outFp.write(str(df["diff_change_lead1"][i]) + "\t") + outFp.write(str(df["diff_change_lead2"][i]) + "\t") + outFp.write(str(df["diff_open_lead2"][i]) + "\t") + outFp.write(str(df["diff_open_lead1"][i]) + "\t") + outFp.write(str(df["diff_open_change"][i]) + "\t") + outFp.write(str(df["diff_open_base"][i]) + "\t") + outFp.write(str(df["diff_close_lead2"][i]) + "\t") + outFp.write(str(df["diff_close_lead1"][i]) + "\t") + outFp.write(str(df["diff_close_change"][i]) + "\t") + outFp.write(str(df["diff_close_base"][i]) + "\t") + outFp.write(str(df["diff_high_lead2"][i]) + "\t") + outFp.write(str(df["diff_high_lead1"][i]) + "\t") + outFp.write(str(df["diff_high_change"][i]) + "\t") + outFp.write(str(df["diff_high_base"][i]) + "\t") + outFp.write(str(df["diff_low_lead2"][i]) + "\t") + outFp.write(str(df["diff_low_lead1"][i]) + "\t") + outFp.write(str(df["diff_low_change"][i]) + "\t") + outFp.write(str(df["diff_low_base"][i]) + "\t") + outFp.write(str(df["diff_macd_macds"][i]) + "\t") + outFp.write(str(df["diff_slowk_slowd"][i]) + "\t") + outFp.write(str(df["diff_rsi_rsis"][i]) + "\t") + outFp.write(str(df["label"][i]) + "\n") + return + def checkTransaction(self, data, stock_code, isRealTime=True): # 4일치 중에서 앞에 2일은 제거한다. date = data['date'].dt.date.unique().tolist() @@ -1328,16 +807,16 @@ class BuySellChecker: last_index = size - 1 if stock_code == "252670": - sell, weight = self.getSellPriceAndWeight_3000(data, last_index) - buy, weight = self.getBuyPriceAndWeight_3000(data, last_index) + sell, sell_weight = self.getSellPriceAndWeight_252670(data, last_index) + buy, buy_weight = self.getBuyPriceAndWeight_252670(data, last_index) else: - sell, weight = self.getSellPriceAndWeight_15000(data, last_index) - buy, weight = self.getBuyPriceAndWeight_15000(data, last_index) + sell, sell_weight = self.getSellPriceAndWeight_122630(data, last_index) + buy, buy_weight = self.getBuyPriceAndWeight_122630(data, last_index) bsLine['buy'] = [buy] - bsLine['buy_weight'] = [weight] + bsLine['buy_weight'] = [buy_weight] bsLine['sell'] = [sell] - bsLine['sell_weight'] = [weight] + bsLine['sell_weight'] = [sell_weight] else: # Type=False, 시뮬레이션 적용 bsLine['buy'] = [-1 for i in range(size)] @@ -1346,13 +825,12 @@ class BuySellChecker: bsLine['sell_weight'] = [-1 for i in range(size)] for i in range(size): - if stock_code == "252670": - sell, sell_weight = self.getSellPriceAndWeight_3000(data, i) - buy, buy_weight = self.getBuyPriceAndWeight_3000(data, i) + if stock_code == "252670": + sell, sell_weight = self.getSellPriceAndWeight_252670(data, i) + buy, buy_weight = self.getBuyPriceAndWeight_252670(data, i) else: - sell, sell_weight = self.getSellPriceAndWeight_15000(data, i) - buy, buy_weight = self.getBuyPriceAndWeight_15000(data, i) - + sell, sell_weight = self.getSellPriceAndWeight_122630(data, i) + buy, buy_weight = self.getBuyPriceAndWeight_122630(data, i) bsLine['buy'][i] = buy bsLine['buy_weight'][i] = buy_weight bsLine['sell'][i] = sell diff --git a/resources/hts.db b/resources/hts.db index 317909e30aa00af3a69a00dd7638e5fd6f281adf..cae9605d42ae16feeaccb2bd6e498716e8c85605 100644 GIT binary patch delta 5237 zcmY+|33L=i8VB&{nx2_tW_l(ENgxTikShpe0)d2ZM7fb0+a+If3H*BT~*WlRd+uM%6CT< zs4S1u>K4Vf)#}b6CXGojS($Vu81nUa{2nNpZ)F+IXmo2d>{U8Z_W^_fzc8ZbS|)R3tW zQ)8wyCLdEeQxm49Oc_kgn3^+XGG#HfV9I7{$<&IeHB%d=9Hz&Z9%pLH)Q+h=QwOGw zOr4lIGj(Blf~hN0H>U1PJ(zkj^e9Yh-om>Q%p}Y4PhF} zq^{2}rr}H@n4V!8$@DDKD5lX&W0;;}dY)-4(>SK_OcR)Lnevz>GEHKd%ru2*D$_Kk z=}a#$&0w0z^di$NrrAvSOa)AHnC3FgV|s~+ndURS%(Q^1kZB>)BBsSmOPH22En`~F zRK)ZO(+Z|nnN~8bVltVEnOzOt%ZDiWSw3%rO(^jT! zOn#;S({`pEOgouMnRYSlX4=EFm+4KWx0v2$+Q;+`(|)D{Oz$$i$8?bCeWoDOA*M2> z!%QDAeaLi#=_u1bn2s@h#B`kLW2O^KCz(EBI>q!U(`lwNOlO%sV>-w5Inx(RUoxF% z`ikjmrVC6LnJzJ1W-4c@V7kKe4bwlFzGeE3>3gQDOg}LF$aIbAC#Ij7eqp-Kbc5+8 z(=Dc7nf}Feo9Q>E-(E$@EttX-h~`5h_*{UB#wiS8=F>sD!FG zRa`1=6+^|N;#CP#30H|wiBzek5~UKY5~EUGrG`qZN}Ni(N==mnl|+>!m1LC^m0Bu~ zsMJ=eqf%F;o=Sa{RFwuQkE%3OX{6FvB~8VrlCIK3rKw7WN;8$_+Cj?HN=jYca?4aL zURW$Oo5@DY%e0!Z{;o`IkTu^rG&o;vofCRHYanKgD z1MNWv&=GV3ok17y1n3I7f$pFO=m~m(-k=ZY3!Vi1Kz}d*3cYXUH~(|Oz0#<-m!Ah_Sn4lQE23`kmfYo3P zSPLXr2TH(tumNlYo4{tU1#AV|fFA_FcCZ8N1f^gX*bVl8z2Hso7I+)%1Mh(S-~f0R zyax_~_dyUG0%hPZ_yBwej)0@!AK)1H2pk6=gA?E+_yn8+pMuli3^)ru1Lwf!;0y32 zI1j!8UxN$aBDe%DgK|&-u7GdAKf$-)JMcZY3Vr}Tf@|O>@H6-YTn9J6O>hhR3jPId zgWtgK;NRd5_ygPp_rQJdC-_TSWIrU-h6V(%0v*_Z9XLP;2n9~y0&ZXc5AcF85Dp?h zB&Y_WKs1N})j4AOuP zq=P1)DaZiLKy#1@vOo)v4O)U$pfzX%a=>HYanKgD1MNWv&=GV3ok17y1n3I7f$pFO z=m~m(-k=ZY3!Vi1Kz}d*3cYXUH~(|Oz0#<-m!Ah_Sn4lQE23`kmfYo3PSPLXr2TH(tumNlYo4{tU1#A^T z_4pI_N<(^BW@#IB?UL*nwpz55RB%^IF=<_iTTagPi@A2uM8s%!gZI=QF`6vT_lqPm zePQhgX-xEs*1>toR6|a>{I=F-)ghlA)C>ILeqy36)iPV_tGj-6ec^t~o9GoT>0R!6 z*X{Kj_w4k%BIDQjMOOYK?>DyBz5TpLZS8Fy{g(c@en4NV&()vRyM!zYnH17LBwKH& zhg)x3&sz^#ORQ`i6OtHWb$svm*xJqNvqp(K;-Vd73oa`JUGDHpS zzO$Rtr&VZ2v~5oHIi%%<-f?vfz36J_3U}wbM|h?-@(l8{_M~|1T3_P_wMkL};cjJuNFE!yawkoVYL2S@~yE zd-U(JByxgiB$GDzg;S=~#c7EcL46s;*-K5TdGL_ZstMOfGkMzH)T&+QxB10! zb45mOL{-CCzhCsTX4+$9-tH|TO6KlVJy_K|%$vujRCQ=iYnow?QJ-f;4lQ0D>Q!3{ zk)Kr5(L!ZoHHJ-^YAQKqM7ya~KRGQ6KRIS*q-?Ls#w(Ai9~36JLYHGp{USl`RYwdk=Pp|LaEdAF(j-`YYD(JG9uI$GYt`t`zN~@_Zab7T-ANU71r&(banAgR$ffmRSgmX<_@bp`jlCgnjQN;9ocN?=XO;;J5|@A@9**pEh$<2VVS8-6yC|6tIqSTHLf`! zlbi=#BRzvXZ9KI+4&$0kO4}f6$n1j6A~j#tx2>bCfz7M`>iO8SQ>}*m?vDB#eI(X_ zxFinio&R1957&VhFM3b+_TV={o1y?>_6^=YGRB0&Bo?b*(C(7BVhE zeZrfCCC6)-In(yK9+ZkbxKQoO)kNrJ^X7^C1`ir-GW@Jx6v>F0s!ruTwSD42`9|B* zo2ILps=8LYKJ$w@GJS?RDCjun7hmeaIp*)Ow8`Jj`^7+EoHB=rl1D3tlk>jvs|OVp zLv--E+Fq<4OPBp3)|Q^pOm*FB?q)S)=>-&Ev9h;}ReO)xo7iLgo@sw~q}zPyC}-d3 z+=sREqdI($%)8lK#F{xjMbxak$4+0mTCbVH9y6`pU8DlEmA6KD9hL$>h3J+!m#8fNBnOHT>GFw26Gu;~yhE+Ao z-8~Dn`m(2LwFeXRfVdrMp7BkaBD;73;-1JVHjBF7O0C>4_o=hG7{;6GDc?^R#kP*l zm(8#n_p5~%FB)XDGwMC4>=x#y1p`AQsdrG4TpSh<9h`<+n;3f8eZ&2k47<@q4A;9Z>6+&nC9j6pR`s!T_jE1J3|4fClws=OY7dSN4~V2t8Cq|% zaLXQv_!T4K0_u5tAT}Vj2LDP32u+j2j;vRO@K;UjPEt+dZ5e4z?bR!vXKPi1E}N;2 zn#rYVJJ06Jvd4UAetPk}TQW^G+k$)J1L8?7-LP0JIhOSn?+4!b-cDYZ=Mztn_OzC0 zsj#f~^!3CT=Z)3st&!xu;@;#Q<*x6#W~P>JORVj6oN>JB=;x?mzhIa4;r80Lt2V!F zoUO5X&%LEj*R!pETFcZ+cD>e6mLvtlT{&!zUo;5LNePJ0UGj7uZfuwKAK0cEZR)r%bywuD4lBjO#&)VP!VC{dQTH)jof>?pQ9#Vq9@$+v{mx#u z=ai@D|EB$oHdbq7xo+7l)6xQ>wwXwVUE3(T-;g54c0^yGcQJF<^=TtZ)!uu-XH>6q zoLZ^btG>H(47>cw7Z5JYM0>5yf2UWTt%moc=R{ThGh(xfOU=BpPL(G`nx{Ee)spJX z7Od7PAZ`eKf|g);P(#Aj(M-y*H<7J!0%E01%W@XTMI~s3Qi7nU`bDZ*TN6qxMM8h}Ek#eP z6JpD~*6y_2L?7K~DXLma=tj${R;vs3-uEWF<&V$JIlq}RXJ&pgb8m{O_thMy~GBsw3V`{?Gl&Kk0bEXzdEt%q(5|~;swPs3WYQxl)DT&F; zl+4tQsXbE)QwOGwOsPz1OzBJ+Or4k>V(QG4$&|&^g{do3H>QV~9%1Uvl+DzGsVCE; zOud+TGd;%Chp8`94pTp-{!9aya+wA)4PqM1^f=QHrlCy3n4Vx7&h#YH2qw%=9@9vs ze5R+EMln6jG@9udre~SPFpXsz$26X40@HI$1x$rZ6PYG4JQh z!So{2Or}{(vzdyRikapx&1HItiJ9gx&1YJ`w2)~L(_*G2OiP)TF)e3W!BoQZGSf7PtLG2LYPnduj%TTH() z{l;{g>360-nEqt?i|G#2U8cX8?lJvqAt_5q0Rbv#U2pdmy-G{it7h=s-w2Th}{_YYnD}}D$6RrSdO>e^4EjJ{$bo*)9|k}!41_^27#@cqFcgNt6EGZ} zgb_fH2O}XLo`O;EG>nF4;8_?0V__VOhY9c;6hI+Ngh}u`Ool1&0!)QzFdb&Vi!c*r z!E7jkVweMS;U!?02lHV8EQCd{7?!|NSO&{s1(d+cuo70mYIp?DN%Wwt0hHv0o_zu2@t8fi|fFI#H+<AU1b7Y#pb#d)BzPVs!xVS{rouFs4m03ImtH=>fQ=xb z3^u`LD2FYu6}G{4*dY#8RtT}z7HOKTY|)g9GACrc=p?D=juK~3*(RrazQ8BuSd=@S zZ#*9a?&2m=k-aARM5@$x`h?vWePpsr#%}cqvzFA+5@GC9+l1BL2j-w!E0?kI%FKpF z<>elAYQwS)!i^6V`GgYNP`hQCrKDOs13jspuXX9s^mp7>-Fw}u+*4(2nNOt6K5AZT zp6RJDCzxHf<=R>8fVM#^)<$VPZIf(+Z5jF~TO%z|3srwpF1O)9I;+EnZJ){m`w z)W=k>T37rjE{H1YO1-C^D7K1)V!Y_*80+XOQbc{_Z$~>vq;gp~qEy)LC`*+>`z2+d z{XIR@neTqWo#k$t?6$eCyH2=XS5jSuYr1Q=tEFe6%jx{ddCK{gbDcTcG2ii<CtcLXQgG6PbACgs?8!yUfPA3k>e1FR#PmIM%A^xVKQeof`J7HRtY1&Q$d~D zh@82_Cx*zXS0{*YyEi#0Ev17c;?LT9z2-i}67h#QUxtn=7p)vMk#@ooaa&du`b4-b z_(U@9jgrIJwJ*_ZUL++l%TZqYjNFApIsRL{eHyCEk`~)Uc;F)xT~^fg=w$JaJ??i> zUfJ#wOXcDnK9M3vpnFjkyrg|F&oc)+$n#;8DvGQ#b_)i4v%)8i%gXeXN@KaV@iyU< zCwv%{if+if@W+)fxdJb;NIx3xs3qZb^5nY{L|wVs?-N}O@AM6=Wm`08F?+qi3G*&m zeSa(n1Uu(VxN|=syI=*TS=y&sA`?wAWW7U4teHqnUPZxBnRjHf2$utqfyP>rB{Iz@ zm{uAullG-5nyf}tlkelRT24jnCPx2jeIKmQ3goA=+;?xQh%<6d{iw@Pm|u@fLcI`K zhHK4iiTKpBOcvS)h?aV4FcV%crt(%oTN|zQ3hoDSQ5@FVYGLZ{>Q`z&Ew?qQ-3?-b=&$xslhp|E zS8yljp>k)=RuN-U1}W+GOU?v&0u2=+&bOWGokiyS;PN&?ZvGuE-6wsb zb?rVb!=+hEX@_j|JCGPAYwqQ9mwcjOU;)Y|D)R8i3e0`{DW6y+yBrPXA?tK-#!n;i zp>PCbVd)l;Adex~;=y{vG^Pr)nb+*s`)vjsXMEy}CP%j3hNV^8LdcgjnL@a$wc00o zYWDs1>498a?o^BuIYwq6^NLRhtMTjSVQF&zHJ`}bh(M;AUb;)>9p8?TU-}_<1|;C~ zd|mB^YSWG0NgN$I)^pgy>J3kKkJbHwd!hT$gQYQQ)&`afmNLso zOEdHLW}kVyIZ3;vy{S#pGSqu&mHLuu&sH7cxL6?ulys>lH^&AObFwg)^qZM}^!Rw9 zUpQ4$dZ{egd0uHLs~1%u8iJ@M^)@wSX{9o+`)cw3Wj#^mmU*w@TU8dtp?2VSW54)J zH$rW3@v^c7<~P8oQ>-NHsU3SykJJ6ByTqOAj&z-Kt#>`?igkXij8R&fZkYCnrpkB9 z4w;bT7tNxF*m@a-X$tu*-ft6GJ T;#+n3)ZTs(nA&@%SkUC(vmsly diff --git a/stock/util/LabelMaker.py b/stock/util/LabelMaker.py index 3693fcd..ec9a3a2 100644 --- a/stock/util/LabelMaker.py +++ b/stock/util/LabelMaker.py @@ -8,14 +8,16 @@ from plotly import subplots from hts.HTS import HTS from hts.BuySellChecker import BuySellChecker - +from stock.util.Stock2Vector import Stock2Vector class LabelMaker (HTS): buySellChecker = None + stock2Vector = None def __init__(self, RESOURCE_PATH): super().__init__(RESOURCE_PATH) self.buySellChecker = BuySellChecker() + self.stock2Vector = Stock2Vector(RESOURCE_PATH) return def checkTransaction(self, data, duration=60): @@ -91,8 +93,9 @@ class LabelMaker (HTS): return bsLine, data def draw_simple(self, stock_code, given_day, data, bsLine): - buy_line = bsLine['buy'] - sell_line = bsLine['sell'] + data = data.loc[pd.DatetimeIndex(data.index).day == int(given_day[6:])] + buy_line = bsLine['buy'][381:] + sell_line = bsLine['sell'][381:] buy_colors = [] for i in range(len(buy_line)): @@ -138,11 +141,11 @@ class LabelMaker (HTS): 'close': 'int', 'volume': 'int', 'avg3': 'float', - 'avg5': 'float', - 'avg10': 'float', - 'avg20': 'float', - 'avg30': 'float', - 'avg60': 'float', + 'avg6': 'float', + 'avg9': 'float', + 'avg12': 'float', + 'avg27': 'float', + 'avg54': 'float', 'fast_k': 'float', 'slow_k': 'float', 'slow_d': 'float', @@ -150,13 +153,17 @@ class LabelMaker (HTS): 'rsis': 'float' }) + buy_size = [] buy_colors = [] for i in range(len(buy_line)): if buy_line[i] < 0: buy_colors.append("#ffffff") buy_line[i] = nan + buy_size.append(0) else: - buy_colors.append("#ff00ff") + buy_colors.append("#D87D0F") + buy_size.append(10 + (5 * 1)) + sell_colors = [] for i in range(len(sell_line)): if sell_line[i] < 0: @@ -166,19 +173,20 @@ class LabelMaker (HTS): sell_colors.append("#00ced1") # 그래프를 설정한다. - buy_check = go.Scatter(x=data['date'], y=buy_line, mode='markers', name="buy", marker=dict(size=14, color=buy_colors, line_width=0)) + buy_check = go.Scatter(x=data['date'], y=buy_line, mode='markers', name="buy", marker=dict(size=buy_size, color=buy_colors, line_width=0)) sell_check = go.Scatter(x=data['date'], y=sell_line, mode='markers', name="sell", marker=dict(size=14, color=sell_colors, line_width=0)) upper = go.Scatter(x=data['date'], y=data["upper"], name="upper", line_color='#000000') lower = go.Scatter(x=data['date'], y=data["lower"], name="lower", line_color='#000000') - avg3 = go.Scatter(x=data['date'], y=data["avg3"], name="avg3", line_color='#1469F4') - avg5 = go.Scatter(x=data['date'], y=data["avg5"], name="avg5", line_color='#089B5B') - avg10 = go.Scatter(x=data['date'], y=data["avg10"], name="avg10", line_color='#ff00ff') - avg20 = go.Scatter(x=data['date'], y=data["avg20"], name="avg20", line_color='#8F8203') - avg30 = go.Scatter(x=data['date'], y=data["avg30"], name="avg30", line_color='#000000') + avg3 = go.Scatter(x=data['date'], y=data["avg3"], name="avg3", line_color='#8F8203') + avg6 = go.Scatter(x=data['date'], y=data["avg6"], name="avg6", line_color='#089B5B') + avg9 = go.Scatter(x=data['date'], y=data["avg9"], name="avg9", line_color='#ff00ff') + avg12 = go.Scatter(x=data['date'], y=data["avg12"], name="avg12", line_color='#1469F4') + avg27 = go.Scatter(x=data['date'], y=data["avg27"], name="avg27", line_color='#000000') + avg54 = go.Scatter(x=data['date'], y=data["avg54"], name="avg54", line_color='#008000') candle_stick = go.Candlestick(x=data['date'], open=data['open'], high=data['high'], low=data['low'], close=data['close'], increasing_line_color='red', decreasing_line_color='blue') volume_line = go.Scatter(x=data['date'], y=data["volume"], mode='lines', name='volume') - #fast_k_line = go.Scatter(x=hts['date'], y=hts["fast_k"], mode='lines', name='fast_k') + # fast_k_line = go.Scatter(x=hts['date'], y=hts["fast_k"], mode='lines', name='fast_k') macd_line = go.Scatter(x=data['date'], y=data["macd"], mode='lines', name='macd') macd_s_line = go.Scatter(x=data['date'], y=data["macds"], mode='lines', name='macds') @@ -190,12 +198,19 @@ class LabelMaker (HTS): rsi_line = go.Scatter(x=data['date'], y=data["rsi"], mode='lines', name='rsi') rsis_line = go.Scatter(x=data['date'], y=data["rsis"], mode='lines', name='rsis') - candle_data = [candle_stick, upper, lower, avg3, avg5, avg10, avg20, avg30, buy_check, sell_check] + candle_data = [candle_stick, upper, lower, avg3, avg6, avg9, avg12, avg27, avg54, buy_check, sell_check] volume_data = [volume_line] macd_data = [macd_line, macd_s_line, macd_o_line] stochastic_data = [slow_k_line, slow_d_line] rsi_data = [rsi_line, rsis_line] + # 그래프를 그린다. + """ + fig = go.Figure(data=candle_data) + fig.update_layout(title=stock_code + "_" + given_day) + fig.show() + """ + fig = subplots.make_subplots(rows=5, cols=1, subplot_titles=('캔들', "거래량", "MACD", "스토캐스틱", "RSI")) for trace in candle_data: fig.append_trace(trace, 1, 1) @@ -207,15 +222,15 @@ class LabelMaker (HTS): fig.append_trace(trace, 4, 1) for trace in rsi_data: fig.append_trace(trace, 5, 1) - #fig.update_xaxes(nticks=5) - #fig.update_layout(height=1800, title=stock_code + "_" + given_day, xaxis_rangeslider_visible=False) + # fig.update_xaxes(nticks=5) + # fig.update_layout(height=1800, title=stock_code + "_" + given_day, xaxis_rangeslider_visible=False) df = pd.DataFrame(bsLine) df = df.fillna(-1) buy_count = len(df.loc[df["buy"] > 0]) sell_count = len(df.loc[df["sell"] > 0]) - fig.update_layout(height=3000, title=stock_code + "_" + given_day + "_" + str(buy_count)+","+str(sell_count)) + fig.update_layout(height=5000, title=stock_code + "_" + given_day + "_" + str(buy_count) + "," + str(sell_count)) fig.show() return @@ -251,30 +266,38 @@ class LabelMaker (HTS): #self.draw_detail(stock_code, ymd, data, bsLine) return bsLine, data - def showLabels(self, stock_code, ymd): - result = {"time": [], "open": [], "close": [], "high": [], "low": [], "vol": [], "label": []} - self.getDBData(stock_code, ymd, result) + def showLabels(self, stock_code, ymd, outFp=None): + LAST_DATA = self.stock2Vector.getLastData(stock_code, ymd) + result = self.stock2Vector.getRealTime(stock_code, ymd, LAST_DATA) - result["date"] = result["time"] - data = pd.DataFrame(result) - df_final_time = pd.DatetimeIndex(result["date"]) - data.index = df_final_time + # 이동평균, RSI, MACD, 일목균형, 볼린저밴드 상/하단을 계산한다. + data = self.buySellChecker.analyze(result) + + # 4일치 중에서 앞에 3일은 제거한다. + date = data['date'].dt.date.unique().tolist() + data = data[data['date'].dt.date != date[0]] + data = data[data['date'].dt.date != date[1]] + data = data[data['date'].dt.date != date[2]] bsLine = {} - size = len(result["close"]) + lows = data["low"].tolist() + closes = data["close"].tolist() + labels = data["label"].tolist() + size = len(lows) # Type=False, 시뮬레이션 적용 bsLine['buy'] = [-1 for i in range(size)] - for i in range(size): - if result["label"][i] == 2: - bsLine['buy'][i] = result["low"][i] bsLine['sell'] = [-1 for i in range(size)] for i in range(size): - if result["label"][i] == 1: - bsLine['sell'][i] = result["close"][i] - - self.draw_simple(stock_code, ymd, data, bsLine) + self.buySellChecker.write(outFp, data, i) + outFp.flush() + if labels[i] == 1: + bsLine['sell'][i] = closes[i] + if labels[i] == 2: + bsLine['buy'][i] = lows[i] + #self.draw_simple(stock_code, ymd, data, bsLine) + self.draw_detail(stock_code, ymd, data, bsLine) return def getDate(self, stock_code): @@ -288,11 +311,11 @@ if __name__ == "__main__": labelMaker = LabelMaker(RESOURCE_PATH) - UPDATE_MODE = True + UPDATE_MODE = False if UPDATE_MODE: stock_code = "122630" ymd = '20220812' - + """ labelMaker.clearLabel(db_filename, stock_code, ymd) labelMaker.makeLabel(db_filename, stock_code, ymd, "0910", 2) labelMaker.makeLabel(db_filename, stock_code, ymd, "0911", 2) @@ -300,45 +323,24 @@ if __name__ == "__main__": labelMaker.makeLabel(db_filename, stock_code, ymd, "0915", 1) labelMaker.makeLabel(db_filename, stock_code, ymd, "0916", 1) labelMaker.makeLabel(db_filename, stock_code, ymd, "0948", 2) - labelMaker.makeLabel(db_filename, stock_code, ymd, "0949", 2) - labelMaker.makeLabel(db_filename, stock_code, ymd, "0950", 2) - labelMaker.makeLabel(db_filename, stock_code, ymd, "0951", 2) - labelMaker.makeLabel(db_filename, stock_code, ymd, "0952", 2) - labelMaker.makeLabel(db_filename, stock_code, ymd, "0953", 2) - labelMaker.makeLabel(db_filename, stock_code, ymd, "1023", 1) - labelMaker.makeLabel(db_filename, stock_code, ymd, "1024", 1) - labelMaker.makeLabel(db_filename, stock_code, ymd, "1025", 1) - labelMaker.makeLabel(db_filename, stock_code, ymd, "1026", 1) - labelMaker.makeLabel(db_filename, stock_code, ymd, "1056", 2) - labelMaker.makeLabel(db_filename, stock_code, ymd, "1057", 2) - labelMaker.makeLabel(db_filename, stock_code, ymd, "1058", 2) - labelMaker.makeLabel(db_filename, stock_code, ymd, "1059", 2) - labelMaker.makeLabel(db_filename, stock_code, ymd, "1116", 1) - labelMaker.makeLabel(db_filename, stock_code, ymd, "1117", 1) - labelMaker.makeLabel(db_filename, stock_code, ymd, "1118", 1) - labelMaker.makeLabel(db_filename, stock_code, ymd, "1207", 2) - labelMaker.makeLabel(db_filename, stock_code, ymd, "1208", 2) - labelMaker.makeLabel(db_filename, stock_code, ymd, "1209", 2) - labelMaker.makeLabel(db_filename, stock_code, ymd, "1210", 2) - labelMaker.makeLabel(db_filename, stock_code, ymd, "1242", 1) - labelMaker.makeLabel(db_filename, stock_code, ymd, "1243", 1) - labelMaker.makeLabel(db_filename, stock_code, ymd, "1244", 1) - labelMaker.makeLabel(db_filename, stock_code, ymd, "1245", 1) - - + """ labelMaker.showLabels(stock_code, ymd) else: stock_codes = { - "252670": ['20220801', '20220802', '20220803', '20220804', '20220805', '20220808', '20220809', '20220810', '20220811'], - "122630": ['20220801', '20220802', '20220803', '20220804', '20220805', '20220808', '20220809', '20220810', '20220811'], + "252670": ['20220801', '20220802', '20220803', '20220804', '20220805', '20220808', '20220809', '20220810', '20220811', '20220812'], + "122630": ['20220801', '20220802', '20220803', '20220804', '20220805', '20220808', '20220809', '20220810', '20220811', '20220812'], } view = True + outFp = None for stock_code in stock_codes: + if view: + if outFp is None: + outFp = open("check_"+stock_code+".txt", "w") for ymd in stock_codes[stock_code]: if view: - labelMaker.showLabels(stock_code, ymd) + labelMaker.showLabels(stock_code, ymd, outFp) else: stock_codes = ["252670", "122630"] for stock_code in stock_codes: @@ -346,4 +348,8 @@ if __name__ == "__main__": for ymd in ymds: logging.info(stock_code, ymd) bsLine, data = labelMaker.makeCandidate(stock_code, ymd) - labelMaker.updateLabel(db_filename, stock_code, bsLine, data, ymd) \ No newline at end of file + labelMaker.updateLabel(db_filename, stock_code, bsLine, data, ymd) + if view: + if outFp is not None: + outFp.close() + outFp = None \ No newline at end of file diff --git a/stock/util/Stock2Vector.py b/stock/util/Stock2Vector.py index b01be56..5244a57 100644 --- a/stock/util/Stock2Vector.py +++ b/stock/util/Stock2Vector.py @@ -140,7 +140,7 @@ class Stock2Vector(HTS): result = self.getRealTime(stock_code, today, LAST_DATA) # 분석을 통해서 볼린저밴드 상/하단을 계산한다. - df = self.buySellChecker.getVectorFeature(result) + df = self.buySellChecker.analyze(result) minmax_df1 = (df - df.min()) / (df.max() - df.min()) minmax_df2 = minmax_df1.drop(["date"], axis="columns") minmax_df = minmax_df2.join(df['date']) @@ -198,7 +198,7 @@ class Stock2Vector(HTS): def preprocessData(self, result): # 분석을 통해서 볼린저밴드 상/하단을 계산한다. - df = self.buySellChecker.getVectorFeature(result) + df = self.buySellChecker.analyze(result) minmax_df1 = (df - df.min()) / (df.max() - df.min()) minmax_df2 = minmax_df1.drop(["date"], axis="columns") minmax_df = minmax_df2.join(df['date']) @@ -236,7 +236,7 @@ class Stock2Vector(HTS): result["label"].append(int(label)) # 분석을 통해서 볼린저밴드 상/하단을 계산한다. - df = self.buySellChecker.getVectorFeature(result) + df = self.buySellChecker.analyze(result) minmax_df1 = (df - df.min()) / (df.max() - df.min()) minmax_df2 = minmax_df1.drop(["date"], axis="columns") minmax_df = minmax_df2.join(df['date']) @@ -289,7 +289,7 @@ class Stock2Vector(HTS): return self.getVectorData_2(data, VECTOR_SIZE) def getVectorData_1(self, data, VECTOR_SIZE): - df = self.buySellChecker.getVectorFeature(data) + df = self.buySellChecker.analyze(data) # avg10, 볼린져밴드 상단과 하단의 차이, rsi, avg3만 이용한다. # channel1: avg10, channel2: diff_upper_lower, channel3: abs_avg_2, channel4: abs_avg_3 @@ -330,14 +330,14 @@ class Stock2Vector(HTS): return batch_X, batch_Y def getVectorData_2(self, data, VECTOR_SIZE = 32): - df = self.buySellChecker.getVectorFeature(data) + df = self.buySellChecker.analyze(data) # avg10, 볼린져밴드 상단과 하단의 차이, rsi, avg3만 이용한다. # channel1: avg10, channel2: diff_upper_lower, channel3: abs_avg_2, channel4: abs_avg_3 avg3 = df['avg3'].tolist() - avg6 = df['avg6'].tolist() avg9 = df['avg9'].tolist() - + avg12 = df['avg9'].tolist() + avg24 = df['avg9'].tolist() diff_upper_lower = df['diff_upper_lower'].tolist() rsi = df['rsi'].tolist()