diff --git a/Simulation.py b/Simulation.py index 91837b0..d5384b0 100644 --- a/Simulation.py +++ b/Simulation.py @@ -49,9 +49,10 @@ class Simulation (HTS): 'close': 'int', 'volume': 'int', 'avg3': 'float', - 'avg5': 'float', - 'avg10': 'float', - 'avg20': 'float', + 'avg6': 'float', + 'avg9': 'float', + 'avg12': 'float', + 'avg24': 'float', 'avg30': 'float', 'avg60': 'float', 'fast_k': 'float', @@ -69,7 +70,7 @@ class Simulation (HTS): buy_line[i] = nan buy_size.append(0) else: - buy_colors.append("#00ced1") + buy_colors.append("#D87D0F") buy_size.append(10 + (5 * buy_weight_line[i])) sell_colors = [] @@ -78,7 +79,7 @@ class Simulation (HTS): sell_colors.append("#ffffff") sell_line[i] = nan else: - sell_colors.append("#D87D0F") + sell_colors.append("#00ced1") # 그래프를 설정한다. 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)) @@ -86,11 +87,11 @@ class Simulation (HTS): 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='#8F8203') - 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='#1469F4') - avg30 = go.Scatter(x=data['date'], y=data["avg30"], name="avg30", line_color='#000000') - avg60 = go.Scatter(x=data['date'], y=data["avg60"], name="avg60", line_color='#008000') + 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') 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') @@ -106,7 +107,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, avg5, avg10, avg20, avg30, avg60, buy_check, sell_check] + candle_data = [candle_stick, upper, lower, avg3, avg6, avg9, avg12, avg24, avg30, 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,7 +181,7 @@ if __name__ == "__main__": # to check bying stock_codes = { "252670": ['20220801', '20220802', '20220803', '20220804', '20220805', '20220808', '20220809', '20220810', '20220811'], - #"122630": ['20220810'], + "122630": ['20220801', '20220802', '20220803', '20220804', '20220805', '20220808', '20220809', '20220810', '20220811'], } method = "rule" # "rule", "ml", "answer" diff --git a/hts/BuySellChecker.py b/hts/BuySellChecker.py index 1388df1..114f2b7 100644 --- a/hts/BuySellChecker.py +++ b/hts/BuySellChecker.py @@ -1,4 +1,5 @@ import pandas as pd +import numpy as np from stock.analysis.Common import Common from stock.analysis.Stochastic import Stochastic from stock.analysis.RSI import RSI @@ -195,57 +196,52 @@ class BuySellChecker: if i > START_TIME_INDEX: # 매수 분석 - if i > 740: - # "15:00" 까지만 매수 + if i > 710: + # "14:30" 까지만 매수 return buy, weight if i > 380 + 30 and data["macd"][i] < -25: - if data["avg3"][i] > min(data["avg5"][i], data["avg10"][i], data["avg20"][i]): + if data["avg3"][i] > min(data["avg6"][i], data["avg9"][i], data["avg12"][i]): buy = data["high"][i] - if i < 381 + 30: + if i < 381 + 40: weight = 1 else: weight = 5 return buy, weight if i > 380 + 30 and data["macd"][i] < -5 and data["rsi"][i] < 30: - if data["avg3"][i] > min(data["avg5"][i], data["avg10"][i], data["avg20"][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 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["avg5"][i], data["avg10"][i], data["avg20"][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] < 20 and data["avg3"][i - 1] < data["avg5"][i - 1] and data["avg3"][i] > data["avg5"][i]: - buy = int((data["open"][i] + data["close"][i]) / 2) - weight = 1 - return buy, weight + # 3분선이 5분선이 돌파가 이전보다 높은 경우 매수 - if data["slow_k"][i] < 70 and data["avg3"][i - 1] < data["avg5"][i - 1] and data["avg3"][i] > data["avg5"][i]: + 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["avg5"][i - c]: - max_avg3 = data["avg5"][i - c] - if data["avg3"][i-c-1] < data["avg5"][i-c-1] and data["avg3"][i-c] > data["avg5"][i-c]: + 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 max(data["avg3"][i-3], data["avg3"][i-2], data["avg3"][i-1]) - min(data["avg3"][i-3], data["avg3"][i-2], data["avg3"][i-1]) > 1: - if i == 382 or i == 383: - if data["close"][i] != data["high"][i]: - return -1, -1 - #buy = int((data["open"][i] + data["close"][i]) / 2) - buy = data["low"][i] - weight = 1 - return buy, weight + #if data["avg6"][i-10] > data["avg6"][i]: + 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분선 위로 올라옴 @@ -451,25 +447,25 @@ class BuySellChecker: # 매도 분석 # 10분선 위에서 3분선이 5분선을 하향 돌파 하는 경우 매도 - if data["slow_k"][i - 1] > 60 and data["avg3"][i - 1] >= data["avg5"][i - 1] and data["avg3"][i] < data["avg5"][i]: - if max(data["avg3"][i], data["avg5"][i]) < data["avg10"][i]: - sell = int((data["high"][i] + data["low"][i]) / 2) + 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분선 아래로 내려옴 if i >= 381 + 5: vaild = True - for c in range(1, 6): - if data["avg3"][i - c] < data["avg5"][i - c]: + for c in range(1, 11): + if data["avg3"][i - c] < data["avg6"][i - c]: vaild = False break if vaild: - if data["avg3"][i] < data["avg5"][i]: + 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]: @@ -553,44 +549,51 @@ class BuySellChecker: if i >= START_TIME_INDEX: # 매수 분석 - if i > 740: - # "15:00" 까지만 매수 + if i > 710: + # "14:30" 까지만 매수 return buy, weight if i > 380 + 30 and data["macd"][i] < -25: - if data["avg3"][i] > min(data["avg5"][i], data["avg10"][i], data["avg20"][i]): + if data["avg3"][i] > min(data["avg6"][i], data["avg9"][i], data["avg12"][i]): buy = data["high"][i] - if i < 381 + 30: + if i < 381 + 40: weight = 1 else: weight = 5 return buy, weight if i > 380 + 30 and data["macd"][i] < -5 and data["rsi"][i] < 30: - if data["avg3"][i] > min(data["avg5"][i], data["avg10"][i], data["avg20"][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 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["avg5"][i], data["avg10"][i], data["avg20"][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["avg3"][i - 1] < data["avg5"][i - 1] and data["avg3"][i] > data["avg5"][i]: + 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(1, 50): - if data["avg3"][i-c-1] < data["avg5"][i-c-1] and data["avg3"][i-c] > data["avg5"][i-c]: - p_avg3 = data["avg3"][i-c] + 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: - if data["slow_k"][i] < 30 or i < 381 + 10: - buy = int((data["open"][i] + data["close"][i]) / 2) - weight = 1 - return buy, weight + if data["avg3"][i] > p_avg3+3 and max_avg3 < data["avg3"][i]: + # if data["avg6"][i-10] > data["avg6"][i]: + 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: @@ -796,26 +799,25 @@ class BuySellChecker: # 매도 분석 # 10분선 위에서 3분선이 5분선을 하향 돌파 하는 경우 매도 - if data["avg3"][i - 1] >= data["avg5"][i - 1] and data["avg3"][i] < data["avg5"][i]: - if min(data["avg3"][i], data["avg5"][i]) > data["avg10"][i]: - if data["slow_k"][i] > 80: - sell = int((data["high"][i] + data["low"][i]) / 2) - weight = 1 - return sell, weight - """ - # 3분선이 5분 이상 5분선 위에 있다가 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분선이 10분 이상 6분선 위에 있다가 5분선 아래로 내려옴 if i >= 381 + 5: vaild = True - for c in range(1, 6): - if data["avg3"][i - c] < data["avg5"][i - c]: + for c in range(1, 11): + if data["avg3"][i - c] < data["avg6"][i - c]: vaild = False break if vaild: - if data["avg3"][i] < data["avg5"][i]: + 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]: @@ -892,14 +894,14 @@ class BuySellChecker: 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] - avg7_list = close_df.rolling(window=7).mean().fillna(close[0]).values.tolist() - avg7 = [item[0] for item in avg7_list] - avg10_list = close_df.rolling(window=10).mean().fillna(close[0]).values.tolist() - avg10 = [item[0] for item in avg10_list] - avg20_list = close_df.rolling(window=20).mean().fillna(close[0]).values.tolist() - avg20 = [item[0] for item in avg20_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() @@ -925,7 +927,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], 'avg7': avg7[i],'avg10': avg10[i],'avg20': avg20[i],'avg30': avg30[i],'avg60': avg60[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) @@ -957,7 +959,7 @@ class BuySellChecker: temp = {"date": point_temp, "open": open, "high": high, "low": low, "close": close, "volume": vol, "upper": upper, "lower": lower, - "avg3": avg3, "avg7": avg7, "avg5": avg5, "avg10": avg10, "avg20": avg20, "avg30": avg30, "avg60": avg60, + "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} @@ -1309,8 +1311,8 @@ class BuySellChecker: sell, weight = self.getSellPriceAndWeight_3000(data, last_index) buy, weight = self.getBuyPriceAndWeight_3000(data, last_index) else: - sell, weight = self.getBuyPriceAndWeight_3000(data, last_index) - buy, weight = self.getBuyPriceAndWeight_3000(data, last_index) + sell, weight = self.getSellPriceAndWeight_15000(data, last_index) + buy, weight = self.getBuyPriceAndWeight_15000(data, last_index) bsLine['buy'] = [buy] bsLine['buy_weight'] = [weight] diff --git a/resources/hts.db b/resources/hts.db index 8059442..120b00c 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 010bad3..865cbc6 100644 --- a/stock/util/LabelMaker.py +++ b/stock/util/LabelMaker.py @@ -289,24 +289,51 @@ if __name__ == "__main__": labelMaker = LabelMaker(RESOURCE_PATH) view = True - stock_code = "252670" - ymd = "20220809" + stock_code = "122630" + ymd = "20220811" if view: - labelMaker.makeLabel(db_filename, "252670", "20220809", "0930", 1) - labelMaker.makeLabel(db_filename, "252670", "20220809", "0931", 1) - labelMaker.makeLabel(db_filename, "252670", "20220809", "0951", 1) - labelMaker.makeLabel(db_filename, "252670", "20220809", "0953", 1) - labelMaker.makeLabel(db_filename, "252670", "20220809", "0954", 1) - labelMaker.makeLabel(db_filename, "252670", "20220809", "0955", 1) - labelMaker.makeLabel(db_filename, "252670", "20220809", "0956", 1) - labelMaker.makeLabel(db_filename, "252670", "20220809", "0959", 1) - labelMaker.makeLabel(db_filename, "252670", "20220809", "1509", 1) - labelMaker.makeLabel(db_filename, "252670", "20220809", "1515", 1) - labelMaker.makeLabel(db_filename, "252670", "20220809", "1516", 1) - labelMaker.makeLabel(db_filename, "252670", "20220809", "1518", 1) - labelMaker.makeLabel(db_filename, "252670", "20220809", "1519", 1) - labelMaker.makeLabel(db_filename, "252670", "20220809", "1520", 1) + labelMaker.makeLabel(db_filename, "122630", "20220811", "0905", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "0910", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "0911", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1030", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1034", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1109", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1110", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1111", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1207", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1211", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1228", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1229", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1230", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1231", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1232", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1249", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1303", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1304", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1420", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1421", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1436", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1437", 2) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1438", 2) + + labelMaker.makeLabel(db_filename, "122630", "20220811", "0949", 1) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1000", 1) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1001", 1) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1016", 1) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1017", 1) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1045", 1) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1049", 1) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1126", 1) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1127", 1) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1315", 1) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1316", 1) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1317", 1) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1458", 1) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1459", 1) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1500", 1) + labelMaker.makeLabel(db_filename, "122630", "20220811", "1501", 1) + labelMaker.showLabels(stock_code, ymd) else: