diff --git a/hts/BS.py b/hts/BS.py index 41794ee..457c57c 100644 --- a/hts/BS.py +++ b/hts/BS.py @@ -16,6 +16,58 @@ class BS: return + def getPriceAndWeight(self, data, i): + buy, weight, sell = -1, -1, -1 + + # sell 분석 + if (data["High"][i] - data["Close"][i]) / 2 + data["Close"][i] > data["upper"][i]: + sell = data["High"][i] + if i > 300: + if data["High"][i] > data["upper"][i]: + sell = data["High"][i] + + # buy 분석 + if data["slow_k"][i] <= 36: + if data["Low"][i] < data["lower"][i]: + buy = data["Low"][i] + if data["slow_k"][i] <= 25: + if data["slow_k"][i - 1] < data["slow_d"][i - 1] and data["slow_d"][i] < data["slow_k"][i]: + buy = data["Low"][i] + + if i < 40: + if data["slow_k"][i] < 25: + buy = data["Low"][i] + + # weight 분석 + # rsi가 rsis 위로 올라오며 15 이하일 경우 10배로 주문함 (14:30 이전) + if data["rsi"][i] < 15 and data["rsis"][i] < 15 and data["rsi"][i - 1] < data["rsis"][i - 1] and data["rsis"][i] < data["rsi"][i]: + buy = data["Low"][i] + weight = 4 + + if data["slow_k"][i] == 1: + weight = 4 # 8 + elif data["slow_k"][i] in (2, 3): + weight = 3.5 # 7 + elif data["slow_k"][i] in (4, 5, 6): + weight = 3 # 6 + elif data["slow_k"][i] in (7, 8, 9, 10): + weight = 2.5 # 5 + elif data["slow_k"][i] in (11, 12, 13, 14, 15): + weight = 2 # 4 + elif data["slow_k"][i] in (16, 17, 18, 19, 20, 21): + weight = 1.5 # 3 + elif data["slow_k"][i] in (22, 23, 24, 25, 26, 27, 28): + weight = 1 # 2 + elif data["slow_k"][i] in (29, 30, 31, 32, 33, 34, 35, 36): + weight = 1 + if data["rsi"][i] < 10: + weight = 3 # 8 + + if i <= 20: + weight = 1 + + return buy, weight, sell + def checkStatus(self, STOCK, last_index): status = set() @@ -235,7 +287,9 @@ class BS: # stochastic 계산 stochastic_df = self.stochastic.apply(pd.DataFrame(STOCK)) - stochastic_df = stochastic_df.fillna(100) + stochastic_df['fast_k'] = stochastic_df['fast_k'].fillna(float(stochastic_df['fast_k'].iloc[9])) + stochastic_df['slow_k'] = stochastic_df['slow_k'].fillna(float(stochastic_df['slow_k'].iloc[14])) + stochastic_df['slow_d'] = stochastic_df['slow_d'].fillna(float(stochastic_df['slow_d'].iloc[19])) fast_k = stochastic_df['fast_k'].values.tolist() slow_k = stochastic_df['slow_k'].values.tolist() slow_d = stochastic_df['slow_d'].values.tolist() diff --git a/hts/HTS.py b/hts/HTS.py index d51cf47..573be93 100644 --- a/hts/HTS.py +++ b/hts/HTS.py @@ -531,45 +531,11 @@ class HTS: bsLine['sell'] = [-1 for i in range(size)] i = size - 1 - if i > 20: - if data["High"][i] > data["upper"][i]: - bsLine['sell'][i] = data["High"][i] - - if data["slow_k"][i] <= 36: - if data["Low"][i] < data["lower"][i]: - bsLine['buy'][i] = data["Close"][i] - 5 - if data["slow_k"][i] <= 25: - if data["slow_k"][i - 1] < data["slow_d"][i - 1] and data["slow_d"][i] < data["slow_k"][i]: - bsLine['buy'][i] = data["Close"][i] - 5 - - # rsi가 rsis 위로 올라오며 15 이하일 경우 10배로 주문함 (14:30 이전) - if data["rsi"][i] < 15 and data["rsis"][i] < 15 and data["rsi"][i - 1] < data["rsis"][i - 1] and data["rsis"][i] < data["rsi"][i]: - bsLine['buy'][i] = data["Close"][i] - 5 - bsLine['weight'][i] = 10 - - if data["slow_k"][i] == 1: - bsLine['weight'][i] = 8 - elif data["slow_k"][i] in(2,3): - bsLine['weight'][i] = 7 - elif data["slow_k"][i] in(4,5,6): - bsLine['weight'][i] = 6 - elif data["slow_k"][i] in(7,8,9,10): - bsLine['weight'][i] = 5 - elif data["slow_k"][i] in(11,12,13,14,15): - bsLine['weight'][i] = 4 - elif data["slow_k"][i] in(16,17,18,19,20,21): - bsLine['weight'][i] = 3 - elif data["slow_k"][i] in(22,23,24,25,26,27,28): - bsLine['weight'][i] = 2 - elif data["slow_k"][i] in(29,30,31,32,33,34,35,36): - bsLine['weight'][i] = 1 - if data["rsi"][i] < 10: - bsLine['weight'][i] = 8 - if i<=20: - bsLine['weight'][i] = 1 - - return bsLine['buy'][i], bsLine['weight'][i], bsLine['sell'][i] + if i <= 20: + return -1, -1, -1 + buy, weight, sell = self.bs.getPriceAndWeight(data, i) + return buy, weight, sell def getSellingPrice(self, final_price): # 만약 잔고가 있으면 장부가보다 5원 높게 매도한다. @@ -597,9 +563,6 @@ class HTS: return 0, 0 def buyRealTime(self, stock_code, given_day): - PREVIOUS_PRICE = 0 - BUY_COUNT = 200 - timecheckList = pd.read_csv("timecheck.csv").values.tolist() timecheck = {given_day + " " + str(second).zfill(6):False for second, check in timecheckList} @@ -631,26 +594,12 @@ class HTS: final_price = data["Close"][len(data["Close"])-1] if bs_buy_price > 0: - if PREVIOUS_PRICE > 0: - if PREVIOUS_PRICE > bs_buy_price: - if BUY_COUNT > 240: - BUY_COUNT = 240 - if BUY_COUNT < 140: - BUY_COUNT = 140 - BUY_COUNT += 10 - elif PREVIOUS_PRICE < bs_buy_price: - if BUY_COUNT > 260: - BUY_COUNT = 260 - if BUY_COUNT < 160: - BUY_COUNT = 160 - BUY_COUNT -= 10 - - PREVIOUS_PRICE = bs_buy_price + BUY_COUNT = int(200 * bs_weight) # 매수 전에 모든 미체결을 취소한다. - self.cancelOrderList() + # self.cancelOrderList() # 현재까지 매입금액이 7백만원 이하일 때만 매수를 한다. - self.requestOrder("2", stock_code, BUY_COUNT , bs_buy_price) + self.requestOrder("2", stock_code, bs_weight * BUY_COUNT , bs_buy_price) print("BUY", second, BUY_COUNT, bs_buy_price) if bs_sell_price > 0: diff --git a/hts/Simulation.py b/hts/Simulation.py index 7ae434d..2e08fba 100644 --- a/hts/Simulation.py +++ b/hts/Simulation.py @@ -50,41 +50,10 @@ class Simulation: bsLine['sell'] = [-1 for i in range(size)] for i in range(21, size-5): - if data["High"][i] > data["upper"][i]: - bsLine['sell'][i] = data["High"][i] - - if data["slow_k"][i] <= 36: - if data["Low"][i] < data["lower"][i]: - bsLine['buy'][i] = data["Close"][i] - 5 - if data["slow_k"][i] <= 25: - if data["slow_k"][i - 1] < data["slow_d"][i - 1] and data["slow_d"][i] < data["slow_k"][i]: - bsLine['buy'][i] = data["Close"][i] - 5 - - # rsi가 rsis 위로 올라오며 15 이하일 경우 10배로 주문함 (14:30 이전) - if data["rsi"][i] < 15 and data["rsis"][i] < 15 and data["rsi"][i - 1] < data["rsis"][i - 1] and data["rsis"][i] < data["rsi"][i]: - bsLine['buy'][i] = data["Close"][i] - 5 - bsLine['weight'][i] = 10 - - if data["slow_k"][i] == 1: - bsLine['weight'][i] = 8 - elif data["slow_k"][i] in(2,3): - bsLine['weight'][i] = 7 - elif data["slow_k"][i] in(4,5,6): - bsLine['weight'][i] = 6 - elif data["slow_k"][i] in(7,8,9,10): - bsLine['weight'][i] = 5 - elif data["slow_k"][i] in(11,12,13,14,15): - bsLine['weight'][i] = 4 - elif data["slow_k"][i] in(16,17,18,19,20,21): - bsLine['weight'][i] = 3 - elif data["slow_k"][i] in(22,23,24,25,26,27,28): - bsLine['weight'][i] = 2 - elif data["slow_k"][i] in(29,30,31,32,33,34,35,36): - bsLine['weight'][i] = 1 - if data["rsi"][i] < 10: - bsLine['weight'][i] = 8 - if i<=20: - bsLine['weight'][i] = 1 + buy, weight, sell = self.bs.getPriceAndWeight(data, i) + bsLine['buy'][i] = buy + bsLine['weight'][i] = weight + bsLine['sell'][i] = sell return bsLine @@ -98,6 +67,7 @@ class Simulation: data['Low'] = pd.to_numeric(data['Low']) data['Close'] = pd.to_numeric(data['Close']) data['Volume'] = pd.to_numeric(data['Volume']) + data['avg5'] = pd.to_numeric(data['avg5']) data["fast_k"] = pd.to_numeric(data['fast_k']) data["slow_k"] = pd.to_numeric(data['slow_k']) data["slow_d"] = pd.to_numeric(data['slow_d']) @@ -124,6 +94,7 @@ class Simulation: sell_check = go.Scatter(x=data['Date'], y=sell_line, mode='markers', name="sell", marker=dict(size=14, color=sell_colors, line_width=0)) bolinger_upper = go.Scatter(x=data['Date'], y=data["upper"], name="upper", line_color='#8B4513') bolinger_lower = go.Scatter(x=data['Date'], y=data["lower"], name="lower", line_color='#8B4513') + avg5 = go.Scatter(x=data['Date'], y=data["avg5"], name="avg5", line_color='#000000') 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') fast_k_line = go.Scatter(x=data['Date'], y=data["fast_k"], mode='lines', name='fast_k') @@ -133,7 +104,7 @@ class Simulation: rsis_line = go.Scatter(x=data['Date'], y=data["rsis"], mode='lines', name='rsis') #candle_data = [candle_stick, bolinger_upper, bolinger_lower, buy_check, sell_check, avg1, avg2, avg5, avg10, avg20, avg30, avg40, avg50, avg60] - candle_data = [candle_stick, bolinger_upper, bolinger_lower, buy_check, sell_check] + candle_data = [candle_stick, bolinger_upper, bolinger_lower, avg5, buy_check, sell_check] stochastic_data = [slow_k_line, slow_d_line] rsi_data = [rsi_line, rsis_line] @@ -189,11 +160,13 @@ if __name__ == "__main__": RESOURCE_DIR = PROJECT_HOME + "/resources/analysis/"+today.strftime("%Y%m%d") stock_codes = ["252670", "122630"] - given_days = ['20210901','20210902','20210903','20210906','20210907','20210908','20210909','20210910','20210913','20210914','20210915','20210916','20210917','20210923','20210924','20210927','20210928','20210929','20210930','20211001', '20211005'] - given_days = ['20211008'] + given_days = ['20210901','20210902','20210903','20210906','20210907','20210908','20210909','20210910','20210913', + '20210914','20210915','20210916','20210917','20210923','20210924','20210927','20210928','20210929', + '20210930','20211001', '20211005','20211006', '20211007','20211008', '20211012','20211013', '20211014'] simulation = Simulation() - simulation.simulate(stock_codes[0], given_days[0]) + for given_day in given_days: + simulation.simulate(stock_codes[0], given_day) print ("done...")