diff --git a/Simulation.py b/Simulation.py index ab9d751..c13a4bf 100644 --- a/Simulation.py +++ b/Simulation.py @@ -9,29 +9,18 @@ from hts.HTS import HTS from stock.util.Stock2Vector import Stock2Vector from stock.util.LabelChecker import LabelChecker -from hts.BuySellChecker_122630 import BuySellChecker_122630 -from hts.BuySellChecker_233740 import BuySellChecker_233740 -from hts.BuySellChecker_251340 import BuySellChecker_251340 -from hts.BuySellChecker_252670 import BuySellChecker_252670 +from hts.BuySellChecker import BuySellChecker class Simulation (HTS): stock2Vector = None buySellChecker = None - def __init__(self, RESOURCE_PATH, stock_code): + def __init__(self, RESOURCE_PATH): super().__init__(RESOURCE_PATH) self.RESOURCE_PATH = RESOURCE_PATH - self.buySellChecker = None - if stock_code == '122630': - self.buySellChecker = BuySellChecker_122630() - elif stock_code == '233740': - self.buySellChecker = BuySellChecker_233740() - elif stock_code == '251340': - self.buySellChecker = BuySellChecker_251340() - elif stock_code == '252670': - self.buySellChecker = BuySellChecker_252670() + self.buySellChecker = BuySellChecker() try: self.stock2Vector = Stock2Vector(RESOURCE_PATH) @@ -230,25 +219,6 @@ class Simulation (HTS): return result - def getLIMITInfo(self, stock_code, ymd, dbfile_name="stock.db"): - conn = sqlite3.connect(os.path.join(self.RESOURCE_PATH, dbfile_name)) - cursor = conn.cursor() - - cursor.execute('select ymd, open, close, high, low, volume from stock where code=? order by ymd desc limit ?', (stock_code, 100, )) - db_result = cursor.fetchall() - cursor.close() - conn.close() - - match = False - LIMIT_PRICE = [] - for i, rows in enumerate(db_result): - if rows[0].replace('.', '') <= ymd: - match = True - if match: - LIMIT_PRICE.append(rows[2]) - - return {'LIMIT_PRICE': sum(LIMIT_PRICE[:20])/len(LIMIT_PRICE[:20])} - def simulate(self, stock, analyzed_day=1000): stock_code = stock['code'] for ymd in stock['ymd']: @@ -275,11 +245,9 @@ class Simulation (HTS): # 사야 할 시점과 팔아야 할 시점을 체크한다. #bsLine = self.buySellChecker.checkTransaction(stock_code, data, data_5, data_30, isRealTime=False) - INFO = self.getLIMITInfo(stock_code, ymd) - # 어제 데이터는 지운다. #data = data.loc[pd.DatetimeIndex(data.index).day == int(given_day[6:])] - bsLine = self.buySellChecker.checkTransaction(stock_code, data, INFO, isRealTime=False) + bsLine = self.buySellChecker.checkTransaction(data, isRealTime=False) # 그래프를 그린다. self.draw(stock_code, ymd, data, bsLine) @@ -291,23 +259,15 @@ if __name__ == "__main__": RESOURCE_PATH = os.path.join(PROJECT_HOME, "resources") #day_list = ['20231016', '20231017', '20231018', '20231019', '20231020', '20231023', '20231024', '20231025', '20231026', '20231027', '20231030', '20231031', '20231101', '20231102'] - day_list = ['20231102'] - - # to check bying - stock = {'code': '252670', 'name': 'KODEX 200선물인버스2X', 'ymd': day_list} - simulation = Simulation(RESOURCE_PATH, stock['code']) - simulation.simulate(stock) - - #stock = {'code': '122630', 'name': 'KODEX 레버리지', 'ymd': day_list} - #simulation = Simulation(RESOURCE_PATH, stock['code']) - #simulation.simulate(stock) - - #stock = {'code': '233740', 'name': 'KODEX 코스닥150레버리지', 'ymd': day_list} - #simulation = Simulation(RESOURCE_PATH, stock['code']) - #simulation.simulate(stock) - - #stock = {'code': '251340', 'name': 'KODEX 코스닥150선물인버스', 'ymd': day_list} - #simulation = Simulation(RESOURCE_PATH, stock['code']) - #simulation.simulate(stock) + day_list = ['20231113'] + stocks = [ + {'code': '252670', 'name': 'KODEX 200선물인버스2X', 'ymd': day_list}, + {'code': '122630', 'name': 'KODEX 레버리지', 'ymd': day_list}, + {'code': '233740', 'name': 'KODEX 코스닥150레버리지', 'ymd': day_list}, + {'code': '251340', 'name': 'KODEX 코스닥150선물인버스', 'ymd': day_list} + ] + for stock in stocks: + simulation = Simulation(RESOURCE_PATH) + simulation.simulate(stock) print ("done...") diff --git a/hts/BuySellChecker.py b/hts/BuySellChecker.py index 8b40056..ada3f1e 100644 --- a/hts/BuySellChecker.py +++ b/hts/BuySellChecker.py @@ -1,6 +1,5 @@ import pandas as pd -from datetime import datetime from stock.analysis.Common import Common from stock.analysis.Stochastic import Stochastic from stock.analysis.RSI import RSI @@ -28,257 +27,166 @@ class BuySellChecker: return - def isYangbong(self, data, i): - if data['close'][i] > data['open'][i]: - return True - else: - if data['low'][i] < data['close'][i] == data['open'][i] == data['high'][i]: - return True - if data['low'][i] < data['open'][i] == data['close'][i] < data['high'][i]: - return True - return False + def getBuyPriceAndWeight(self, i, data): + buy, weight, type = -1, -1, "" - def isUmbong(self, data, i): - if data['close'][i] < data['open'][i]: - return True - else: - if data['low'][i] == data['close'][i] == data['open'][i] < data['high'][i]: - return True - if data['low'][i] < data['open'][i] == data['close'][i] < data['high'][i]: - return True - return False - - # 지난 1시간 30분 동안 12분 선이 20분 선위에 20분 이상 있었는지 체크 - def check_12_over_20_for_30(self, data, i, default=90): - if i - default < 381: - return False - - check_12_over_20_for_30 = False - for c in range(i - default, i - 20): - if data['avg20'][c] < data['avg20'][i]: - value = [1 if data['avg20'][d] < data['avg12'][d] else 0 for d in range(c, c + 20)] - if len(value) == 20 and sum(value) == 20: - check_12_over_20_for_30 = True - break - return check_12_over_20_for_30 - - # 지난 1시간 동안 3, 6, 9, 12분 선이 10분 이상 20분 선 아래 있었는지 체크 - def check_under_20_for_10(self, data, i, within=60, during=10): - if i - within < 381: - return False - - check_under_20_for_10 = False - for c in range(i - within, i - during): - value = [ - 1 if max(data['avg3'][d], data['avg6'][d], data['avg9'][d], data['avg12'][d]) < data['avg20'][d] else 0 - for d in range(c, c + during)] - if len(value) == during and sum(value) == during: - check_under_20_for_10 = True - break - return check_under_20_for_10 - - def max_min_avg(self, data, i): - return max(data['avg3'][i], data['avg6'][i], data['avg9'][i], data['avg12'][i], data['avg20'][i]) - min( - data['avg3'][i], data['avg6'][i], data['avg9'][i], data['avg12'][i], data['avg20'][i]) - - def check_inverse_arrangement_before(self, data, i, within=30, during=5): - if i - within < 381: - return False - - inverse_arrangement = False - for c in range(i - within, i - during): - value = [ - 1 if data['avg3'][d] < data['avg6'][d] < data['avg9'][d] < data['avg12'][d] < data['avg20'][d] else 0 - for d in range(c, c + during)] - if len(value) == during and sum(value) == during - 1: - inverse_arrangement = True - 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 isAvg200UP(self, data, idx, until=10, limit=0.9): - even, up, down = 0, 0, 0 - for i in range(idx, idx - (until + 1), -1): - if data['avg200'][i] < data['close'][i]: - up += 1 - if data['avg200'][i] > data['close'][i]: - down += 1 - else: - even += 1 - if up * (1 - limit) > down: - return True - return False - - - """ - def getBuyPriceAndWeight_122630(self, i, data): - buy, weight = -1, -1 - - if i > 200: - if ( - ( - min(data['avg200'][i-53: i-48]) > min(data['avg200'][i-48: i-43]) > - min(data['avg200'][i-43: i-38]) > min(data['avg200'][i-38: i-33]) > - min(data['avg200'][i-33: i-28]) > min(data['avg200'][i-28: i-23]) > - min(data['avg200'][i-23: i-18]) > min(data['avg200'][i-18: i-13]) > - min(data['avg200'][i-13: i-8]) > min(data['avg200'][i-8: i-3]) > - data['avg200'][i-3] - ) and - data['avg200'][i-3] < min(data['avg200'][i-2:i]) - ): - if data['close'][i] < data['close'][i-30]: - buy = data['close'][i] - weight = 0.2 - - if ( - ( - min(data['avg200'][i-103: i-93]) >= min(data['avg200'][i-93: i-83]) >= - min(data['avg200'][i-83: i-73]) >= min(data['avg200'][i-73: i-63]) >= - min(data['avg200'][i-63: i-53]) >= min(data['avg200'][i-53: i-43]) >= - min(data['avg200'][i-43: i-33]) >= min(data['avg200'][i-33: i-23]) > - min(data['avg200'][i-23: i-13]) > min(data['avg200'][i-13: i-3]) > - data['avg200'][i-3] - ) and - ( - max(data['avg200'][i - 103: i - 93]) - min(data['avg200'][i - 93: i - 83]) > - max(data['avg200'][i - 83: i - 73]) - min(data['avg200'][i - 73: i - 63]) > - max(data['avg200'][i - 63: i - 53]) - min(data['avg200'][i - 53: i - 43]) > - max(data['avg200'][i - 43: i - 33]) - min(data['avg200'][i - 33: i - 23]) > - max(data['avg200'][i - 23: i - 13]) - min(data['avg200'][i - 13: i - 3]) - ) and - data['avg200'][i-3] < min(data['avg200'][i-2:i]) - ): - if 25 < max(data['macd'][i-50: i-20]) and data['close'][i] < data['close'][i - 30]: - if data['slow_k'][i - 1] < data['slow_k'][i] and data['slow_k'][i] < 50 and data['macd'][i-1] < data['macd'][i]: + """ + # 매수전략 #1: 다이버전스 + if data['macd'][i] < 0 and data['open'][i] < data['close'][i]: + if 0 < len(data['rsi'].tolist()[i - 10:i - 5]): + if min(data['rsi'].tolist()[i - 10:i - 5]) < data['rsi'][i - 1]: + if data['low'][i - 1] < min(data['low'].tolist()[i - 10:i - 5]): + weight = 1 buy = data['close'][i] - weight = 0.2 + type = 'Divergence' + """ - if 25 < max(data['macd'][i-50: i-20]) and min(data['macd'][i-20: i]) < -30 and 0 < data['macd'][i] < 3: - if data['slow_k'][i - 1] < data['slow_k'][i] and data['slow_k'][i] < 50 and data['macd'][i-1] < data['macd'][i]: - buy = data['close'][i]+5 - weight = 0.2 + high_barrier = 70 + low_barrier = 30 + Buy_Price=[] + Sell_Price=[] + number=[] + temp01 = [] + temp01_id = [] + temp02 = [] + temp01_id = [] + temp01_min_price = [] + temp02_min_price = [] + temp01_min_rsi = [] + temp02_min_rsi = [] + n_id=[] + i_id=[] + flag=1 + n = 0 - if 25 < max(data['macd'][i-50: i-20]) and data['macd'][i] < -20 and data['macd'][i-1] < data['macd'][i]: - if data['slow_k'][i - 1] < data['slow_k'][i] and data['slow_k'][i] < 50 and data['macd'][i-1] < data['macd'][i]: - buy = data['close'][i]+5 - weight = 0.2 + # https://superhky.tistory.com/441 + find = False + for c in range(i-40, i-1): + if data['rsi'][i-1] > low_barrier and data['rsi'][i] < low_barrier: + for k in range(c, i): + if data['rsi'][k-1] < low_barrier and data['rsi'][k] > low_barrier: + temp01 = data['rsi'].iloc[c:k] + temp01_id = temp01.argmin() + c + temp01_min_rsi = data['rsi'][temp01_id] + temp01_min_price = data['close'][temp01_id] - if 0.00988 < data['disparity_avg5'][i] - data['disparity_avg200'][i]: - if 25 < max(data['macd'][i-50: i-20]) and data['slow_k'][i - 1] < data['slow_k'][i] and data['slow_k'][i] < 50 and data['macd'][i-1] < data['macd'][i]: - buy = data['close'][i] + 10 - weight = 0.2 - return buy, weight + for m in range(k, i): + if data['rsi'][m-1] < low_barrier and data['rsi'][m] < low_barrier: + for n in range(m, i): + if data['rsi]'][n-1] < low_barrier and data['rsi'][n] < low_barrier: + temp02 = data['rsi'].iloc[m:n] + temp02_id = temp02.argmin() + m + temp02_min_rsi = data['rsi'][temp02_id] + temp02_min_price = data['close'][temp02_id] + if temp01_min_rsi < temp02_min_rsi and temp01_min_price > temp02_min_price and flag == 1: + if c == i-1: + weight = 1 + buy = data['close'][i] + type = 'Divergence' + find = True + break + if find: break + if find: break + if find: break + """ + # 매수전략 #3: stochastic + rsi + macd + check = False + if data['slow_k'][i - 1] < data['slow_k'][i] and data['slow_d'][i] < data['slow_k'][i]: - def getBuyPriceAndWeight_252670(self, i, data): - buy, weight = -1, -1 - - if i > 50: - up, down = 0, 0 - for idx in range(i, i - (300 + 1), -1): - if data['avg200'][idx-1] < data['avg200'][idx]: - up += 1 - if data['avg200'][idx-1] > data['avg200'][idx]: - down += 1 - if up < down: - if max(data['avg200'][i-20:i])+0.05 < data['avg200'][i]: - buy = data['close'][i] - weight = 0.3 - - up, down = 0, 0 - for idx in range(i, i - (10 + 1), -1): - if data['close'][idx-1] < data['close'][idx]: - up += 1 - elif data['close'][idx - 1] > data['close'][idx]: - down += 1 - if down < up: - buy, weight = -1, -1 - - if data['close'][i] < data['avg200'][i] or data['avg200'][i] + 10 < data['close'][i]: - buy, weight = -1, -1 - - if 2 < data['macd'][i]: - buy, weight = -1, -1 - - return buy, weight - - def getBuyPriceAndWeight(self, stock_code, i, data): - buy, weight = -1, -1 - - if i > 50: - - if stock_code == '233740': - if data['macd'][i-2] < 0 and 0 < data['macd'][i-1] and 0 < data['macd'][i]: - if data['volume'][i - 2] < data['volume'][i - 1] < data['volume'][i]: - if min(data['macd'][i-30:i].tolist()) < -50: - buy, weight = data['close'][i], 1 - - if min(data['macd'][i-5:i].tolist()) < min(data['macd'][i-15:i-10].tolist()) < -50: - if -50 < max(data['macd'][i-15:i-7].tolist()): - buy, weight = data['close'][i], 1 - - elif stock_code == '122630': - if data['macd'][i - 2] < 0 and 0 < data['macd'][i - 1] and 0 < data['macd'][i]: - if data['volume'][i - 2] < data['volume'][i - 1] < data['volume'][i]: - if min(data['macd'][i - 30:i].tolist()) < -25: - buy, weight = data['close'][i], 1 - - if min(data['macd'][i-5:i].tolist()) < min(data['macd'][i - 15:i - 10].tolist()) < -30: - if -20 < max(data['macd'][i - 15:i - 7].tolist()): - buy, weight = data['close'][i], 1 - - - elif stock_code == '252670': - if min(data['macd'][i - 40:i - 20].tolist()) < -5 < data['macd'][i]: - if data['close'][i] < min(data['close'][i - 40:i - 20].tolist()): - buy, weight = data['close'][i], 1 - elif stock_code == '251340': - if min(data['macd'][i-40:i-20].tolist()) < -20 < data['macd'][i]: - if data['close'][i] < min(data['close'][i-40:i-20].tolist()): - buy, weight = data['close'][i], 1 - - return buy, weight - - def getSellPriceAndWeight(self, stock_code, i, data): - sell, weight = -1, -1 - - # 1) 스토캐스틱 과매수 - slow_k_sell = False - for idx in range(i, i-10, -1): - if data['slow_k'][idx] > 80: - slow_k_sell = True - break - - # 2) macd 교차 신호 - macd_sell = False - if slow_k_sell: - for idx in range(i, i-10, -1): - if data['macd'][idx - 1] > 0 and data['macds'][idx - 1] > 0 and data['macd'][idx] > 0 and data['macds'][idx] > 0: - if data['macd'][idx-1] > data['macds'][idx-1] and data['macd'][idx] < data['macds'][idx]: - macd_sell = True + # 과매도 체크 + index = -1 + for c in range(i - 40, i): + if data['slow_k'][i] < 20: + index = c + check = True + if check: + # 과매도 후 과매수 였는지 체크 + check = False + for d in range(index, i): + if 80 < data['slow_k'][d]: + check = True break + if not check: + # 과매도 후 과매수가 아니라면 + if data['rsi'][i - 1] < 50 and 50 < data['rsi'][i]: + if data['macds'][i] < data['macd'][i] < 0: + weight = 1 + buy = data['close'][i] + type = 'S+R+M' + """ + return buy, weight, type - # 3) RSI 지수가 50위로 올라갈 때 - if macd_sell: - if data['rsi'][i-1] > 60 and data['rsi'][i] < 60: - sell, weight = data['close'][i], 1 - return sell, weight - """ + def getSellPriceAndWeight(self, i, data): + sell, weight, type = -1, -1, "" + + max_value = max(data['macd'].tolist()) * 0.8 + if (max_value < data['macd'][i] or 1.9 < data['macds'][i]) and (0 < data['macdo'][i-1] and data['macdo'][i] <= 0): + #if data['macds'][i-1] < data['macd'][i-1] and data['macd'][i] < data['macds'][i]: + weight = 1 + sell = data['close'][i] + type = 'method1' + + # 매수전략 #2: RSI 과매수에서 데드크로스 + if (data['macds'][i - 1] < data['macd'][i - 1] and data['macd'][i] < data['macds'][i]): + if 70 < data['rsi'][i]: + weight = 1 + sell = data['close'][i] + type = 'method2' + + + return sell, weight, type + + def checkTransaction(self, data, isRealTime=True): + # 어제 오늘 데이터로 분석 + bsLine = {} + + if data is not None and 'close' in data.columns: + size = len(data["close"]) + if isRealTime: + + # isRealTime=True, 실시간 적용 + last_index = size - 1 + + buy, buy_weight, buy_type = self.getBuyPriceAndWeight(last_index, data) + sell, sell_weight, sell_type = self.getSellPriceAndWeight(last_index, data) + + bsLine['buy'] = [buy] + bsLine['buy_weight'] = [buy_weight] + bsLine['buy_type'] = [buy_type] + bsLine['sell'] = [sell] + bsLine['sell_weight'] = [sell_weight] + bsLine['sell_type'] = [sell_type] + + else: + # Type=False, 시뮬레이션 적용 + bsLine['buy'] = [-1 for i in range(size)] + bsLine['buy_weight'] = [-1 for i in range(size)] + bsLine['buy_type'] = ['' for i in range(size)] + bsLine['sell'] = [-1 for i in range(size)] + bsLine['sell_weight'] = [-1 for i in range(size)] + bsLine['sell_type'] = ['' for i in range(size)] + + for last_index in range(size): + buy, buy_weight, buy_type = self.getBuyPriceAndWeight(last_index, data) + sell, sell_weight, sell_type = self.getSellPriceAndWeight(last_index, data) + bsLine['buy'][last_index] = buy + bsLine['buy_weight'][last_index] = buy_weight + bsLine['buy_type'][last_index] = buy_type + + bsLine['sell'][last_index] = sell + bsLine['sell_weight'][last_index] = sell_weight + bsLine['sell_type'][last_index] = sell_type + else: + bsLine['buy'] = [-1] + bsLine['buy_weight'] = [-1] + bsLine['buy_type'] = [''] + bsLine['sell'] = [-1] + bsLine['sell_weight'] = [-1] + bsLine['sell_type'] = [''] + + return bsLine def analyze(self, result): @@ -388,474 +296,3 @@ class BuySellChecker: data = data.fillna(-1) return data - - """ - def checkTransaction(self, stock_code, data, data_5=None, data_30=None, isRealTime=True): - # 어제 오늘 데이터로 분석 - bsLine = {} - - size = len(data["close"]) - - if isRealTime: - - # isRealTime=True, 실시간 적용 - last_index = size - 1 - - buy, buy_weight = self.getBuyPriceAndWeight(stock_code, last_index, data) - #sell, sell_weight = self.getSellPriceAndWeight(stock_code, last_index, data) - sell, sell_weight = -1, -1 - if data.index[last_index].strftime('%H:%M:%S') > datetime.strptime(datetime.today().strftime("%Y-%m-%d 15:10:00"), "%Y-%m-%d %H:%M:%S").strftime('%H:%M:%S'): - buy, buy_weight = -1, -1 - - bsLine['buy'] = [buy] - bsLine['buy_weight'] = [buy_weight] - bsLine['sell'] = [sell] - bsLine['sell_weight'] = [sell_weight] - - else: - # Type=False, 시뮬레이션 적용 - bsLine['buy'] = [-1 for i in range(size)] - bsLine['buy_weight'] = [-1 for i in range(size)] - bsLine['sell'] = [-1 for i in range(size)] - bsLine['sell_weight'] = [-1 for i in range(size)] - - for last_index in range(size): - - buy, buy_weight = self.getBuyPriceAndWeight(stock_code, last_index, data) - sell, sell_weight = self.getSellPriceAndWeight(stock_code, last_index, data) - - bsLine['buy'][last_index] = buy - bsLine['buy_weight'][last_index] = buy_weight - bsLine['sell'][last_index] = sell - bsLine['sell_weight'][last_index] = sell_weight - - return bsLine - - """ - - - # middle line에 맞다은 적 없이, low line에 붙었거나 아래에 있었던 캔들의 높은 가격을 얻어옴 - def getPrice_UnderLowWithoutMiddle(self, last_index, data): - if data['high'][last_index] < data['envelope_middle'][last_index]: - for i in range(last_index - 1, 0, -1): - if data['high'][i] > data['envelope_middle'][i]: - return -1, -1 - if data['low'][i] < data['envelope_lower'][i]: - return i, max(data['open'][i], data['close'][i]) - return -1, -1 - - def getBuyPriceAndWeight_Envelope(self, i, data): - buy, weight = -1, -1 - - """ - # middle line에 맞다은 적 없이, low line에 붙었거나 아래에 있었던 캔들의 높은 가격을 얻어옴 - index, price = self.getPrice_UnderLowWithoutMiddle(i, data) - if price > -1: - # 해당 가격보다 높은 가격이면 매수한다 - if price < data['close'][i]: - buy = data['close'][i] - weight = 10 - """ - if i > 100: - if -0.004 < data['gradient1'][i] < 0.001: - # if data['high'][i] < data['envelope_middle'][i]: - if data['slow_k'][i] < 20: - buy = data['close'][i] - weight = 10 - - """ - if i > 100: - if min(data['gradient1'][i-5:i]) < -0.009 and -0.009 < data['gradient1'][i]: - if data['high'][i] < data['envelope_middle'][i]: - buy = data['close'][i] - weight = 10 - """ - return buy, weight - - def getSellPriceAndWeight_Envelope(self, data, i): - sell, weight, type = -1, -1, -1 - - if data.index[i].strftime("%Y.%m.%d") == "2022.12.01": - print(1) - - # upper lined에서 처리 - if data['close'][i - 1] < data['envelope_upper'][i - 1] and data['envelope_upper'][i] < data['close'][i]: - if data['slow_d'][i - 1] <= data['slow_k'][i - 1] and data['slow_k'][i] <= data['slow_d'][i]: - sell = data["close"][i] - weight = 1 - type = 1 - if data['envelope_upper'][i - 1] < data['close'][i - 1] and data['envelope_upper'][i] < data['close'][i]: - if data['slow_d'][i - 1] <= data['slow_k'][i - 1] and data['slow_k'][i] <= data['slow_d'][i]: - sell = data["close"][i] - weight = 1 - type = 2 - if data['envelope_upper'][i - 1] < data['close'][i - 1] and data['envelope_upper'][i] < data['close'][i]: - if data['slow_d'][i - 1] + 2 <= data['slow_k'][i - 1] and data['slow_d'][i] + 1 == data['slow_k'][i]: - sell = data["close"][i] - weight = 1 - type = 3 - - if data['envelope_upper'][i] < data['high'][i] and data['open'][i] < data['close'][i]: - if data['close'][i] - data['open'][i] < data['high'][i] - data['close'][i]: - sell = data["close"][i] - weight = 1 - type = 4 - - return sell, weight, type - - # 팔아야 할 시점을 체크하기 위함 - # 이전에 산 가격보다 지금 5원이상 떨어졌다면 매도 한다. - def checkBelow5WonFromPreviousBuyPrice(self, last_index, data, price): - for i in range(last_index - 1, 0, -1): - if data['sell'][i] != -1: - return False - if data['buy'][i] != -1: - if data['buy'][i] - price > 5: - return True - return - - def checkWithEnvelope_252670(self, data, isRealTime=False): - - bsLine = {} - size = len(data["close"]) - - bsLine['buy'] = [-1 for i in range(size)] - bsLine['buy_weight'] = [-1.0 for i in range(size)] - bsLine['sell'] = [-1 for i in range(size)] - bsLine['sell_weight'] = [-1.0 for i in range(size)] - - for i in range(size): - if isRealTime: - if i < size - 1: - continue - - """ - # 이전에 산 가격보다 지금 5원이상 떨어졌다면 매도 한다. - price = data['close'][i] if data['close'][i] >= data['open'][i] else data['open'][i] - if self.checkBelow5WonFromPreviousBuyPrice(i, data, price): - data['sell'][i] = price - bsLine['sell'][i] = price - bsLine['sell_weight'][i] = 50 - return bsLine, data - """ - - """ - # middle line에 맞다은 적 없이, low line에 붙었거나 아래에 있었던 캔들의 높은 가격을 얻어옴 - buy, buy_weight = self.getBuyPriceAndWeight_Envelope(i, data) - data['buy'][i] = buy - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = buy_weight - return bsLine, data - """ - - if 0 < data['gradients_avg60'][i] < 0.001: - if data['high'][i] < data['envelope_middle'][i]: - if -0.015 < data['gradients_avg5'][i] and -0.007 < data['gradients_avg20'][i]: - buy = data['low'][i] - data['buy'][i] = buy - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = 20.0 - - if i > 10: - if ( - data['gradients_avg60'][i - 10] > 0 and data['gradients_avg60'][i - 9] > 0 and - data['gradients_avg60'][i - 8] > 0 and - data['gradients_avg60'][i - 7] > 0 and data['gradients_avg60'][i - 6] > 0 and - data['gradients_avg60'][i - 5] > 0 and - data['gradients_avg60'][i - 4] > 0 and data['gradients_avg60'][i - 3] > 0 and - data['gradients_avg60'][i - 2] > 0 and - data['gradients_avg60'][i - 1] > 0 and data['gradients_avg60'][i] < 0 - ): - if data['disparity'][i] < 3: - buy = data['low'][i] - data['buy'][i] = buy - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = 20.0 - - if data['disparity_avg60'][i] < 65: - buy = data['low'][i] - data['buy'][i] = buy - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = 15.0 - - if data['slow_k'][i] < 3: - buy = data['low'][i] - data['buy'][i] = buy - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = 10.0 - - if not (data['avg120'][i - 1] < data['avg60'][i - 1] < data['avg20'][i - 1] < data['avg5'][i - 1]) and (data['avg120'][i] < data['avg60'][i] < data['avg20'][i] < data['avg5'][i]): - buy = data['low'][i] - data['buy'][i] = buy - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = 20.0 - - return bsLine, data - - def checkWithEnvelope_122630(self, data, isRealTime=False): - - bsLine = {} - size = len(data["close"]) - - bsLine['buy'] = [-1 for i in range(size)] - bsLine['buy_weight'] = [-1.0 for i in range(size)] - bsLine['sell'] = [-1 for i in range(size)] - bsLine['sell_weight'] = [-1.0 for i in range(size)] - - for i in range(size): - if isRealTime: - if i < size - 1: - continue - - if i > 10: - if data['disparity_avg60'][i] < 60: - buy = data['low'][i] - data['buy'][i] = buy - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = 20.0 - - if data['macd'][i] < -1000: - buy = data['low'][i] - data['buy'][i] = buy - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = 20.0 - - if data['slow_k'][i] < 7: - if data['slow_d'][i] < data['slow_k'][i]: - buy = data['low'][i] - data['buy'][i] = buy - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = 10.0 - - if not (data['avg120'][i - 1] < data['avg60'][i - 1] < data['avg20'][i - 1] < data['avg5'][i - 1]) and (data['avg120'][i] < data['avg60'][i] < data['avg20'][i] < data['avg5'][i]): - buy = data['low'][i] - data['buy'][i] = buy - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = 25.0 - - return bsLine, data - - def notBuy(self, data, i): - if i > 5: - check = True - for l in range(i - 4, i + 1): - if ( - data['gradients_avg60'][l - 1] > data['gradients_avg60'][l] or - data['gradients_avg20'][l - 1] > data['gradients_avg20'][l] or - data['gradients_low'][l - 1] > data['gradients_low'][l] - ): - check = False - break - if not check: - return False - return True - - def checkWithEnvelope(self, data, analyzed_day=120, isRealTime=False): - - bsLine = {} - size = len(data["close"]) - - bsLine['buy'] = [-1 for i in range(size)] - bsLine['buy_weight'] = [-1.0 for i in range(size)] - bsLine['sell'] = [-1 for i in range(size)] - bsLine['sell_weight'] = [-1.0 for i in range(size)] - - gap_interval = analyzed_day - gap_state = False - for i in range(size): - if isRealTime: - if i < size - 1: - continue - - if i > 10: - # 만약 전일 저가와 오늘 종의 차이가 1만원이 넘으면 향후 60일은 분석하지 않는다. - if data['high'][i] < int(data['low'][i - 1] * 0.7): - gap_state = True - gap_interval -= 1 - continue - if gap_state: - if gap_interval <= 0: - gap_state = False - gap_interval = 60 - else: - gap_interval -= 1 - continue - - if data['disparity'][i] < 2: - check = True - for l in range(i - 3, i): - if ( - data['gradients_avg60'][l - 1] > data['gradients_avg60'][l] or - data['gradients_avg20'][l - 1] > data['gradients_avg20'][l] or - data['gradients_low'][l - 1] > data['gradients_low'][l] or - data['disparity_avg5'][l - 1] > data['disparity_avg5'][l] or - data['disparity'][l - 1] < data['disparity'][l] - ): - check = False - break - if check and 99 < sum(data['disparity_avg5'][i - 4:i + 1]) / 5 < 100 and 99 < sum(data['disparity_avg60'][i - 4:i + 1]) / 5 < 100: - if data['slow_k'][i] < 30: - buy = data['low'][i] - data['buy'][i] = buy - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = 3.0 - - check = True - for l in range(i - 2, i): - if (data['gradients_avg60'][l - 1] > data['gradients_avg60'][l] or data['gradients_low'][l - 1] > data['gradients_low'][l]): - check = False - break - if ( - check and - -0.0011 < data['gradients_low'][i] < 0 and -0.007 < data['gradients_avg5'][i] < 0.001 and - -0.0012 < data['gradients_avg60'][i] < 0 and - 98.90 < data['disparity_avg5'][i] < 101 - ): - if data['slow_k'][i] < 30: - buy = data['low'][i] - data['buy'][i] = buy - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = 5.0 - - check = True - for l in range(i - 6, i): - if ( - data['gradients_avg60'][l - 1] < data['gradients_avg60'][l] or - data['gradients_avg20'][l - 1] < data['gradients_avg20'][l] or - data['gradients_low'][l - 1] < data['gradients_low'][l] or - -0.039 < data['gradients_low'][l - 1] < -0.35 or - -0.05 < data['gradients_avg20'][l - 1] < -0.30 or - -0.40 < data['gradients_avg60'][l - 1] < -0.30 - ): - check = False - break - if check and 99 < min(data['disparity_avg5'][i - 6:i]) < max(data['disparity_avg5'][i - 6:i]) < 101: - if data['slow_k'][i] < 30: - buy = data['low'][i] - data['buy'][i] = buy - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = 5.0 - """ - check = True - for l in range(i - 3, i): - if ( - data['gradients_low'][l - 1] < data['gradients_low'][l] or - data['gradients_avg60'][l - 1] < data['gradients_avg60'][l] or - data['gradients_avg20'][l - 1] < data['gradients_avg20'][l] or - 0.01 < data['gradients_low'][l - 1] < 0.21 or - -0.09 < data['gradients_avg20'][l - 1] < -0.002 or - 0.01 < data['gradients_avg60'][l - 1] < 0.021 - ): - check = False - break - if check: - if data['slow_k'][i] < 30: - buy = data['low'][i] - data['buy'][i] = buy - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = 5.0 - """ - - - if (data['disparity'][i] < 5 and 99.0 < data['disparity_avg60'][i] < 99.1 and - -0.009 < data['gradients_avg60'][i] < -0.008 and 0.015 < data['gradients_avg20'][i] < 0.016 and - -0.006 < data['gradients_avg5'][i] < -0.005 and -0.009 < data['gradients_low'][i] < -0.008): - check = True - for l in range(i - 5, i): - if ( - data['gradients_avg60'][l - 1] > data['gradients_avg60'][l] or - data['gradients_low'][l - 1] > data['gradients_low'][l] or - data['disparity'][l - 1] < data['disparity'][l] - ): - check = False - break - if check: - if data['slow_k'][i] < 10: - buy = data['low'][i] - data['buy'][i] = buy - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = 5.0 - - if data['macd'][i] < -4000: - if data['macd'][i - 1] < data['macd'][i]: - if not self.notBuy(data, i) and data['slow_k'][i] < 30: - if data['slow_k'][i] < 30: - buy = data['low'][i] - data['buy'][i] = buy - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = 5.0 - - # macd 이전에 없던 바닥인 경우 상승할 찰나 매수 - if data['macds'][i - 1] < min(data['macds'][:i - 1]): - if data['macds'][i - 1] < data['macds'][i]: - if not self.notBuy(data, i) and data['slow_k'][i] < 30: - buy = data['low'][i] - data['buy'][i] = buy - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = 5.0 - - if ( - 98 < data['disparity_avg5'][i] < 100 and data['disparity_avg20'][i] < 93.5 and - data['disparity_avg60'][i] < 89 and - -0.014 < data['gradients_avg60'][i] < -0.013 and -0.03 < data['gradients_avg20'][ - i] < -0.02 and -0.014 < data['gradients_low'][i] < -0.013 and - data['slow_k'][i] < 11 - ): - if not self.notBuy(data, i): - if data['slow_k'][i] < 30: - buy = data['low'][i] - data['buy'][i] = buy - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = 5.0 - - if data['slow_k'][i] < 20 and data['slow_k'][i - 1] < data['slow_d'][i - 1] and data['slow_d'][i] < data['slow_k'][i]: - if data['slow_k'][i] < 30: - buy = data['low'][i] - data['buy'][i] = buy - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = 7.0 - - if not (data['avg120'][i - 1] < data['avg60'][i - 1] < data['avg20'][i - 1] < data['avg5'][i - 1]) and (data['avg120'][i] < data['avg60'][i] < data['avg20'][i] < data['avg5'][i]): - if data['slow_k'][i] < 30: - buy = data['low'][i] - data['buy'][i] = buy - bsLine['buy'][i] = buy - bsLine['buy_weight'][i] = 10.0 - - - if data['slow_k'][i] > 75: - if (data['slow_d'][i-1] < data['slow_k'][i-1] and data['slow_k'][i] < data['slow_d'][i]): - sell = data['close'][i] - weight = 100 - data['sell'][i] = sell - bsLine['sell'][i] = sell - bsLine['sell_weight'][i] = weight - - if data['slow_k'][i] > 85: - if data['slow_k'][i] < data['slow_d'][i]: - sell = data['close'][i] - weight = 100 - data['sell'][i] = sell - bsLine['sell'][i] = sell - bsLine['sell_weight'][i] = weight - - return bsLine, data - - def checkTransactionWithEnvelope(self, data, stock_code, analyzed_day, isRealTime=False): - if isRealTime: - if stock_code == "252670": - bsLine, data = self.checkWithEnvelope_252670(data, isRealTime) - elif stock_code == "122630": - bsLine, data = self.checkWithEnvelope_122630(data, isRealTime) - else: - bsLine, data = self.checkWithEnvelope(data, analyzed_day, isRealTime) - else: - # 사야 할 시점과 팔아야 할 시점을 체크한다. - if stock_code == "252670": - bsLine, data = self.checkWithEnvelope_252670(data, isRealTime) - elif stock_code == "122630": - bsLine, data = self.checkWithEnvelope_122630(data, isRealTime) - else: - bsLine, data = self.checkWithEnvelope(data, analyzed_day, isRealTime) - - return bsLine, data diff --git a/hts/BuySellChecker_122630.py b/hts/BuySellChecker_122630.py deleted file mode 100644 index 9666f77..0000000 --- a/hts/BuySellChecker_122630.py +++ /dev/null @@ -1,128 +0,0 @@ -from hts.BuySellChecker import BuySellChecker - -class BuySellChecker_122630 (BuySellChecker): - - def __init__(self): - super().__init__() - return - - def getBuyPriceAndWeight(self, stock_code, i, data, INFO): - buy, weight, type = -1, -1, "" - - """ - #매수전략 #0: 기준선 위에서 골든크로스 - if (0 < data['macd'][i] and 0 < data['macds'][i]): - if (data['macd'][i-1] < data['macds'][i-1] and data['macds'][i] < data['macd'][i]): - canBuy = False - for c in range(1, 11): - if data['macd'][i - c] < 0: - canBuy = True - break - if canBuy: - weight = 1 - buy = data['close'][i] - type = 'method0' - """ - - # 매수전략 #1: 깊은 하락 - if (data['macd'][i]<-1000) and (data['macdo'][i-1] <= 0 and 0 < data['macdo'][i]): - if data['close'][i] < data['avg200'][i]: - weight = 0.5 - buy = data['close'][i] - type = 'method1' - - - # 매수전략 #2: RSI 과매도 이후 골든크로스 - if (data['macd'][i - 1] < data['macds'][i - 1] and data['macds'][i] < data['macd'][i]): - canBuy = False - for c in range(1, 11): - if data['rsi'][i-c] < 10: - canBuy = True - break - if canBuy: - weight = 3 - buy = data['close'][i] - type = 'method2' - - - # 매수전략 #3: 다이버전스 - if (data['macd'][i - 1] < data['macds'][i - 1] and data['macds'][i] < data['macd'][i]): - canBuy = False - index = 0 - for c in range(1, 41): - if data['macd'][i-c-1] < data['macds'][i-c-1] and data['macds'][i-c] < data['macd'][i-c]: - canBuy = True - index = c - break - if canBuy and data['rsi'][i-index] < 30: - if (data['macd'][i-index] < data['macd'][i] and - min(data['open'][i], data['close'][i]) < min(data['open'][i-index], data['close'][i-index])): - weight = 2 - buy = data['close'][i] - type = 'method3' - - return buy, weight - - def getSellPriceAndWeight(self, stock_code, i, data, INFO): - sell, weight, type = -1, -1, "" - - # 매수전략 #1: 높은 상승 - if (350 < data['macd'][i] or 300 < data['macds'][i]) and (0 < data['macdo'][i-1] and data['macdo'][i] <= 0): - #if data['macds'][i-1] < data['macd'][i-1] and data['macd'][i] < data['macds'][i]: - weight = 1 - sell = data['close'][i] - type = 'method1' - - # 매수전략 #2: RSI 과매수에서 데드크로스 - if (data['macds'][i - 1] < data['macd'][i - 1] and data['macd'][i] < data['macds'][i]): - if 80 < data['rsi'][i]: - weight = 1 - sell = data['close'][i] - type = 'method2' - - return sell, weight - - - def checkTransaction(self, stock_code, data, INFO, isRealTime=True): - # 어제 오늘 데이터로 분석 - bsLine = {} - - if data is not None and 'close' in data.columns: - size = len(data["close"]) - if isRealTime: - - # isRealTime=True, 실시간 적용 - last_index = size - 1 - - buy, buy_weight = self.getBuyPriceAndWeight(stock_code, last_index, data, INFO) - sell, sell_weight = self.getSellPriceAndWeight(stock_code, last_index, data, INFO) - - bsLine['buy'] = [buy] - bsLine['buy_weight'] = [buy_weight] - bsLine['sell'] = [sell] - bsLine['sell_weight'] = [sell_weight] - - else: - # Type=False, 시뮬레이션 적용 - bsLine['buy'] = [-1 for i in range(size)] - bsLine['buy_weight'] = [-1 for i in range(size)] - bsLine['sell'] = [-1 for i in range(size)] - bsLine['sell_weight'] = [-1 for i in range(size)] - - for last_index in range(size): - - buy, buy_weight = self.getBuyPriceAndWeight(stock_code, last_index, data, INFO) - sell, sell_weight = self.getSellPriceAndWeight(stock_code, last_index, data, INFO) - # sell, sell_weight = -1, -1 - - bsLine['buy'][last_index] = buy - bsLine['buy_weight'][last_index] = buy_weight - bsLine['sell'][last_index] = sell - bsLine['sell_weight'][last_index] = sell_weight - else: - bsLine['buy'] = [-1] - bsLine['buy_weight'] = [-1] - bsLine['sell'] = [-1] - bsLine['sell_weight'] = [-1] - - return bsLine \ No newline at end of file diff --git a/hts/BuySellChecker_233740.py b/hts/BuySellChecker_233740.py deleted file mode 100644 index 8ad9cb8..0000000 --- a/hts/BuySellChecker_233740.py +++ /dev/null @@ -1,127 +0,0 @@ -from hts.BuySellChecker import BuySellChecker - -class BuySellChecker_233740 (BuySellChecker): - - def __init__(self): - super().__init__() - return - - def getBuyPriceAndWeight(self, stock_code, i, data, INFO): - buy, weight, type = -1, -1, "" - - """ - #매수전략 #0: 기준선 위에서 골든크로스 - if (0 < data['macd'][i] and 0 < data['macds'][i]): - if (data['macd'][i-1] < data['macds'][i-1] and data['macds'][i] < data['macd'][i]): - canBuy = False - for c in range(1, 11): - if data['macd'][i - c] < 0: - canBuy = True - break - if canBuy: - weight = 1 - buy = data['close'][i] - type = 'method0' - """ - - # 매수전략 #1: 깊은 하락 - if (data['macd'][i]<-1000) and (data['macdo'][i-1] <= 0 and 0 < data['macdo'][i]): - if data['close'][i] < data['avg200'][i]: - weight = 0.5 - buy = data['close'][i] - type = 'method1' - - - # 매수전략 #2: RSI 과매도 이후 골든크로스 - if (data['macd'][i - 1] < data['macds'][i - 1] and data['macds'][i] < data['macd'][i]): - canBuy = False - for c in range(1, 11): - if data['rsi'][i-c] < 10: - canBuy = True - break - if canBuy: - weight = 3 - buy = data['close'][i] - type = 'method2' - - - # 매수전략 #3: 다이버전스 - if (data['macd'][i - 1] < data['macds'][i - 1] and data['macds'][i] < data['macd'][i]): - canBuy = False - index = 0 - for c in range(1, 41): - if data['macd'][i-c-1] < data['macds'][i-c-1] and data['macds'][i-c] < data['macd'][i-c]: - canBuy = True - index = c - break - if canBuy and data['rsi'][i-index] < 30: - if (data['macd'][i-index] < data['macd'][i] and - min(data['open'][i], data['close'][i]) < min(data['open'][i-index], data['close'][i-index])): - weight = 2 - buy = data['close'][i] - type = 'method3' - - return buy, weight - - def getSellPriceAndWeight(self, stock_code, i, data, INFO): - sell, weight, type = -1, -1, "" - - # 매수전략 #1: 높은 상승 - if (650 < data['macd'][i] or 600 < data['macds'][i]) and (0 < data['macdo'][i-1] and data['macdo'][i] <= 0): - #if data['macds'][i-1] < data['macd'][i-1] and data['macd'][i] < data['macds'][i]: - weight = 1 - sell = data['close'][i] - type = 'method1' - - # 매수전략 #2: RSI 과매수에서 데드크로스 - if (data['macds'][i - 1] < data['macd'][i - 1] and data['macd'][i] < data['macds'][i]): - if 80 < data['rsi'][i]: - weight = 1 - sell = data['close'][i] - type = 'method2' - - return sell, weight - - def checkTransaction(self, stock_code, data, INFO, isRealTime=True): - # 어제 오늘 데이터로 분석 - bsLine = {} - - if data is not None and 'close' in data.columns: - size = len(data["close"]) - if isRealTime: - - # isRealTime=True, 실시간 적용 - last_index = size - 1 - - buy, buy_weight = self.getBuyPriceAndWeight(stock_code, last_index, data, INFO) - sell, sell_weight = self.getSellPriceAndWeight(stock_code, last_index, data, INFO) - - bsLine['buy'] = [buy] - bsLine['buy_weight'] = [buy_weight] - bsLine['sell'] = [sell] - bsLine['sell_weight'] = [sell_weight] - - else: - # Type=False, 시뮬레이션 적용 - bsLine['buy'] = [-1 for i in range(size)] - bsLine['buy_weight'] = [-1 for i in range(size)] - bsLine['sell'] = [-1 for i in range(size)] - bsLine['sell_weight'] = [-1 for i in range(size)] - - for last_index in range(size): - - buy, buy_weight = self.getBuyPriceAndWeight(stock_code, last_index, data, INFO) - sell, sell_weight = self.getSellPriceAndWeight(stock_code, last_index, data, INFO) - # sell, sell_weight = -1, -1 - - bsLine['buy'][last_index] = buy - bsLine['buy_weight'][last_index] = buy_weight - bsLine['sell'][last_index] = sell - bsLine['sell_weight'][last_index] = sell_weight - else: - bsLine['buy'] = [-1] - bsLine['buy_weight'] = [-1] - bsLine['sell'] = [-1] - bsLine['sell_weight'] = [-1] - - return bsLine \ No newline at end of file diff --git a/hts/BuySellChecker_251340.py b/hts/BuySellChecker_251340.py deleted file mode 100644 index e92fb61..0000000 --- a/hts/BuySellChecker_251340.py +++ /dev/null @@ -1,127 +0,0 @@ -from hts.BuySellChecker import BuySellChecker - -class BuySellChecker_251340 (BuySellChecker): - - def __init__(self): - super().__init__() - return - - def getBuyPriceAndWeight(self, stock_code, i, data, INFO): - buy, weight, type = -1, -1, "" - - """ - #매수전략 #0: 기준선 위에서 골든크로스 - if (0 < data['macd'][i] and 0 < data['macds'][i]): - if (data['macd'][i-1] < data['macds'][i-1] and data['macds'][i] < data['macd'][i]): - canBuy = False - for c in range(1, 11): - if data['macd'][i - c] < 0: - canBuy = True - break - if canBuy: - weight = 1 - buy = data['close'][i] - type = 'method0' - """ - - # 매수전략 #1: 깊은 하락 - if (data['macd'][i]<-1000) and (data['macdo'][i-1] <= 0 and 0 < data['macdo'][i]): - if data['close'][i] < data['avg200'][i]: - weight = 0.5 - buy = data['close'][i] - type = 'method1' - - - # 매수전략 #2: RSI 과매도 이후 골든크로스 - if (data['macd'][i - 1] < data['macds'][i - 1] and data['macds'][i] < data['macd'][i]): - canBuy = False - for c in range(1, 11): - if data['rsi'][i-c] < 10: - canBuy = True - break - if canBuy: - weight = 3 - buy = data['close'][i] - type = 'method2' - - - # 매수전략 #3: 다이버전스 - if (data['macd'][i - 1] < data['macds'][i - 1] and data['macds'][i] < data['macd'][i]): - canBuy = False - index = 0 - for c in range(1, 41): - if data['macd'][i-c-1] < data['macds'][i-c-1] and data['macds'][i-c] < data['macd'][i-c]: - canBuy = True - index = c - break - if canBuy and data['rsi'][i-index] < 30: - if (data['macd'][i-index] < data['macd'][i] and - min(data['open'][i], data['close'][i]) < min(data['open'][i-index], data['close'][i-index])): - weight = 2 - buy = data['close'][i] - type = 'method3' - - return buy, weight - - def getSellPriceAndWeight(self, stock_code, i, data, INFO): - sell, weight, type = -1, -1, "" - - # 매수전략 #1: 높은 상승 - if (650 < data['macd'][i] or 600 < data['macds'][i]) and (0 < data['macdo'][i-1] and data['macdo'][i] <= 0): - #if data['macds'][i-1] < data['macd'][i-1] and data['macd'][i] < data['macds'][i]: - weight = 1 - sell = data['close'][i] - type = 'method1' - - # 매수전략 #2: RSI 과매수에서 데드크로스 - if (data['macds'][i - 1] < data['macd'][i - 1] and data['macd'][i] < data['macds'][i]): - if 80 < data['rsi'][i]: - weight = 1 - sell = data['close'][i] - type = 'method2' - - return sell, weight - - def checkTransaction(self, stock_code, data, INFO, isRealTime=True): - # 어제 오늘 데이터로 분석 - bsLine = {} - - if data is not None and 'close' in data.columns: - size = len(data["close"]) - if isRealTime: - - # isRealTime=True, 실시간 적용 - last_index = size - 1 - - buy, buy_weight = self.getBuyPriceAndWeight(stock_code, last_index, data, INFO) - sell, sell_weight = self.getSellPriceAndWeight(stock_code, last_index, data, INFO) - - bsLine['buy'] = [buy] - bsLine['buy_weight'] = [buy_weight] - bsLine['sell'] = [sell] - bsLine['sell_weight'] = [sell_weight] - - else: - # Type=False, 시뮬레이션 적용 - bsLine['buy'] = [-1 for i in range(size)] - bsLine['buy_weight'] = [-1 for i in range(size)] - bsLine['sell'] = [-1 for i in range(size)] - bsLine['sell_weight'] = [-1 for i in range(size)] - - for last_index in range(size): - - buy, buy_weight = self.getBuyPriceAndWeight(stock_code, last_index, data, INFO) - sell, sell_weight = self.getSellPriceAndWeight(stock_code, last_index, data, INFO) - # sell, sell_weight = -1, -1 - - bsLine['buy'][last_index] = buy - bsLine['buy_weight'][last_index] = buy_weight - bsLine['sell'][last_index] = sell - bsLine['sell_weight'][last_index] = sell_weight - else: - bsLine['buy'] = [-1] - bsLine['buy_weight'] = [-1] - bsLine['sell'] = [-1] - bsLine['sell_weight'] = [-1] - - return bsLine \ No newline at end of file diff --git a/hts/BuySellChecker_252670.py b/hts/BuySellChecker_252670.py deleted file mode 100644 index 7ac2d16..0000000 --- a/hts/BuySellChecker_252670.py +++ /dev/null @@ -1,126 +0,0 @@ -from hts.BuySellChecker import BuySellChecker - -class BuySellChecker_252670 (BuySellChecker): - - def __init__(self): - super().__init__() - return - def getBuyPriceAndWeight(self, stock_code, i, data, INFO): - buy, weight, type = -1, -1, "" - - """ - #매수전략 #0: 기준선 위에서 골든크로스 - if (0 < data['macd'][i] and 0 < data['macds'][i]): - if (data['macd'][i-1] < data['macds'][i-1] and data['macds'][i] < data['macd'][i]): - canBuy = False - for c in range(1, 11): - if data['macd'][i - c] < 0: - canBuy = True - break - if canBuy: - weight = 1 - buy = data['close'][i] - type = 'method0' - """ - - # 매수전략 #1: 깊은 하락 - if (data['macd'][i]<-1000) and (data['macdo'][i-1] <= 0 and 0 < data['macdo'][i]): - if data['close'][i] < data['avg200'][i]: - weight = 0.5 - buy = data['close'][i] - type = 'method1' - - - # 매수전략 #2: RSI 과매도 이후 골든크로스 - if (data['macd'][i - 1] < data['macds'][i - 1] and data['macds'][i] < data['macd'][i]): - canBuy = False - for c in range(1, 11): - if data['rsi'][i-c] < 10: - canBuy = True - break - if canBuy: - weight = 3 - buy = data['close'][i] - type = 'method2' - - - # 매수전략 #3: 다이버전스 - if (data['macd'][i - 1] < data['macds'][i - 1] and data['macds'][i] < data['macd'][i]): - canBuy = False - index = 0 - for c in range(1, 41): - if data['macd'][i-c-1] < data['macds'][i-c-1] and data['macds'][i-c] < data['macd'][i-c]: - canBuy = True - index = c - break - if canBuy and data['rsi'][i-index] < 30: - if (data['macd'][i-index] < data['macd'][i] and - min(data['open'][i], data['close'][i]) < min(data['open'][i-index], data['close'][i-index])): - weight = 2 - buy = data['close'][i] - type = 'method3' - - return buy, weight - - def getSellPriceAndWeight(self, stock_code, i, data, INFO): - sell, weight, type = -1, -1, "" - - # 매수전략 #1: 높은 상승 - if (650 < data['macd'][i] or 600 < data['macds'][i]) and (0 < data['macdo'][i-1] and data['macdo'][i] <= 0): - #if data['macds'][i-1] < data['macd'][i-1] and data['macd'][i] < data['macds'][i]: - weight = 1 - sell = data['close'][i] - type = 'method1' - - # 매수전략 #2: RSI 과매수에서 데드크로스 - if (data['macds'][i - 1] < data['macd'][i - 1] and data['macd'][i] < data['macds'][i]): - if 80 < data['rsi'][i]: - weight = 1 - sell = data['close'][i] - type = 'method2' - - return sell, weight - - def checkTransaction(self, stock_code, data, INFO, isRealTime=True): - # 어제 오늘 데이터로 분석 - bsLine = {} - - if data is not None and 'close' in data.columns: - size = len(data["close"]) - if isRealTime: - - # isRealTime=True, 실시간 적용 - last_index = size - 1 - - buy, buy_weight = self.getBuyPriceAndWeight(stock_code, last_index, data, INFO) - sell, sell_weight = self.getSellPriceAndWeight(stock_code, last_index, data, INFO) - - bsLine['buy'] = [buy] - bsLine['buy_weight'] = [buy_weight] - bsLine['sell'] = [sell] - bsLine['sell_weight'] = [sell_weight] - - else: - # Type=False, 시뮬레이션 적용 - bsLine['buy'] = [-1 for i in range(size)] - bsLine['buy_weight'] = [-1 for i in range(size)] - bsLine['sell'] = [-1 for i in range(size)] - bsLine['sell_weight'] = [-1 for i in range(size)] - - for last_index in range(size): - - buy, buy_weight = self.getBuyPriceAndWeight(stock_code, last_index, data, INFO) - sell, sell_weight = self.getSellPriceAndWeight(stock_code, last_index, data, INFO) - # sell, sell_weight = -1, -1 - - bsLine['buy'][last_index] = buy - bsLine['buy_weight'][last_index] = buy_weight - bsLine['sell'][last_index] = sell - bsLine['sell_weight'][last_index] = sell_weight - else: - bsLine['buy'] = [-1] - bsLine['buy_weight'] = [-1] - bsLine['sell'] = [-1] - bsLine['sell_weight'] = [-1] - - return bsLine