From 9da290b22029b13629cc9506eaab50bb1eba793c Mon Sep 17 00:00:00 2001 From: dsyoon Date: Sun, 8 Oct 2023 15:52:20 +0900 Subject: [PATCH] init --- Simulation.py | 50 +++++++++++++---------- hts/BuySellChecker.py | 95 ++++++++++++++++++++++++------------------- 2 files changed, 82 insertions(+), 63 deletions(-) diff --git a/Simulation.py b/Simulation.py index 42b7321..be678ab 100644 --- a/Simulation.py +++ b/Simulation.py @@ -50,9 +50,14 @@ class Simulation (HTS): 'volume': 'int', 'avg5': 'float', 'avg20': 'float', - 'avg30': 'float', 'avg60': 'float', 'avg120': 'float', + 'avg200': 'float', + 'disparity_avg5': 'float', + 'disparity_avg20': 'float', + 'disparity_avg60': 'float', + 'disparity_avg120': 'float', + 'disparity_avg200': 'float', 'fast_k': 'float', 'slow_k': 'float', 'slow_d': 'float', @@ -84,11 +89,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') - 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') + avg5 = go.Scatter(x=data['date'], y=data["avg5"], name="avg5", line_color='#F81191') + avg20 = go.Scatter(x=data['date'], y=data["avg20"], name="avg20", line_color='#097F19') + avg60 = go.Scatter(x=data['date'], y=data["avg60"], name="avg60", line_color='#671BEA') + avg120 = go.Scatter(x=data['date'], y=data["avg120"], name="avg120", line_color='#DFB809') + avg200 = go.Scatter(x=data['date'], y=data["avg200"], name="avg200", 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') @@ -97,11 +102,11 @@ class Simulation (HTS): #volume_line = go.Scatter(x=data['date'], y=data["volume"], mode='lines', name='volume') volume_line = go.Bar(x=data['date'], y=data["volume"], marker_color='red', name='volume') - disparity_avg5 = go.Scatter(x=data['date'], y=data["disparity_avg5"], name="disparity_avg5", line_color='#8F8203') - disparity_avg10 = go.Scatter(x=data['date'], y=data["disparity_avg10"], name="disparity_avg10", line_color='#089B5B') - disparity_avg20 = go.Scatter(x=data['date'], y=data["disparity_avg20"], name="disparity_avg20", line_color='#ff00ff') - disparity_avg60 = go.Scatter(x=data['date'], y=data["disparity_avg60"], name="disparity_avg60", line_color='#1469F4') - disparity_avg120 = go.Scatter(x=data['date'], y=data["disparity_avg120"], name="disparity_avg120", line_color='#000000') + disparity_avg5 = go.Scatter(x=data['date'], y=data["disparity_avg5"], name="disparity_avg5", line_color='#F81191') + disparity_avg20 = go.Scatter(x=data['date'], y=data["disparity_avg20"], name="disparity_avg20", line_color='#097F19') + disparity_avg60 = go.Scatter(x=data['date'], y=data["disparity_avg60"], name="disparity_avg60", line_color='#671BEA') + disparity_avg120 = go.Scatter(x=data['date'], y=data["disparity_avg120"], name="disparity_avg120", line_color='#DFB809') + disparity_avg200 = go.Scatter(x=data['date'], y=data["disparity_avg200"], name="disparity_avg200", line_color='#000000') macd_line = go.Scatter(x=data['date'], y=data["macd"], line=dict(color='red', width=2), name='macd') macd_s_line = go.Scatter(x=data['date'], y=data["macds"], line=dict(dash='dashdot', color='black', width=2), name='macds') @@ -114,9 +119,9 @@ 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, avg5, avg20, avg30, avg60, avg120, buy_check, sell_check, laggingSpan, changeLine, baseLine] + candle_data = [candle_stick, upper, lower, avg5, avg20, avg60, avg120, avg200, buy_check, sell_check, laggingSpan, changeLine, baseLine] volume_data = [volume_line] - disparity_data = [disparity_avg5, disparity_avg10, disparity_avg20, disparity_avg60, disparity_avg120] + disparity_data = [disparity_avg5, disparity_avg20, disparity_avg60, disparity_avg120, disparity_avg200] macd_data = [macd_line, macd_s_line, macd_o_line] stochastic_data = [slow_k_line, slow_d_line] rsi_data = [rsi_line, rsis_line] @@ -191,23 +196,24 @@ class Simulation (HTS): 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_5 = self.makeTickData(result, mins=5) - result_30 = self.makeTickData(result, mins=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, 일목균형, 볼린저밴드 상/하단을 계산한다. - data_5 = self.buySellChecker.analyze(result_5) + #data_5 = self.buySellChecker.analyze(result_5) # 분석일 데이터만 활용한다 (이전 데이터는 제거) - data_5.drop(data_5.index[:len(data_5) - analyzed_day], inplace=True) + #data_5.drop(data_5.index[:len(data_5) - analyzed_day], inplace=True) - data_30 = self.buySellChecker.analyze(result_30) + #data_30 = self.buySellChecker.analyze(result_30) # 분석일 데이터만 활용한다 (이전 데이터는 제거) - data_30.drop(data_30.index[:len(data_30) - analyzed_day], inplace=True) + #data_30.drop(data_30.index[:len(data_30) - analyzed_day], inplace=True) # 사야 할 시점과 팔아야 할 시점을 체크한다. - bsLine = self.buySellChecker.checkTransaction(stock_code, data, data_5, data_30, isRealTime=False) + #bsLine = self.buySellChecker.checkTransaction(stock_code, data, data_5, data_30, isRealTime=False) + bsLine = self.buySellChecker.checkTransaction(stock_code, data, None, None, isRealTime=False) # 그래프를 그린다. self.draw(stock_code, given_day, data, bsLine) @@ -227,10 +233,10 @@ if __name__ == "__main__": # to check bying stock_codes = { "252670": [ - '20220901', '20220902', '20220905', '20220906', '20220907', '20220908','20220913','20220914','20220915','20220916' + '20220901', '20220902', '20220905', '20220906' ], "122630": [ - '20220901', '20220902', '20220905', '20220906', '20220907', '20220908', '20220913', '20220914', '20220915', '20220916' + '20220901', '20220902', '20220905', '20220906' ] } #simulation.simulate(stock_codes) diff --git a/hts/BuySellChecker.py b/hts/BuySellChecker.py index 7c932c4..4598a78 100644 --- a/hts/BuySellChecker.py +++ b/hts/BuySellChecker.py @@ -109,53 +109,64 @@ class BuySellChecker: return -1 return 0 - def getBuyPriceAndWeight(self, data, data_5, data_30, i): + def getBuyPriceAndWeight(self, i, data, data_5=None, data_30=None): buy, weight = -1, -1 - if len(data_5['slow_k']) <= i or len(data_30['slow_k']) <= i: - return buy, weight + if data_5 is not None and data_30 is not None: + if len(data_5['slow_k']) <= i or len(data_30['slow_k']) <= i: + return buy, weight - 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 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 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_30['slow_k'][i] < 30: - if data_5['slow_k'][i] < 30: - if data_5['avg5'][i] < data_5['close'][i]: + 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.2 + weight = 0.3 - 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_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_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 + else: + if data['avg5'][i-1] < data['avg200'][i-1] and data['avg200'][i] < data['avg5'][i]: + if data['avg60'][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]): + 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 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_30['slow_k'][i] > 98 and data_5['slow_k'][i] > 98: sell = data['close'][i] weight = 100 - - if data_5['slow_k'][i] > 95 and data_5['slow_k'][i] < data_5['slow_d'][i]: + else: + if data['avg200'][i-1] < data['avg5'][i-1] and data['avg5'][i] < data['avg200'][i]: sell = data['close'][i] weight = 100 - if data_30['slow_k'][i] > 98 and data_5['slow_k'][i] > 98: - sell = data['close'][i] - weight = 100 - return sell, weight @@ -247,18 +258,20 @@ class BuySellChecker: 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] + avg200_list = close_df.rolling(window=200).mean().fillna(close[0]).values.tolist() + avg200 = [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() disparity_avg5 = [item[0] for item in disparity_avg5_list] - disparity_avg10_list = (open_df / close_df.rolling(window=10).mean()).values.tolist() - disparity_avg10 = [item[0] for item in disparity_avg10_list] disparity_avg20_list = (open_df / close_df.rolling(window=20).mean()).values.tolist() disparity_avg20 = [item[0] for item in disparity_avg20_list] disparity_avg60_list = (open_df / close_df.rolling(window=60).mean()).values.tolist() disparity_avg60 = [item[0] for item in disparity_avg60_list] disparity_avg120_list = (open_df / close_df.rolling(window=120).mean()).values.tolist() disparity_avg120 = [item[0] for item in disparity_avg120_list] + disparity_avg200_list = (open_df / close_df.rolling(window=200).mean()).values.tolist() + disparity_avg200 = [item[0] for item in disparity_avg200_list] # 볼린져 밴드 df = pd.DataFrame(close) @@ -280,7 +293,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], - 'avg5': avg5[i], 'avg20': avg20[i], 'avg30': avg30[i], 'avg60': avg60[i], 'avg120': avg120[i]}) + 'avg5': avg5[i], 'avg20': avg20[i], 'avg60': avg60[i], 'avg120': avg120[i], 'avg200': avg200[i]}) # stochastic stochastic_df = self.stochastic.apply(STOCK, n=30, m=5, t=5) @@ -312,9 +325,9 @@ class BuySellChecker: temp = { "date": point_temp, "open": open, "high": high, "low": low, "close": close, "volume": vol, - "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, + "avg5": avg5, "avg20": avg20, "avg60": avg60, "avg120": avg120, "avg200": avg200, + "disparity_avg5": disparity_avg5, "disparity_avg20": disparity_avg20, + "disparity_avg60": disparity_avg60, "disparity_avg120": disparity_avg120, "disparity_avg200": disparity_avg200, "upper": upper, "lower": lower, "macd": macd, "macds": macds, "macdo": macdo, "fast_k": fast_k, "slow_k": slow_k, "slow_d": slow_d, @@ -726,7 +739,7 @@ class BuySellChecker: outFp.write(str(df["label"][i]) + "\n") return - def checkTransaction(self, stock_code, data, data_5, data_30, isRealTime=True): + def checkTransaction(self, stock_code, data, data_5=None, data_30=None, isRealTime=True): # 어제 오늘 데이터로 분석 bsLine = {} size = len(data["close"]) @@ -735,8 +748,8 @@ class BuySellChecker: # isRealTime=True, 실시간 적용 last_index = size - 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) + buy, buy_weight = self.getBuyPriceAndWeight(last_index, data, data_5, data_30) + sell, sell_weight = self.getSellPriceAndWeight(last_index, data, data_5, data_30) bsLine['buy'] = [buy] bsLine['buy_weight'] = [buy_weight] @@ -751,8 +764,8 @@ class BuySellChecker: bsLine['sell_weight'] = [-1 for i in range(size)] for i in range(size): - buy, buy_weight = self.getBuyPriceAndWeight(data, data_5, data_30, i) - sell, sell_weight = self.getSellPriceAndWeight(data, data_5, data_30, i) + buy, buy_weight = self.getBuyPriceAndWeight(i, data, data_5, data_30) + sell, sell_weight = self.getSellPriceAndWeight(i, data, data_5, data_30) bsLine['buy'][i] = buy bsLine['buy_weight'][i] = buy_weight