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 317909e..cae9605 100644 Binary files a/resources/hts.db and b/resources/hts.db differ 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()