diff --git a/HTS_122630.py b/HTS_122630.py index 345f2a0..0a886e7 100644 --- a/HTS_122630.py +++ b/HTS_122630.py @@ -60,6 +60,7 @@ class HTS_122630 (HTS): if datetime.strptime(today + " 090000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 151500", '%Y%m%d %H%M%S'): # 3시 까지만 매수를 시도한다. + """ if THIS_TIME.strftime('%S') in ("09", "19", "29", "39", "49", "59"): if THIS_TIME.strftime('%S') in ("06", "16", "26", "36", "46", "56"): # 데이터를 가지고 온다. @@ -68,7 +69,7 @@ class HTS_122630 (HTS): # 10초마다 체크하여 체결된 내역이 있으면 50원 높게 매도를 주문한다. self.getSellingPrice(THIS_TIME, self.stock_code, final_price) - + """ if THIS_TIME.strftime('%S') == "05": # 매분 5초마다 실행한다. diff --git a/HTS_252670.py b/HTS_252670.py index 789dc34..1617b4d 100644 --- a/HTS_252670.py +++ b/HTS_252670.py @@ -62,6 +62,7 @@ class HTS_252670 (HTS): if datetime.strptime(today + " 090000", '%Y%m%d %H%M%S') < THIS_TIME < datetime.strptime(today + " 151500", '%Y%m%d %H%M%S'): # 3시 까지만 매수를 시도한다. + """ if THIS_TIME < datetime.strptime(today + " 145000", '%Y%m%d %H%M%S'): if THIS_TIME.strftime('%S') in ("06", "16", "26", "36", "46", "56"): # 데이터를 가지고 온다. @@ -70,7 +71,7 @@ class HTS_252670 (HTS): # 10초마다 체크하여 체결된 내역이 있으면 50원 높게 매도를 주문한다. self.getSellingPrice(THIS_TIME, self.stock_code, final_price) - + """ if THIS_TIME.strftime('%S') == "03": # 매분 3초마다 실행한다. @@ -178,7 +179,7 @@ if __name__ == "__main__": # KODEX 인버스 * 2 stock_code = "252670" stock_name = "KODEX 200선물인버스2X" - buy_count = 900 + buy_count = 300 hts = HTS_252670(RESOURCE_PATH, stock_code, buy_count) today_str = today.strftime('%Y%m%d') diff --git a/Simulation.py b/Simulation.py index 9788be7..152e8bd 100644 --- a/Simulation.py +++ b/Simulation.py @@ -89,6 +89,9 @@ class Simulation (HTS): 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') + 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') 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') @@ -104,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, avg6, avg9, avg12, avg20, buy_check, sell_check] + candle_data = [candle_stick, upper, lower, avg3, avg6, avg9, avg12, avg20, buy_check, sell_check, laggingSpan, changeLine, baseLine] volume_data = [volume_line] macd_data = [macd_line, macd_s_line, macd_o_line] stochastic_data = [slow_k_line, slow_d_line] @@ -186,7 +189,10 @@ if __name__ == "__main__": '20220808', '20220809', '20220810', '20220811', '20220812', '20220816', '20220817', '20220818', '20220819', '20220822', '20220823', '20220824', '20220825', '20220826', '20220829'], - #"122630": ['20220822', '20220823', '20220824', '20220825', '20220826', '20220829'] + "122630": ['20220801', '20220802', '20220803', '20220804', '20220805', + '20220808', '20220809', '20220810', '20220811', '20220812', + '20220816', '20220817', '20220818', '20220819', + '20220822', '20220823', '20220824', '20220825', '20220826', '20220829'] } method = "rule" # "rule", "ml", "answer" diff --git a/hts/BuySellChecker.py b/hts/BuySellChecker.py index 93b750d..3aba99e 100644 --- a/hts/BuySellChecker.py +++ b/hts/BuySellChecker.py @@ -14,7 +14,7 @@ class BuySellChecker: macd = None ichimokuCloud = None - buy_type = -1 + BUY_COUNT = None def __init__(self): self.common = Common() @@ -23,8 +23,7 @@ class BuySellChecker: self.macd = MACD() self.ichimokuCloud = IchimokuCloud() - self.buy_type = -1 - + self.BUY_COUNT = 0 return @@ -90,10 +89,23 @@ class BuySellChecker: break return inverse_arrangement + def checkUpDirection(self, data, i): + # 0: 무추세, -1: 하락 추세, 1: 상승 추세 + close = data['close'][i] + #up_count = sum([1 if data['high'][c] < close else 0 for c in range(i-20, i)]) + #down_count = sum([1 if close < data['low'][c] else 0 for c in range(i - 20, i)]) + + lagging_change = sum([1 if data['laggingSpan'][c] < data['changeLine'][c] else 0 for c in range(i-20, i)]) + change_lagging = sum([1 if data['laggingSpan'][c] > data['changeLine'][c] else 0 for c in range(i-20, i)]) + + if lagging_change>10: + return 1 + if change_lagging==20: + return -1 + return 0 + def getBuyPriceAndWeight(self, data, i): - type = -1 - buy, weight = min(data["open"][i], data["close"][i]), 1 - SLOW_K = 60 + buy, weight, type = -1, -1, -1 START_TIME_INDEX = 0 for c in range(370, len(data.index)): @@ -104,81 +116,44 @@ class BuySellChecker: if i > START_TIME_INDEX: # 매수 분석 - # 이전에 30분 동안 5분내 역배열이 있었던 경우, avg3이 avg20위로 올라온 경우 매수한다. - if data['avg3'][i-1] <= data['avg20'][i-1] and data['avg3'][i] > data['avg20'][i]: - if self.check_inverse_arrangement_before(data, i, 30, 5): + if i > 381 + 70: + if data['macdo'][i-1] < data['macdo'][i] and data['macdo'][i] < -10: + buy = max(data["open"][i], data["close"][i]) + weight = 1 + type = 1 + return buy, weight, type + else: + if data['macdo'][i - 1] < data['macdo'][i] and data['macdo'][i] < -10: + if -2 < data['macds'][381]: + buy = max(data["open"][i], data["close"][i]) + weight = 1 + type = 1 + return buy, weight, type + + 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)]) + if changeLine_count >= 19 and data['slow_k'][i] < 70: buy = min(data["open"][i], data["close"][i]) weight = 1 type = 1 return buy, weight, type - # 10시 이후 - if i > START_TIME_INDEX + 60: - if data["macd"][i] < -10 and data["macd"][i - 1] < data["macd"][i]: - if data["slow_k"][i] < 5 and data["slow_k"][i-1] < data["slow_k"][i]: - if data["slow_k"][i] < 5 and data["slow_k"][i - 1] < data["slow_k"][i]: - if data["rsi"][i] < 30 and data["rsi"][i - 1] < data["rsi"][i]: + """ + 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 - - - # avg20이 10분동안 상승하고,현재 avg20이 open/close 사이에 있고, slow_k가 60보다 작으면 매수 - valid = True - for c in range(i-9, i+1): - if data["avg20"][c-1] > data["avg20"][c]: - valid = False - if valid: - min_value = data["close"][i] - max_value = data["open"][i] - if data["open"][i] < data["close"][i]: - min_value = data["open"][i] - max_value = data["close"][i] - - if min_value < data["avg20"][i] < max_value: - if data["slow_k"][i] < SLOW_K: - if not self.check_12_over_20_for_30(data, i): - buy = min_value - weight = 1 - type = 1 - return buy, weight, type - - # 현재 slow_k가 60보다 작고, 최근 5분 동안 avg20이 다른 avg[3,6,9,12]의 최저값보다 큰 적이 없을 때, - if data["slow_k"][i] < SLOW_K: - valid = True - for c in range(i-4, i+1): - if min(data["avg3"][c], data["avg6"][c], data["avg9"][c], data["avg12"][c]) <= data["avg20"][c]: - valid = False - break - if valid: - valid = False - # 최근 20분 동안 avg20이 다른 avg[3,6,9,12]의 최대값보다 큰 적이 있을 때, - for c in range(i-19, i+1): - if max(data["avg3"][c], data["avg6"][c], data["avg9"][c], data["avg12"][c]) < data["avg20"][c]: - valid = True - break - if valid: - if not self.check_12_over_20_for_30(data, i): - buy = min(data["open"][i], data["close"][i]) - weight = 1 - type = 1 - return buy, weight, type - - if (data['macdo'][i] >= 0 or - data['avg3'][i-1] > data['avg3'][i] or - data['avg3'][i] < max(data['avg6'][i], data['avg9'][i], data['avg12'][i], data['avg20'][i])): - buy = -1 - weight = -1 - type = 0 - return buy, weight, type - - + """ return buy, weight, type def getSellPriceAndWeight(self, data, i): sell, weight, type = -1, -1, -1 - slow_k = 60 START_TIME_INDEX = 0 for c in range(370, len(data.index)): @@ -189,302 +164,16 @@ class BuySellChecker: if i > START_TIME_INDEX: # 매도 분석 - # 3분선이 10분 이상 6분선 위에 있다가 6분선 아래로 내려옴 - if i >= 381 + 10: - vaild = True - count = 0 - for c in range(i-10, i+1): - if data["avg3"][c-1] == data["avg20"][c]: - count += 1 - if data["avg3"][c-1] < data["avg20"][c]: - vaild = False - break - if vaild and count < 3: - if data["avg3"][i] < data["avg20"][i]: - if data["slow_k"][i] > slow_k: - sell = int(data["avg3"][i] - data["avg3"][i] % 5) - weight = 1 - type = 1 - return sell, weight, type - - # 12분선이 5분 이상 20분선 위에 있다가 20분선 아래로 내려옴 - if i >= 381 + 5: - vaild = True - for c in range(1, 6): - if data["avg12"][i - c] < data["avg20"][i - c]: - vaild = False - break - if vaild: - if data["avg12"][i] < data["avg20"][i] and data["avg20"][i-1] < data["avg20"][i]: - if data["slow_k"][i] > slow_k: - sell = data["close"][i] - weight = 1 - type = 1 - return sell, weight, type - - if (not (data["avg20"][i-1] > max(data["avg3"][i-1], data["avg6"][i-1], data["avg9"][i-1], data["avg12"][i-1])) and - (data["avg20"][i] > max(data["avg3"][i], data["avg6"][i], data["avg9"][i], data["avg12"][i]))): - if data["slow_k"][i] > slow_k: - sell = data["close"][i] + 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 return sell, weight, type - - # 곱버스에 해당함 - def getBuyPriceAndWeight_252670(self, data, i): - buy, weight, type = -1, -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 i > START_TIME_INDEX: - # 매수 분석 - - param = 1 - if (data["macd"][i] < -3.110935149 and data["macds"][i] < -2.370579802 and - data["diff_avg27"][i] < -0.51457476*param and - data["diff_avg3_avg54"][i] < -11.04578189 * param and - - data["diff_avg6_avg27"][i] < -6.53755144 * param and - data["diff_avg6_avg54"][i] < -9.518004115*param and - - data["diff_avg9_avg27"][i] < -5.21244856 * param and - data["diff_avg9_avg54"][i] < -8.192901235*param and - - data["diff_open_lead1"][i] < -13.26157407*param and - data["diff_close_lead1"][i] < -13.71064815*param and - data["diff_high_lead1"][i] < -10.08564815*param and - data["diff_low_lead1"][i] < -17.8912037*param and - - data["abs_avg_1"][i] > 15.72655178 * param and - 29.0499289 - 22.02727828/3 < data["diff_upper_lower"][i] < 29.0499289*param + 22.02727828 - ): - - buy = int((data["open"][i] + data["close"][i]) / 2) - weight = 1 - return buy, weight, type - - return buy, weight, type - - def getSellPriceAndWeight_252670(self, data, i): - sell, weight, type = -1, -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 i > START_TIME_INDEX: - # 매도 분석 - - # 3분선이 10분 이상 6분선 위에 있다가 5분선 아래로 내려옴 - if i >= 381 + 10: - 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 and count < 3: - if data["avg3"][i] < data["avg6"][i]: - sell = int(data["avg3"][i] - data["avg3"][i] % 5) - weight = 1 - return sell, weight, type - - # 3분선이 5분 이상 12분선 위에 있다가 12분선 아래로 내려옴 - if i >= 381 + 5: - vaild = True - for c in range(1, 6): - if not (data["avg3"][i - c] >= data["avg6"][i - c] >= data["avg9"][i - c] >= data["avg12"][i - c]): - vaild = False - break - if vaild: - if data["avg3"][i] < data["avg12"][i]: - sell = data["close"][i] - weight = 1 - return sell, weight, type - - return sell, weight, type - - def getBuyPriceAndWeight_122630(self, data, i): - buy, weight, type = -1, -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 i > START_TIME_INDEX: - # 매수 분석 - - param = 1 - if (data["macd"][i] < -8.532976905 and data["macds"][i] < -5.679850674 and data["abs_avg_1"][i] > 70.48701299 * param ): - """ - if (data["diff_avg27"][i] < -1.637205387 * param and - - data["diff_avg3_avg27"][i] < -25.4455267 * param and - data["diff_avg3_avg54"][i] < -31.55964406 * param and - - data["diff_avg6_avg27"][i] < -17.45039683 * param and - data["diff_avg6_avg54"][i] < -23.56451419 * param and - - data["diff_avg9_avg27"][i] < -13.27020202 * param and - data["diff_avg9_avg54"][i] < -19.38431938 * param and - - data["diff_avg12_avg27"][i] < -10.42388167 * param and - data["diff_avg12_avg54"][i] < -16.53799904 * param and - - data["diff_change_lead1"][i] < -25.68993506 * param and - data["diff_open_lead1"][i] < -37.53246753 * param and - data["diff_close_lead1"][i] < -45.1461039 * param and - data["diff_high_lead1"][i] < -30.03246753 * param and - data["diff_low_lead1"][i] < -53.08441558 * param - ): - - buy = int((data["open"][i] + data["close"][i]) / 2) - weight = 1 - return buy, weight, type - """ - - if -30 < data["macd"][i] < -25: - valid = True - for c in range(1, 20): - if data["macd"][i-c] < -30: - valid = False - break - if valid: - buy = int((data["open"][i] + data["close"][i]) / 2) - weight = 1 - return buy, weight, type - - previous_lowest_close = 99999999 - for c in range(10, 30): - if data["close"][i-c] < previous_lowest_close: - previous_lowest_close = data["close"][i-c] - - if data["close"][i] > previous_lowest_close: - valid = True - for c in range(1, 20): - if data["macd"][i-c] < -30: - valid = False - break - if valid: - buy = int((data["open"][i] + data["close"][i]) / 2) - weight = 1 - return buy, weight, type - - - if (data["avg54"][i-4] < data["avg54"][i-3] < data["avg54"][i-2] < data["avg54"][i-1] < data["avg54"][i] and - data["avg54"][i] < min(data["avg3"][i], data["avg6"][i], data["avg9"][i], data["avg12"][i], data["avg27"][i]) and - data["avg54"][i] < data["avg27"][i] < data["avg12"][i] < data["avg9"][i] < data["avg6"][i] < data["avg3"][i] and - max(data["avg3"][i], data["avg6"][i], data["avg9"][i], data["avg12"][i], data["avg27"][i]) - min(data["avg3"][i], data["avg6"][i], data["avg9"][i], data["avg12"][i], data["avg27"][i]) < 5 - ): - buy = data["close"][i] - weight = 1 - return buy, weight, type - - - - if (data["avg54"][i-4] < data["avg54"][i-3] < data["avg54"][i-2] < data["avg54"][i-1] < data["avg54"][i] and - data["avg54"][i-7] < data["avg3"][i-7] < data["avg6"][i-7] < data["avg9"][i-7] < data["avg12"][i-7] and - data["avg54"][i] < data["avg12"][i] < data["avg9"][i] < data["avg6"][i] < data["avg3"][i] - ): - if data['macd'][i] < -5: - buy = data["close"][i] - weight = 1 - return buy, weight, type - - return buy, weight, type - - - def getSellPriceAndWeight_122630(self, data, i): - sell, weight, type = -1, -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 i > START_TIME_INDEX: - # 매수 분석 - - # 3분선이 10분 이상 6분선 위에 있다가 5분선 아래로 내려옴 - if i >= 381 + 10: - 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 and count < 3: - if data["avg3"][i] < data["avg6"][i]: - sell = int(data["avg3"][i] - data["avg3"][i]%5) - weight = 1 - return sell, weight, type - - # 3분선이 5분 이상 12분선 위에 있다가 12분선 아래로 내려옴 - if i >= 381 + 5: - vaild = True - for c in range(1, 6): - if not (data["avg3"][i - c] >= data["avg6"][i - c] >= data["avg9"][i - c] >= data["avg12"][i - c]): - vaild = False - break - if vaild: - if data["avg3"][i] < data["avg12"][i]: - sell = data["close"][i] - weight = 1 - return sell, weight, type - - 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 - - data["diff_avg6_avg27"][i] > 22.49801587 * param and - data["diff_avg6_avg54"][i] > 34.50462963 * param and - - data["diff_avg9_avg27"][i] > 17.6984127 * param and - data["diff_avg9_avg54"][i] > 29.70502646 * param and - - data["diff_avg12_avg27"][i] > 13.59920635 * param and - data["diff_avg12_avg54"][i] > 25.60582011 * param and - - 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 - - data["diff_upper_lower"][i] < 70.63330362 * param + 124.7189534 / 3 and - data["diff_change_base"][i] > 16.73214286 * param and - - 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 - ): - sell = int((data["open"][i] + data["close"][i]) / 2) - weight = 1 - return sell, weight, type - - return sell, weight, type - def analyze(self, result): # 기본 캔들 정보 open = result["open"] @@ -551,6 +240,7 @@ class BuySellChecker: ichimokuCloud_df = ichimokuCloud_df[:len(ichimokuCloud_df) - 51] changeLine = ichimokuCloud_df['changeLine'].values.tolist() baseLine = ichimokuCloud_df['baseLine'].values.tolist() + laggingSpan = ichimokuCloud_df['laggingSpan'].values.tolist() leadingSpan1 = ichimokuCloud_df['leadingSpan1'].values.tolist() leadingSpan2 = ichimokuCloud_df['leadingSpan2'].values.tolist() @@ -563,7 +253,7 @@ class BuySellChecker: "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, + "changeLine": changeLine, "baseLine": baseLine, "laggingSpan": laggingSpan, "leadingSpan1": leadingSpan1, "leadingSpan2": leadingSpan2, "label": label } @@ -982,20 +672,19 @@ class BuySellChecker: buy, buy_weight, buy_type = self.getBuyPriceAndWeight(data, last_index) sell, sell_weight, sell_type = self.getSellPriceAndWeight(data, last_index) - if buy_type == 1: - self.buy_type = 1 - if buy_type == 0 or sell_type == 1: - self.buy_type = -1 - - if self.buy_type == 1: - bsLine['buy'] = [buy] - bsLine['buy_weight'] = [buy_weight] - else: - bsLine['buy'] = [-1] - bsLine['buy_weight'] = [-1] + 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 + 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)] @@ -1007,21 +696,20 @@ class BuySellChecker: buy, buy_weight, buy_type = self.getBuyPriceAndWeight(data, i) sell, sell_weight, sell_type = self.getSellPriceAndWeight(data, i) - if buy_type == 1: - self.buy_type = 1 - if buy_type == 0 or sell_type == 1: - self.buy_type = -1 - - if self.buy_type == 1: - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = buy_weight - else: - bsLine['buy'][i] = -1 - bsLine['buy_weight'][i] = -1 + 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 + 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 diff --git a/stock/analysis/IchimokuCloud.py b/stock/analysis/IchimokuCloud.py index 8d811f1..23de620 100644 --- a/stock/analysis/IchimokuCloud.py +++ b/stock/analysis/IchimokuCloud.py @@ -26,14 +26,18 @@ class IchimokuCloud: # 당일을 포함한 26일 동안의 최고가와 최저가의 중간 값을 평균으로 나타낸다. baseLine = (df.high.rolling(b).max() + df.low.rolling(b).min()) / 2 - # 3. 선행스팬 1 = ((기준선 + 전환선) / 2)를 26일 선행하여 배치 + # 3. 후행스팬 = 현재 close가격의 26일전 반영 + laggingSpan = [df.close.values[i+26] for i in range(len(df.close)-26)] + laggingSpan += [df.close.values[len(df.close)-1] for i in range(26)] + + # 4. 선행스팬 1 = ((기준선 + 전환선) / 2)를 26일 선행하여 배치 # 전환선과 기준선의 평균값을 구해 당일 포함 26일 앞으로 이동시킨 선 (중-단기 구간의 힘을 보여줌) leadingSpan1 = (changeLine + baseLine) / 2 move_LeadingSpan1 = list(leadingSpan1.values) for i in range(b - 1): move_LeadingSpan1.insert(0, None) - # 4. 선행스팬 2 = ((최근 52일 동안 최고가 + 최저가) / 2)를 26일 선행하여 배치 + # 5. 선행스팬 2 = ((최근 52일 동안 최고가 + 최저가) / 2)를 26일 선행하여 배치 # 당일을 포함한 52일 동안의 최고가와 최저가의 평균을 26일 앞으로 이동시킨 선 (장기으로 형성된 선이기 때문에 가장 느리게 변함) leadingSpan2 = (df.high.rolling(l).max() + df.low.rolling(l).min()) / 2 move_LeadingSpan2 = list(leadingSpan2.values) @@ -70,7 +74,7 @@ class IchimokuCloud: move_LeadingSpan1.append(None) # dataframe에 컬럼 추가 - df = df.assign(changeLine=pd.Series(move_changeLine), baseLine=pd.Series(move_baseLine), leadingSpan1=pd.Series(move_LeadingSpan1), leadingSpan2=pd.Series(move_LeadingSpan2)) + df = df.assign(changeLine=pd.Series(move_changeLine), baseLine=pd.Series(move_baseLine), laggingSpan=pd.Series(laggingSpan), leadingSpan1=pd.Series(move_LeadingSpan1), leadingSpan2=pd.Series(move_LeadingSpan2)) return df @@ -98,7 +102,11 @@ class IchimokuCloud: stock['PRICE'][i]['ichimokucloud_baseLine'] = df.baseLine.values[i] stock['PRICE'][i]['ichimokucloud_leadingSpan1'] = df.leadingSpan1.values[i] stock['PRICE'][i]['ichimokucloud_leadingSpan2'] = df.leadingSpan2.values[i] - + for i in range(len(df.changeLine)-diff): + if i < len(df.changeLine)-diff-26: + stock['PRICE'][i]['ichimokucloud_laggingSpan'] = stock['PRICE']['close'][i + 26] + else: + stock['PRICE'][i]['ichimokucloud_laggingSpan'] = -1 return