From 64ea82570bfd9344cf91fb684584d6177ed07daa Mon Sep 17 00:00:00 2001 From: dsyoon Date: Sun, 29 Jan 2023 20:42:23 +0900 Subject: [PATCH] init --- HTS_252670.py | 2 +- Simulation.py | 55 +++++++++------ hts/BuySellChecker.py | 153 ++++++++++++++---------------------------- 3 files changed, 84 insertions(+), 126 deletions(-) diff --git a/HTS_252670.py b/HTS_252670.py index ac7eab1..5b31c2f 100644 --- a/HTS_252670.py +++ b/HTS_252670.py @@ -125,7 +125,7 @@ class HTS_252670 (HTS): # 미체결 기록을 가져온다. ORDER_LIST = self.requestOrderList() # 매도 주문을 기록을 가져온다. - orderListToCancel = self.orderChecker.remove(self.stock_code, OrderType.sell, ORDER_LIST) + orderListToCancel = self.orderChecker.delete(self.stock_code, OrderType.sell, ORDER_LIST) # 매도 미체결을 모두 취소한다. self.cancelOrderList(orderListToCancel) diff --git a/Simulation.py b/Simulation.py index 9c303fe..90e948e 100644 --- a/Simulation.py +++ b/Simulation.py @@ -38,9 +38,9 @@ class Simulation (HTS): # 어제 데이터는 지운다. data = data.loc[pd.DatetimeIndex(data.index).day == int(given_day[6:])] - buy_line = bsLine['buy'][381:] - buy_weight_line = bsLine['buy_weight'][381:] - sell_line = bsLine['sell'][381:] + buy_line = bsLine['buy'][len(bsLine['buy'])-len(data):] + buy_weight_line = bsLine['buy_weight'][len(bsLine['buy'])-len(data):] + sell_line = bsLine['sell'][len(bsLine['buy'])-len(data):] # 그래프 설정을 위한 변수를 생성한다. data = data.astype({'open': 'int', @@ -48,11 +48,11 @@ class Simulation (HTS): 'low': 'int', 'close': 'int', 'volume': 'int', - 'avg3': 'float', - 'avg6': 'float', - 'avg9': 'float', - 'avg12': 'float', + 'avg5': 'float', 'avg20': 'float', + 'avg30': 'float', + 'avg60': 'float', + 'avg120': 'float', 'fast_k': 'float', 'slow_k': 'float', 'slow_d': 'float', @@ -84,11 +84,11 @@ class Simulation (HTS): 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='#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') - avg20 = go.Scatter(x=data['date'], y=data["avg20"], name="avg20", line_color='#000000') + avg5 = go.Scatter(x=data['date'], y=data["avg5"], name="avg5", line_color='#8F8203') + avg20 = go.Scatter(x=data['date'], y=data["avg20"], name="avg20", line_color='#089B5B') + avg30 = go.Scatter(x=data['date'], y=data["avg30"], name="avg30", line_color='#ff00ff') + avg60 = go.Scatter(x=data['date'], y=data["avg60"], name="avg60", line_color='#1469F4') + avg120 = go.Scatter(x=data['date'], y=data["avg120"], name="avg120", line_color='#000000') laggingSpan = go.Scatter(x=data['date'], y=data["laggingSpan"], name='laggingSpan', line_color='#B50ABB') changeLine = go.Scatter(x=data['date'], y=data["changeLine"], name='changeLine', line_color='#14A200') baseLine = go.Scatter(x=data['date'], y=data["baseLine"], name='baseLine', line_color='#CF6E0D') @@ -114,7 +114,7 @@ class Simulation (HTS): rsi_line = go.Scatter(x=data['date'], y=data["rsi"], line=dict(color='red', width=2), name='rsi') rsis_line = go.Scatter(x=data['date'], y=data["rsis"], line=dict(dash='dashdot', color='black', width=2), name='rsis') - candle_data = [candle_stick, upper, lower, avg3, avg6, avg9, avg12, avg20, buy_check, sell_check, laggingSpan, changeLine, baseLine] + candle_data = [candle_stick, upper, lower, avg5, avg20, avg30, avg60, avg120, buy_check, sell_check, laggingSpan, changeLine, baseLine] volume_data = [volume_line] disparity_data = [disparity_avg5, disparity_avg10, disparity_avg20, disparity_avg60, disparity_avg120] macd_data = [macd_line, macd_s_line, macd_o_line] @@ -174,30 +174,41 @@ class Simulation (HTS): "label": []} for i in range(mins, len(data['time'])+1): - result["check"].add(data['time'][i]) - result["time"].append(data['time'][i]) + result["check"].add(data['time'][i-1]) + result["time"].append(data['time'][i-1]) result["open"].append(data['open'][i-mins]) result["close"].append(data['close'][i-1]) - result["high"].append(max(data['high'][i - 30: i])) - result["low"].append(min(data['low'][i - 30: i])) - result["vol"].append(sum(data[i - 30: i])) + result["high"].append(max(data['high'][i - mins: i])) + result["low"].append(min(data['low'][i - mins: i])) + result["vol"].append(sum(data['vol'][i - mins: i])) return result - def simulate(self, stock_codes:dict=None): + def simulate(self, stock_codes:dict=None, analyzed_day=1000): if stock_codes is not None: for stock_code in stock_codes: for given_day in stock_codes[stock_code]: LAST_DATA = self.stock2Vector.getLastData(stock_code, given_day) result = self.stock2Vector.getRealTime(stock_code, given_day, LAST_DATA) - result_30 = self.makeTickData(result, min=30) + result_5 = self.makeTickData(result, mins=5) + result_30 = self.makeTickData(result, mins=30) + + data = self.buySellChecker.analyze(result) + data.drop(data.index[:len(data) - analyzed_day], inplace=True) # 이동평균, RSI, MACD, 일목균형, 볼린저밴드 상/하단을 계산한다. - data1 = self.buySellChecker.analyze(result) + data_5 = self.buySellChecker.analyze(result_5) + # 분석일 데이터만 활용한다 (이전 데이터는 제거) + data_5.drop(data_5.index[:len(data_5) - analyzed_day], inplace=True) + + data_30 = self.buySellChecker.analyze(result_30) + # 분석일 데이터만 활용한다 (이전 데이터는 제거) + data_30.drop(data_30.index[:len(data_30) - analyzed_day], inplace=True) + # 사야 할 시점과 팔아야 할 시점을 체크한다. - bsLine, data = self.buySellChecker.checkTransaction(data, stock_code, isRealTime=False) + bsLine = self.buySellChecker.checkTransaction(stock_code, data, data_5, data_30, isRealTime=False) # 그래프를 그린다. self.draw(stock_code, given_day, data, bsLine) diff --git a/hts/BuySellChecker.py b/hts/BuySellChecker.py index 1905ef5..e7952de 100644 --- a/hts/BuySellChecker.py +++ b/hts/BuySellChecker.py @@ -109,73 +109,49 @@ class BuySellChecker: return -1 return 0 - def getBuyPriceAndWeight(self, data, i): - buy, weight, type = -1, -1, -1 + def getBuyPriceAndWeight(self, data, data_5, data_30, i): + buy, weight = -1, -1 - START_TIME_INDEX = 0 - for c in range(370, len(data.index)): - if data.index[c].strftime("%H:%M:%S") == "09:01:00": - START_TIME_INDEX = c - break + if data_5['slow_k'][i] < 20: + if data_5['slow_k'][i - 1] < data_5['slow_d'][i - 1] and data_5['slow_d'][i] < data_5['slow_k'][i]: + buy = data['low'][i] + weight = 0.3 - if START_TIME_INDEX + 10 < i < START_TIME_INDEX + 350: - # 매수 분석 + if data_30['slow_k'][i] < 30 and data_5['slow_k'][i] < 30: + if data_5['slow_k'][i - 1] < data_5['slow_d'][i - 1] and data_5['slow_d'][i] < data_30['slow_k'][i]: + buy = data['close'][i] + weight = 0.3 - if data['macd'][i] < -7: - buy = max(data["open"][i], data["close"][i]) - weight = 1 - type = 1 - return buy, weight, type + if data_30['slow_k'][i] < 30: + if data_5['slow_k'][i] < 30: + if data_5['avg5'][i] < data_5['close'][i]: + buy = data['close'][i] + weight = 0.2 - """ - if data['changeLine'][i - 1] <= data['baseLine'][i - 1] and data['baseLine'][i] < data['changeLine'][i]: - changeLine_count = sum([1 if data['changeLine'][c] <= data['baseLine'][c] else 0 for c in range(i-30, i-10)]) - if changeLine_count >= 15: - changeLine_count = sum([1 if data['changeLine'][c] <= data['baseLine'][c] else 0 for c in range(i-10, i)]) - if changeLine_count >= 7: - buy = min(data["open"][i], data["close"][i]) - weight = 1 - type = 1 - return buy, weight, type - """ + if data_5['slow_k'][i - 1] < data_5['slow_d'][i - 1] and data_5['slow_d'][i] < data_30['slow_k'][i]: + buy = data['close'][i] + weight = 0.3 - """ - if i > 381 + 26: - if data['laggingSpan'][i-1] < data['avg3'][i-1] and data['avg3'][i] < data['laggingSpan'][i]: - if self.checkUpDirection(data, i) == 1: - avg20_line = sum([1 if data['avg20'][c] < data['avg20'][c-1] else 0 for c in range(i - 10, i)]) - if avg20_line < 10: - if data["macd"][i] < 0: - buy = min(data["open"][i], data["close"][i]) - weight = 1 - type = 1 - return buy, weight, type - """ - return buy, weight, type + return buy, weight - def getSellPriceAndWeight(self, data, i): - sell, weight, type = -1, -1, -1 + def getSellPriceAndWeight(self, data, data_5, data_30, i): + sell, weight = -1, -1 - START_TIME_INDEX = 0 - for c in range(370, len(data.index)): - if data.index[c].strftime("%H:%M:%S") == "09:01:00": - START_TIME_INDEX = c - break + if data_30['slow_k'][i] > 90: + if (data_5['slow_d'][i-1] < data_5['slow_k'][i-1] and data_5['slow_k'][i] < data_5['slow_d'][i]): + sell = data['close'][i] + weight = 100 - if i > START_TIME_INDEX: - # 매도 분석 + if data_5['slow_k'][i] > 95 and data_5['slow_k'][i] < data_5['slow_d'][i]: + sell = data['close'][i] + weight = 100 - if data['changeLine'][i - 1] >= data['laggingSpan'][i - 1] and data['laggingSpan'][i] < data['changeLine'][ - i]: - changeLine_count = sum( - [1 if data['changeLine'][c] <= data['laggingSpan'][c] else 0 for c in range(i - 20, i)]) - if changeLine_count >= 17: - sell = min(data["open"][i], data["close"][i]) - weight = 1 - type = 1 - return sell, weight, type + if data_30['slow_k'][i] > 98 and data_5['slow_k'][i] > 98: + sell = data['close'][i] + weight = 100 + + return sell, weight - return sell, weight, type def getBuyPriceAndWeight_122630(self, data, i): buy, weight, type = -1, -1, -1 @@ -252,20 +228,19 @@ class BuySellChecker: high = result["high"] low = result["low"] vol = result["vol"] - label = result["label"] # 이동 평균 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] + avg5_list = close_df.rolling(window=5).mean().fillna(close[0]).values.tolist() + avg5 = [item[0] for item in avg5_list] avg20_list = close_df.rolling(window=20).mean().fillna(close[0]).values.tolist() avg20 = [item[0] for item in avg20_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] + avg120_list = close_df.rolling(window=120).mean().fillna(close[0]).values.tolist() + avg120 = [item[0] for item in avg120_list] open_df = pd.DataFrame(close) disparity_avg5_list = (open_df / close_df.rolling(window=5).mean()).values.tolist() @@ -299,7 +274,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], - 'avg20': avg20[i]}) + 'avg5': avg5[i], 'avg20': avg20[i], 'avg30': avg30[i], 'avg60': avg60[i], 'avg120': avg120[i]}) # stochastic stochastic_df = self.stochastic.apply(STOCK, n=30, m=5, t=5) @@ -331,7 +306,7 @@ class BuySellChecker: temp = { "date": point_temp, "open": open, "high": high, "low": low, "close": close, "volume": vol, - "avg3": avg3, "avg6": avg6, "avg9": avg9, "avg12": avg12, "avg20": avg20, + "avg5": avg5, "avg20": avg20, "avg30": avg30, "avg60": avg60, "avg120": avg120, "disparity_avg5": disparity_avg5, "disparity_avg10": disparity_avg10, "disparity_avg20": disparity_avg20, "disparity_avg60": disparity_avg60, "disparity_avg120": disparity_avg120, "upper": upper, "lower": lower, @@ -340,15 +315,13 @@ class BuySellChecker: "rsi": rsi, "rsis": rsis, "changeLine": changeLine, "baseLine": baseLine, "laggingSpan": laggingSpan, "leadingSpan1": leadingSpan1, "leadingSpan2": leadingSpan2, - - "label": label } data = pd.DataFrame(temp) df_final_time = pd.DatetimeIndex(point_temp) data.index = df_final_time - data = data.fillna(close[0]) + data = data.fillna(-1) return data def analyze1(self, result): @@ -747,12 +720,7 @@ class BuySellChecker: 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() - data = data[data['date'].dt.date != date[0]] - data = data[data['date'].dt.date != date[1]] - + def checkTransaction(self, stock_code, data, data_5, data_30, isRealTime=True): # 어제 오늘 데이터로 분석 bsLine = {} size = len(data["close"]) @@ -761,22 +729,14 @@ class BuySellChecker: # isRealTime=True, 실시간 적용 last_index = size - 1 - buy, buy_weight, buy_type = self.getBuyPriceAndWeight(data, last_index) - sell, sell_weight, sell_type = self.getSellPriceAndWeight(data, last_index) - - if buy > -1 or self.BUY_COUNT == 1: - if buy == -1 or self.BUY_COUNT == 1: - buy = min(data['open'][last_index], data['close'][last_index]) - buy_weight = 1 - self.BUY_COUNT += 1 + buy, buy_weight = self.getBuyPriceAndWeight(data, data_5, data_30, last_index) + sell, sell_weight = self.getSellPriceAndWeight(data, data_5, data_30, last_index) bsLine['buy'] = [buy] bsLine['buy_weight'] = [buy_weight] bsLine['sell'] = [sell] bsLine['sell_weight'] = [sell_weight] - if self.BUY_COUNT > 1: - self.BUY_COUNT = 0 else: # Type=False, 시뮬레이션 적용 bsLine['buy'] = [-1 for i in range(size)] @@ -785,28 +745,15 @@ class BuySellChecker: bsLine['sell_weight'] = [-1 for i in range(size)] for i in range(size): - if stock_code == "252670": - buy, buy_weight, buy_type = self.getBuyPriceAndWeight(data, i) - sell, sell_weight, sell_type = self.getSellPriceAndWeight(data, i) - else: - buy, buy_weight, buy_type = self.getBuyPriceAndWeight_122630(data, i) - sell, sell_weight, sell_type = self.getSellPriceAndWeight_122630(data, i) - - if buy > -1 or self.BUY_COUNT == 1: - if buy == -1 or self.BUY_COUNT == 1: - buy = data['low'][i] - buy_weight = 1 - self.BUY_COUNT += 1 + buy, buy_weight = self.getBuyPriceAndWeight(data, data_5, data_30, i) + sell, sell_weight = self.getSellPriceAndWeight(data, data_5, data_30, i) bsLine['buy'][i] = buy bsLine['buy_weight'][i] = buy_weight bsLine['sell'][i] = sell bsLine['sell_weight'][i] = sell_weight - if self.BUY_COUNT > 1: - self.BUY_COUNT = 0 - - return bsLine, data + return bsLine def checkTransactionML(self, data, stock_code, predY, isRealTime=True): # 4일치 중에서 앞에 2일은 제거한다.