import math from datetime import datetime import pandas as pd from stockpredictor.analysis.Common import Common from stockpredictor.analysis.Stochastic import Stochastic from stockpredictor.analysis.RSI import RSI from stockpredictor.analysis.MACD import MACD from stockpredictor.analysis.IchimokuCloud import IchimokuCloud class BuySellChecker: common = None stochastic = None rsi = None ichimokuCloud = None def __init__(self): self.common = Common() self.stochastic = Stochastic() self.rsi = RSI() self.macd = MACD() self.ichimokuCloud = IchimokuCloud() return def getPriceAndWeight1(self, data, i): buy, weight, sell = -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: ################ ### sell 분석 ### ################ # 1. 볼린져밴드 상단이 최고와 종가 사이 아래에 있는 경우 매도한다. #if (data["high"][i] - data["close"][i]) / 2 + data["close"][i] > data["upper"][i]: # sell = data["high"][i] # 2. slow_k가 90이 넘으면 매도한다. if data["slow_k"][i] > 90: sell = data["high"][i] #if data["slow_k"][i] >= 85: # if data["slow_d"][i-1] < data["slow_k"][i-1] and data["slow_k"][i] < data["slow_d"][i]: # sell = data["high"][i] # 3. 2시 이후에는 최고가가 볼린져밴드 상단 위에 있으면 매도한다. if i > 300 and data["high"][i] > data["upper"][i]: sell = data["high"][i] ########################## ### buy 분석 ### ########################## if data["low"][i] < data["lower"][i] + 5 and data["open"][i] <= data["close"][i]: if data["slow_k"][i-1] < 30 and data["slow_k"][i] < 30: if data["slow_k"][i-1] < data["slow_k"][i]: buy = data["low"][i] if data["rsi"][i] < 25: if data["rsi"][i - 2] < data["rsis"][i - 2] and data["rsi"][i - 1] < data["rsis"][i - 1] and data["rsis"][i] < data["rsi"][i]: if data["close"][i] < data["avg5"][i]: buy = data["close"][i] else: buy = data["low"][i] weight = 1 ############################# ### STOCHASTIC weight 분석 ### ############################# if data["slow_k"][i] in (0, 1, 2, 3): weight = 1 if data["slow_k"][i] in (4, 5, 6, 7, 8): weight = 1 elif data["slow_k"][i] in (9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20): weight = 1 elif data["slow_k"][i] in (21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35): weight = 1 return buy, weight, sell def getPriceAndWeight2(self, data, i): buy, weight, sell = -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: ################ ### sell 분석 ### ################ # 1. 볼린져밴드 상단이 최고와 종가 사이 아래에 있는 경우 매도한다. if (data["high"][i] - data["close"][i]) / 2 + data["close"][i] > data["upper"][i]: sell = data["high"][i] if data["slow_k"][i] >= 85: if data["slow_d"][i - 1] < data["slow_k"][i - 1] and data["slow_k"][i] < data["slow_d"][i]: sell = data["high"][i] # 3. 2시 이후에는 최고가가 볼린져밴드 상단 위에 있으면 매도한다. if i > 300 and data["high"][i] > data["upper"][i]: sell = data["high"][i] ########################## ### STOCHASTIC buy 분석 ### ########################## if i < 40: pre_slow = data["slow_k"][i - 1] / data["slow_d"][i - 1] - 1 now_slow = data["slow_k"][i] / data["slow_d"][i] - 1 if pre_slow < 0 and 0 < now_slow: if data["slow_k"][i] <= 35: if (data["close"][i] - data["lower"][i]) / (data["upper"][i] - data["lower"][i]) < 0.35: if data["slow_k"][i - 1] < data["slow_d"][i - 1] and data["slow_d"][i] < data["slow_k"][i]: if data['avg10'][i] < data['avg5'][i]: if data["open"][i] < data["close"][i]: buy = data["close"][i] else: buy = data["low"][i] else: pre_slow = data["slow_k"][i - 1] / data["slow_d"][i - 1] - 1 now_slow = data["slow_k"][i] / data["slow_d"][i] - 1 if pre_slow < 0 and pre_slow < now_slow and -0.15 < now_slow: if data["slow_k"][i] <= 30: if (data["close"][i] - data["lower"][i]) / (data["upper"][i] - data["lower"][i]) < 0.35: if data["slow_k"][i - 1] < data["slow_d"][i - 1] and data["slow_d"][i] < data["slow_k"][i]: if data['avg10'][i] < data['avg5'][i]: if data["close"][i] < data["avg5"][i]: buy = data["close"][i] else: buy = data["low"][i] ############################# ### STOCHASTIC weight 분석 ### ############################# if data["slow_k"][i] in (0, 1, 2, 3): weight = 1 if data["slow_k"][i] in (4, 5, 6, 7, 8): weight = 1 elif data["slow_k"][i] in (9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20): weight = 1 elif data["slow_k"][i] in (21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35): weight = 1 return buy, weight, sell def getBuyCheck(self, data, i, buy, weight): if data['close'][i]= START_TIME_INDEX: # 매수 분석 # 장 초기 (시작 3분 이내) 양봉 2개에 3분차에 장대 양봉이면 매수. if i < 381 + 4: if data["open"][i] == data["low"][i] and data["close"][i] == data["high"][i]: if data["close"][i-2] <= data["open"][i-1]: if data["open"][i-2] < data["close"][i-2] and data["open"][i-1] < data["close"][i-1]: buy = data["high"][i] weight = 1 return self.getBuyCheck(data, i, buy, weight) # 장 초기 (시작 7분 이내), 볼린져 하단에서 시작하여 이병선을 모두 상승하여 마감한 경우 low 값에서 매수한다. if i < 381 + 8: if data["open"][i] == data["low"][i] and data["close"][i] == data["high"][i]: if data["close"][i] > max(data["avg3"][i], data["avg5"][i], data["avg10"][i], data["avg20"][i], data["avg30"][i]): buy = data["low"][i] weight = 2 return self.getBuyCheck(data, i, buy, weight) # 만약 30원 이상 장대 양봉이 나온 경우, 다음이나 다다음 중간 값에서 매수를 한다. if (data["close"][i] - data["low"][i]) >= 30: middle = int((data["close"][i] + data["low"][i])/2) buy = middle weight = 1 return self.getBuyCheck(data, i, buy, weight) # 이동선을 이용한 매매 # 3분선과 10분선이 30분 이상 내려오다가 3분선이 10분선을 넘어 서는 순간 매수 if int(data["avg3"][i]) > int(data["avg10"][i]): valid = True same_count = 0 for c in range(1, 30): if int(data["avg3"][i-c]) == int(data["avg10"][i-c]): same_count += 1 if int(data["avg3"][i-c]) > int(data["avg10"][i-c]): valid = False break if valid and same_count < 2: buy = data["close"][i] - 5 weight = 1 return self.getBuyCheck(data, i, buy, weight) # 이동선을 이용한 매매 # 3분선과 5분선이 10분 이상 내려오다가 3분선이 5분선을 넘어 서는 순간 매수 if int(data["avg3"][i]) > int(data["avg5"][i]): valid = True same_count = 0 for c in range(1, 11): if int(data["avg3"][i-c]) == int(data["avg5"][i-c]): same_count += 1 if int(data["avg3"][i-c]) > int(data["avg5"][i-c]): valid = False break if valid and same_count < 2: if data['macd'][i] < -5: buy = data["close"][i] - 5 weight = 1 return self.getBuyCheck(data, i, buy, weight) # 다이버젼스 # slow_k가 20 이하에서 이전 최저점의 slow_k보다 지금 최저점의 slow_k가 더 높은 경우 if data["slow_k"][i] < 20: if data["close"][i] > data["close"][i - 1]: p_slow_k = 100 p_close = 0 top = False for c in range(1, 60): if not top and data["close"][i-c] > min(data["open"][i-c], data["close"][i-c]): top = True if top and data["close"][i-c] > min(data["open"][i-c], data["close"][i-c]): p_slow_k = data["slow_k"][i-c] p_close = data["close"][i-c] break if data["close"][i] < p_close and data["slow_k"][i] > p_slow_k: buy = data["close"][i] weight = 1 return self.getBuyCheck(data, i, buy, weight) # 이동선을 이용한 매매 # 3분선이 10분선에 돌파 후 지지하는지 확인하고 slow_k < 40일 때 매수함 # 현재 단계: # - avg3[i]이 avg10[i]보다 커야함 # - avg3[i]가 avg3[i-1]보다 커야함 if data['avg10'][i] < data['avg3'][i] and data['avg3'][i-1] < data['avg3'][i] and abs(data['avg10'][i] - data['avg3'][i]) > 2: # 첫 이전 단계: # - avg3[i-1]과 avg10[i-1]의 abs가 3이내여야 함 if abs(data['avg3'][i-1] - data['avg10'][i-1]) < 3 and data['avg3'][i-1] < data['avg3'][i-2]: index1 = -1 valid = False for j in range(2, 20): # 두 번째 이전 단계: # - avg3[i-2]가 avg10[i-2]보다 커야 함 # - avg3[i-2]가 avg3[i-3]보다 작아야함 if data['avg10'][i-j] < data['avg3'][i-j] and data['avg3'][i-j] > data['avg3'][i-j-1]: index1 = j break for j in range(index1 + 1, 20): # 세 번째 이전 단계: # - avg3[i-3]가 avg3[i-4]보다 커야 함 if data['avg3'][i-j] > data['avg3'][i-j-1]: valid = True index1 = j else: break # 마지막 체크: # 만약 avg[3]이 avg[10]보다 작다면 매수함 if valid: if data['avg3'][i-index1-1] < data['avg10'][i-index1-1]: if data["slow_k"][i] < 40: buy = data["close"][i] weight = 2 return self.getBuyCheck(data, i, buy, weight) # 10분 이상 10분 선 아래 3분선이 있다가 10분선 위로 올라 올때 장대장봉임 # 해당 기간 clsoe 값이 10분 선 아래 있을 때, if data["avg10"][i] < data["avg3"][i] and data["low"][i] == data["open"][i] < data["close"][i] == data["high"][i]: if (data["avg3"][i-1] <= data["avg10"][i-1]) and ((data["avg10"][i-1] and data["avg3"][i-1]) < data["close"][i-1]): valid = True for c in range(2, 11): if data["avg10"][i-c] < data["avg3"][i-c] or data["avg10"][i-c] < data["close"][i-c]: valid = False break if valid: buy = int((data["open"][i] + data["close"][i])/2) weight = 1 return self.getBuyCheck(data, i, buy, weight) # 이동선을 이용한 매매 # 20분선이 30분선에 돌파 후 지지하는지 확인하고 해당 시점이 양봉이면 매수함 if data['avg20'][i] > data['avg30'][i]: diff1 = data['avg20'][i] - data['avg30'][i] diff2 = data['avg20'][i-1] - data['avg30'][i-1] diff3 = data['avg20'][i-2] - data['avg30'][i-2] diff4 = data['avg20'][i-3] - data['avg30'][i-3] diff5 = data['avg20'][i-4] - data['avg30'][i-4] if 0 < diff3 < diff2 < diff1: if data['high'][i-2] <= data['high'][i-1] <= data['high'][i]: if data['open'][i - 2] <= data['close'][i - 2] and data['open'][i-1] <= data['close'][i-1] and data['open'][i] <= data['close'][i]: if diff5 < diff4 < 0: if data["rsi"][i] < 30: buy = (data["open"][i]+data["close"][i])/2 weight = 1 return self.getBuyCheck(data, i, buy, weight) # macd를 이용한 매수 if data.index[i].strftime("%H:%M") < "10:00": if data["macd"][i] < -15 and data["macd"][i-1] < min(data["macd"][i-7], data["macd"][i-6], data["macd"][i-5], data["macd"][i-4], data["macd"][i-3], data["macd"][i-2], data["macd"][i]): buy = (data["open"][i]+data["close"][i])/2 weight = 1 return buy, weight # slow_k를 이용한 매수 if data.index[i].strftime("%H:%M") < "09:20": if data["slow_k"][i] < 10 and data["slow_k"][i-1] < min(data["slow_k"][i-4], data["slow_k"][i-3], data["slow_k"][i-2], data["slow_k"][i]): buy = (data["open"][i]+data["close"][i])/2 weight = 1 return buy, weight else: if data["slow_k"][i] < 10 and data["slow_k"][i-1] < min(data["slow_k"][i-7], data["slow_k"][i-6], data["slow_k"][i-5], data["slow_k"][i-4], data["slow_k"][i-3], data["slow_k"][i-2], data["slow_k"][i]): buy = (data["open"][i]+data["close"][i])/2 weight = 1 return self.getBuyCheck(data, i, buy, weight) # 볼린저 밴드가 하락에서 상승으로 전환할 때, # 지금 양봉 close가 upper를 돌파했다. (이전 거래량 보다 많음) # 20분 이내로 양봉 close가 upper를 돌파 한 것이 있어야 한다. # 지금 양봉의 close가 이전 양봉의 close보다 높아야 한다. # 이 사이에 종가가 20분봉 위에 있어야 한다. if data.index[i].strftime("%H:%M") > "09:15": if (data['open'][i] < data['close'][i]==data['high'][i]) and (data['upper'][i] < data['close'][i]) and (data['volume'][i-1] < data['volume'][i]): if data['open'][i-1] < data['close'][i-1] and data['open'][i-2] < data['close'][i-2]: if data['close'][i-1] < data['upper'][i-1] and data['close'][i-2] < data['upper'][i-2] and data['close'][i-2] < data['upper'][i-2]: index = -1 for c in range(6, 21): if data['open'][i-c] < data['close'][i-c] and data['upper'][i-c] < data['close'][i-c]: index = c break if index != -1: valid = True for c in range(2, index+1): if data['open'][i-c] < data['avg20'][i-c] and data['close'][i-c] < data['avg20'][i-c]: valid = False break if valid: buy = data["close"][i] weight = 1 return self.getBuyCheck(data, i, buy, weight) return buy, weight def getSellPriceAndWeight1(self, data, i): sell, weight = -1, -1 START_TIME_INDEX = 0 for c in range(370, len(data.index)): if data.index[c].strftime("%H:%M:%S") == "09:01:00": START_TIME_INDEX = c break if i >= START_TIME_INDEX: # 매도 분석 # 3분 선이 40분 전부터 게속 20분선 위에 있다가 아래로 내려오면 매도함 if data["avg3"][i] < data["avg20"][i]: valid = True for c in range(1, 41): if data["avg3"][i-c] < data["avg20"][i-c]: valid = False break if valid: sell = int((data["open"][i] + data["close"][i])/2) return sell, weight # 3분 선이 60분 전부터 게속 30분선 위에 있다가 아래로 내려오면 매도함 if data["avg3"][i] < data["avg30"][i]: valid = True for c in range(1, 61): if data["avg3"][i-c] < data["avg30"][i-c]: valid = False break if valid: sell = int((data["open"][i] + data["close"][i])/2) return sell, weight # 5분 선이 20분 전부터 게속 10분선 위에 있다가 아래로 내려오면 매도함 if data["avg5"][i] < data["avg10"][i]: valid = True for c in range(1, 21): if data["avg5"][i-c] < data["avg10"][i-c]: valid = False break if valid: sell = int((data["open"][i] + data["close"][i])/2) return sell, weight # rsi와 rsis가 75이상에서 slow_k가 slow_d 아래롸 내려온 경우 if data["rsi"][i] >= 70 and data["rsis"][i] >= 70: if data["rsi"][i-1] > data["rsis"][i-1] and data["rsi"][i] < data["rsis"][i]: sell = int((data["open"][i] + data["close"][i]) / 2) return sell, weight # slow_k와 slow_d가 90이상에서 slow_k가 slow_d 아래롸 내려온 경우 if data["slow_k"][i] >= 90 and data["slow_d"][i] >= 90: if data["slow_k"][i-1] > data["slow_d"][i-1] and data["slow_k"][i] < data["slow_d"][i]: sell = int((data["open"][i] + data["close"][i]) / 2) if data.index[i].strftime("%H:%M") < "12:00" and data['rsis'][i] < 70: return -1, -1 return sell, weight return sell, weight # 레버리지에 해당함 def getBuyPriceAndWeight2(self, data, i): buy, weight = -1, -1 START_TIME_INDEX = 0 for c in range(370, len(data.index)): if data.index[c].strftime("%H:%M:%S") == "09:01:00": START_TIME_INDEX = c break if i >= START_TIME_INDEX + 60: # 매수 분석 # 이동선을 이용한 매매 # 3분선과 10분선이 20분 이상 내려오다가 3분선이 10분선을 넘어 서는 순간 매수 if int(data["avg3"][i]) > int(data["avg10"][i]): if data["slow_k"][i] < 10: valid = True same_count = 0 for c in range(1, 21): if int(data["avg3"][i-c]) == int(data["avg10"][i-c]): same_count += 1 if int(data["avg3"][i-c]) > int(data["avg10"][i-c]): valid = False break if valid and same_count < 2: buy = data["close"][i] - 5 weight = 1 return self.getBuyCheck(data, i, buy, weight) # slow_k를 이용한 매수 if data["slow_k"][i-2] < 5 and data["slow_k"][i-1] < 5 and data["slow_k"][i] < 7: if data["slow_k"][i-2] < data["slow_k"][i] < data["slow_k"][i-1]: buy = (data["open"][i]+data["close"][i])/2 weight = 1 return buy, weight # macd를 이용한 매수 if data["macd"][i-2] < -45 and data["macd"][i-1] < -45 and data["macd"][i] < -45: if data["macd"][i-1] < min (data["macd"][i-2], data["macd"][i]): buy = (data["open"][i]+data["close"][i])/2 weight = 1 return self.getBuyCheck(data, i, buy, weight) # slow_k를 이용한 매수 if data["slow_k"][i-2] < 15 and data["slow_k"][i-1] < 12 and data["slow_k"][i] < 12: if data["slow_k"][i-2] < data["slow_k"][i] < data["slow_k"][i-1]: if data["macd"][i - 1] < -25: buy = (data["open"][i]+data["close"][i])/2 weight = 1 return self.getBuyCheck(data, i, buy, weight) return buy, weight def getSellPriceAndWeight2(self, data, i): sell, weight = -1, -1 START_TIME_INDEX = 0 for c in range(370, len(data.index)): if data.index[c].strftime("%H:%M:%S") == "09:01:00": START_TIME_INDEX = c break if i >= START_TIME_INDEX: # 매도 분석 #4분전에 upper 돌파 후 4음봉이면 매도 if data["open"][i-3] > data["upper"][i-3]: if data["open"][i - 2] > data["close"][i - 2]: if data["open"][i - 1] > data["close"][i - 1]: if data["open"][i] > data["close"][i]: sell = int((data["open"][i] + data["close"][i]) / 2) return sell, weight # 3분 선이 15분 전부터 게속 5분선 위에 있다가 아래로 내려오면 매도함 if data["avg3"][i] <= data["avg5"][i]: valid = True for c in range(1, 16): if data["avg3"][i-c] < data["avg5"][i-c] and abs(data["avg3"][i-c] - data["avg5"][i-c]) > 5: valid = False break if valid: sell = int((data["open"][i] + data["close"][i])/2) return sell, weight # 3분 선이 40분 전부터 게속 20분선 위에 있다가 아래로 내려오면 매도함 if data["avg3"][i] < data["avg20"][i]: valid = True for c in range(1, 41): if data["avg3"][i-c] < data["avg20"][i-c]: valid = False break if valid: sell = int((data["open"][i] + data["close"][i])/2) return sell, weight # 3분 선이 60분 전부터 게속 30분선 위에 있다가 아래로 내려오면 매도함 if data["avg3"][i] < data["avg30"][i]: valid = True for c in range(1, 61): if data["avg3"][i-c] < data["avg30"][i-c]: valid = False break if valid: sell = int((data["open"][i] + data["close"][i])/2) return sell, weight # 5분 선이 20분 전부터 게속 10분선 위에 있다가 아래로 내려오면 매도함 if data["avg5"][i] < data["avg10"][i]: valid = True for c in range(1, 21): if data["avg5"][i-c] < data["avg10"][i-c]: valid = False break if valid: sell = int((data["open"][i] + data["close"][i])/2) return sell, weight # rsi와 rsis가 75이상에서 slow_k가 slow_d 아래롸 내려온 경우 if data["rsi"][i] >= 70 and data["rsis"][i] >= 70: if data["rsi"][i-1] > data["rsis"][i-1] and data["rsi"][i] < data["rsis"][i]: sell = int((data["open"][i] + data["close"][i]) / 2) return sell, weight # slow_k와 slow_d가 90이상에서 slow_k가 slow_d 아래롸 내려온 경우 if data["slow_k"][i] >= 90 and data["slow_d"][i] >= 90: if data["slow_k"][i-1] > data["slow_d"][i-1] and data["slow_k"][i] < data["slow_d"][i]: sell = int((data["open"][i] + data["close"][i]) / 2) if data.index[i].strftime("%H:%M") < "12:00" and data['rsis'][i] < 70: return -1, -1 return sell, weight return sell, weight def analyze(self, result): open = result["open"] close = result["close"] high = result["high"] low = result["low"] vol = result["vol"] close_df = pd.DataFrame(close) avg3_list = close_df.rolling(window=3).mean().fillna(close[0]).values.tolist() avg3 = [item[0] for item in avg3_list] avg5_list = close_df.rolling(window=5).mean().fillna(close[0]).values.tolist() avg5 = [item[0] for item in avg5_list] avg10_list = close_df.rolling(window=10).mean().fillna(close[0]).values.tolist() avg10 = [item[0] for item in avg10_list] avg20_list = close_df.rolling(window=20).mean().fillna(close[0]).values.tolist() avg20 = [item[0] for item in avg20_list] avg30_list = close_df.rolling(window=30).mean().fillna(close[0]).values.tolist() avg30 = [item[0] for item in avg30_list] avg60_list = close_df.rolling(window=60).mean().fillna(close[0]).values.tolist() avg60 = [item[0] for item in avg60_list] df = pd.DataFrame(close) max20 = df.rolling(window=20).mean() stddev20 = df.rolling(window=20).std() upper_df = max20 + (stddev20 * 2) # 상단 볼린저 밴드 lower_df = max20 - (stddev20 * 2) # 하단 볼린저 밴드 upper, lower = [], [] for i in range(len(upper_df)): if i < 10: upper.append(upper_df.values[0][0]) lower.append(lower_df.values[0][0]) else: upper.append(upper_df.values[i][0]) lower.append(lower_df.values[i][0]) point_temp = result["time"] STOCK = [] for i in range(len(open)): STOCK.append({'volume': vol[i], 'close': close[i], 'open': open[i], 'high': high[i], 'low': low[i], 'avg3': avg3[i], 'avg5': avg5[i],'avg10': avg10[i],'avg20': avg20[i],'avg30': avg30[i],'avg60': avg60[i]}) # stochastic 계산 stochastic_df = self.stochastic.apply(STOCK, n=30, m=5, t=5) stochastic_df = stochastic_df.fillna(100) fast_k = stochastic_df['fast_k'].values.tolist() slow_k = stochastic_df['slow_k'].values.tolist() slow_d = stochastic_df['slow_d'].values.tolist() # macd 계산 macd_df = self.macd.apply(STOCK, short=12, long=26, t=9) macd_df = macd_df.fillna(100) macd = macd_df['macd'].values.tolist() macds = macd_df['macds'].values.tolist() macdo = macd_df['macdo'].values.tolist() # rsi 계산 rsi_df = self.rsi.apply(STOCK, period=30, window=5) rsi_df = rsi_df.fillna(100) rsi = rsi_df['rsi'].values.tolist() rsis = rsi_df['rsis'].values.tolist() # ichimokuCloud 계산 # ichimokuCloud_df = self.ichimokuCloud.apply(STOCK, c=9, b=26, l=52) # ichimokuCloud_df = rsi_df.fillna(100) # changeLine = rsi_df['changeLine'].values.tolist() # baseLine = rsi_df['baseLine'].values.tolist() # leadingSpan1 = rsi_df['leadingSpan1'].values.tolist() # leadingSpan2 = rsi_df['leadingSpan2'].values.tolist() temp = {"date": point_temp, "open": open, "high": high, "low": low, "close": close, "volume": vol, "upper": upper, "lower": lower, "avg3": avg3, "avg5": avg5, "avg10": avg10, "avg20": avg20, "avg30": avg30, "avg60": avg60, "macd": macd, "macds": macds, "macdo": macdo, "fast_k": fast_k, "slow_k": slow_k, "slow_d": slow_d, "rsi": rsi, "rsis": rsis} data = pd.DataFrame(temp) df_final_time = pd.DatetimeIndex(point_temp) data.index = df_final_time return data def checkTransaction(self, data, stock_code): size = len(data["close"]) bsLine = {} bsLine['buy'] = [-1 for i in range(size)] bsLine['weight'] = [-1 for i in range(size)] bsLine['sell'] = [-1 for i in range(size)] for i in range(size): if stock_code == "252670": sell, weight = self.getSellPriceAndWeight1(data, i) buy, weight = self.getBuyPriceAndWeight1(data, i) else: sell, weight = self.getSellPriceAndWeight2(data, i) buy, weight = self.getBuyPriceAndWeight2(data, i) bsLine['buy'][i] = buy bsLine['weight'][i] = weight bsLine['sell'][i] = sell return bsLine