def preprocess_rev(data_4, ver='v2'): """ # 액면분할 수정주가 반영영 data_2 = data.iloc[:186] columns = ['close', 'open', 'high', 'low', 'eps', 'bps', 'dividend_per_stock'] for column in columns: data_2[column] = data_2[column] / 5.0 data_3 = data.iloc[189:] data_4 = pd.concat([data_2, data_3],axis=0) data_4 = data_4.dropna() """ # del data_4['eps'] del data_4['per'] data_4 = data_4.dropna() # ['date_'] = data_4['date'] data_4['open_'] = data_4['open'] data_4['high_'] = data_4['high'] data_4['low_'] = data_4['low'] data_4['close_'] = data_4['close'] data_4['volume_'] = data_4['volume'] # 보조지표 추가 # 1) 이평선(SMA, EMA, WMA) (w = 5,10,15,20,30,60,120) data_4['ma_5'] = ta.SMA(data_4.close, timeperiod=5) data_4['ma_10'] = ta.SMA(data_4.close, timeperiod=10) data_4['ma_15'] = ta.SMA(data_4.close, timeperiod=15) data_4['ma_20'] = ta.SMA(data_4.close, timeperiod=20) data_4['ma_30'] = ta.SMA(data_4.close, timeperiod=30) data_4['ma_60'] = ta.SMA(data_4.close, timeperiod=60) data_4['ma_120'] = ta.SMA(data_4.close, timeperiod=120) data_4['ema_5'] = ta.EMA(data_4.close, timeperiod=5) data_4['ema_10'] = ta.EMA(data_4.close, timeperiod=10) data_4['ema_15'] = ta.EMA(data_4.close, timeperiod=15) data_4['ema_20'] = ta.EMA(data_4.close, timeperiod=20) data_4['ema_30'] = ta.EMA(data_4.close, timeperiod=30) data_4['ema_60'] = ta.EMA(data_4.close, timeperiod=60) data_4['ema_120'] = ta.EMA(data_4.close, timeperiod=120) data_4['wma_5'] = ta.WMA(data_4.close, timeperiod=5) data_4['wma_10'] = ta.WMA(data_4.close, timeperiod=10) data_4['wma_15'] = ta.WMA(data_4.close, timeperiod=15) data_4['wma_20'] = ta.WMA(data_4.close, timeperiod=20) data_4['wma_30'] = ta.WMA(data_4.close, timeperiod=30) data_4['wma_60'] = ta.WMA(data_4.close, timeperiod=60) data_4['wma_120'] = ta.WMA(data_4.close, timeperiod=120) data_4['ma_v5'] = ta.SMA(data_4.volume, timeperiod=5) data_4['ma_v10'] = ta.SMA(data_4.volume, timeperiod=10) data_4['ma_v20'] = ta.SMA(data_4.volume, timeperiod=20) data_4['ma_v60'] = ta.SMA(data_4.volume, timeperiod=60) data_4['ma_v120'] = ta.SMA(data_4.volume, timeperiod=120) data_4['volume_inst_sub'] = data_4['volume_inst_buy'] - data_4[ 'volume_inst_sell'] data_4['volume_fore_sub'] = data_4['volume_fore_buy'] - data_4[ 'volume_fore_sell'] data_4['ma_inst_v5'] = ta.SMA(data_4.volume_inst_sub, timeperiod=5) data_4['ma_inst_v10'] = ta.SMA(data_4.volume_inst_sub, timeperiod=10) data_4['ma_inst_v20'] = ta.SMA(data_4.volume_inst_sub, timeperiod=20) data_4['ma_inst_v60'] = ta.SMA(data_4.volume_inst_sub, timeperiod=60) data_4['ma_inst_v120'] = ta.SMA(data_4.volume_inst_sub, timeperiod=120) data_4['ma_fore_v5'] = ta.SMA(data_4.volume_fore_sub, timeperiod=5) data_4['ma_fore_v10'] = ta.SMA(data_4.volume_fore_sub, timeperiod=10) data_4['ma_fore_v20'] = ta.SMA(data_4.volume_fore_sub, timeperiod=20) data_4['ma_fore_v60'] = ta.SMA(data_4.volume_fore_sub, timeperiod=60) data_4['ma_fore_v120'] = ta.SMA(data_4.volume_fore_sub, timeperiod=120) # 2) 볼린저밴드 (주가의 이동평균선을 중심으로 표준편차 범위를 표시) ubb, mbb, lbb = ta.BBANDS(data_4.close, 20, 2) data_4['ubb'] = ubb data_4['mbb'] = mbb data_4['lbb'] = lbb # 3) MACD 이동평균수렴확산 (단기(EMA12)와 장기(EMA26) EMA로 모멘텀을 추정) macd, macdsignal9, macdhist = ta.MACD(data_4.close, fastperiod=12, slowperiod=26, signalperiod=9) data_4['macd'] = macd data_4['macdsignal9'] = macdsignal9 data_4['macdhist'] = macdhist # 4) RSI 상대강도지수 - 추세의 강도 파악, 과매수, 과매도 국면 판단 data_4['rsi'] = ta.RSI(data_4.close, timeperiod=14) # 5) 스토캐스틱 오늘의 주가가 일정 동안 주가의 변동폭 중에서 어느 정도인 지? slowk, slowd = ta.STOCH(data_4.high, data_4.low, data_4.close, fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0) fastk, fastd = ta.STOCHF(data_4.high, data_4.low, data_4.close, fastk_period=5, fastd_period=3, fastd_matype=0) fastk_rsi, fastd_rsi = ta.STOCHRSI(data_4.close, timeperiod=14, fastk_period=5, fastd_period=3, fastd_matype=0) data_4['slowk'] = slowk data_4['slowd'] = slowd data_4['fastk'] = fastk data_4['fastd'] = fastd data_4['fastk_rsi'] = fastk_rsi data_4['fastd_rsi'] = fastd_rsi # 6) 기타 자주 사용되는 것들 # CCI (Commodity Channel Index), williams'%R, parabolic SAR # ADX (Average Directional Movement Index) # plusDI(Plus Directional Indicator), plusDM Plus Directional Movement) # ATR (Average True Range), OBV (On Balance Volume) 거래량 분석을 통한 주가분석, Variance data_4['cci'] = ta.CCI(data_4.high, data_4.low, data_4.close, timeperiod=14) data_4['willR'] = ta.WILLR(data_4.high, data_4.low, data_4.close, timeperiod=14) data_4['sar'] = ta.SAR(data_4.high, data_4.low, acceleration=0, maximum=0) data_4['adx'] = ta.ADX(data_4.high, data_4.low, data_4.close, timeperiod=14) data_4['plus_di'] = ta.PLUS_DI(data_4.high, data_4.low, data_4.close, timeperiod=14) data_4['plus_dm'] = ta.PLUS_DM(data_4.high, data_4.low, timeperiod=14) data_4['atr'] = ta.ATR(data_4.high, data_4.low, data_4.close, timeperiod=14) data_4['obv'] = ta.OBV(data_4.close, data_4.volume) data_4['var'] = ta.VAR(data_4.close, timeperiod=5, nbdev=1) # 7) Pattern REcognition # Investopedia "The 5 Most Powerful Candlestick Patterns" # Three Line Strike, Three Black Crows # Evening Star, Abandoned Baby # df4['line_str'] = ta.CDL3LINESTRIKE(df4.open, df4.high, df4.low, df4.close) # df4['blk_crw'] = ta.CDL3BLACKCROWS(df4.open, df4.high, df4.low, df4.close) # df4['evn_star'] = ta.CDLEVENINGSTAR(df4.open, df4.high, df4.low, df4.close, penetration=0) # df4['abn_baby'] = ta.CDLABANDONEDBABY(df4.open, df4.high, df4.low, df4.close, penetration=0) scaling_col = [column for column in data_4.columns] for i in range(6): scaling_col.pop(0) data_rev = data_4.copy() feature_scaling(data_rev, scaling_strategy="z-score", column=scaling_col) return data_rev
def extract_by_type(feature_type, open_prices=None, close_prices=None, high_prices=None, low_prices=None): # This function defines the features which are categorized with supporting technical indicators if feature_type == 'ROCP': rocp1 = talib.ROCP(close_prices, timeperiod=1) rocp2 = talib.ROCP(close_prices, timeperiod=2) feature.append(rocp1) feature.append(rocp2) if feature_type == 'OROCP': orocp = talib.ROCP(open_prices, timeperiod=1) feature.append(orocp) if feature_type == 'HROCP': hrocp = talib.ROCP(high_prices, timeperiod=1) feature.append(hrocp) if feature_type == 'LROCP': lrocp = talib.ROCP(low_prices, timeperiod=1) feature.append(lrocp) if feature_type == 'MACD': macd, signal, hist = talib.MACD(close_prices, fastperiod=12, slowperiod=26, signalperiod=9) norm_macd = numpy.nan_to_num(macd) / math.sqrt( numpy.var(numpy.nan_to_num(macd))) norm_signal = numpy.nan_to_num(signal) / math.sqrt( numpy.var(numpy.nan_to_num(signal))) norm_hist = numpy.nan_to_num(hist) / math.sqrt( numpy.var(numpy.nan_to_num(hist))) macdrocp = talib.ROCP(norm_macd + numpy.max(norm_macd) - numpy.min(norm_macd), timeperiod=1) signalrocp = talib.ROCP(norm_signal + numpy.max(norm_signal) - numpy.min(norm_signal), timeperiod=1) histrocp = talib.ROCP(norm_hist + numpy.max(norm_hist) - numpy.min(norm_hist), timeperiod=1) feature.append(norm_macd) feature.append(norm_signal) feature.append(norm_hist) feature.append(macdrocp) feature.append(signalrocp) feature.append(histrocp) if feature_type == 'RSI': rsi6 = talib.RSI(close_prices, timeperiod=6) rsi12 = talib.RSI(close_prices, timeperiod=12) rsi24 = talib.RSI(close_prices, timeperiod=24) rsi6rocp = talib.ROCP(rsi6 + 100., timeperiod=1) rsi12rocp = talib.ROCP(rsi12 + 100., timeperiod=1) rsi24rocp = talib.ROCP(rsi24 + 100., timeperiod=1) feature.append(rsi6 / 100.0 - 0.5) feature.append(rsi12 / 100.0 - 0.5) feature.append(rsi24 / 100.0 - 0.5) feature.append(rsi6rocp) feature.append(rsi12rocp) feature.append(rsi24rocp) if feature_type == 'UO': ult_osc = talib.ULTOSC(high_prices, low_prices, close_prices, timeperiod1=7, timeperiod2=14, timeperiod3=28) feature.append(ult_osc / 100.0 - 0.5) if feature_type == 'BOLL': upperband, middleband, lowerband = talib.BBANDS(close_prices, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0) feature.append((upperband - close_prices) / close_prices) feature.append((middleband - close_prices) / close_prices) feature.append((lowerband - close_prices) / close_prices) if feature_type == 'MA': ma5 = talib.MA(close_prices, timeperiod=5) ma10 = talib.MA(close_prices, timeperiod=10) ma20 = talib.MA(close_prices, timeperiod=20) ma25 = talib.MA(close_prices, timeperiod=25) ma30 = talib.MA(close_prices, timeperiod=30) ma40 = talib.MA(close_prices, timeperiod=40) ma50 = talib.MA(close_prices, timeperiod=50) ma60 = talib.MA(close_prices, timeperiod=60) ma5rocp = talib.ROCP(ma5, timeperiod=1) ma10rocp = talib.ROCP(ma10, timeperiod=1) ma20rocp = talib.ROCP(ma20, timeperiod=1) ma25rocp = talib.ROCP(ma25, timeperiod=1) ma30rocp = talib.ROCP(ma30, timeperiod=1) ma40rocp = talib.ROCP(ma40, timeperiod=1) ma50rocp = talib.ROCP(ma50, timeperiod=1) ma60rocp = talib.ROCP(ma60, timeperiod=1) feature.append(ma5rocp) feature.append(ma10rocp) feature.append(ma20rocp) feature.append(ma25rocp) feature.append(ma30rocp) feature.append(ma40rocp) feature.append(ma50rocp) feature.append(ma60rocp) feature.append((ma5 - close_prices) / close_prices) feature.append((ma10 - close_prices) / close_prices) feature.append((ma20 - close_prices) / close_prices) feature.append((ma25 - close_prices) / close_prices) feature.append((ma30 - close_prices) / close_prices) feature.append((ma40 - close_prices) / close_prices) feature.append((ma50 - close_prices) / close_prices) feature.append((ma60 - close_prices) / close_prices) if feature_type == 'STOCH': slow_stoch_k, slow_stoch_d = talib.STOCH(high_prices, low_prices, close_prices, fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0) fast_stoch_k, fast_stoch_d = talib.STOCHF(high_prices, low_prices, close_prices, fastk_period=5, fastd_period=3, fastd_matype=0) fast_rsi_k, fast_rsi_d = talib.STOCHRSI(close_prices, timeperiod=14, fastk_period=5, fastd_period=3, fastd_matype=0) feature.append(slow_stoch_k / 100.0 - 0.5) feature.append(slow_stoch_d / 100.0 - 0.5) feature.append(fast_stoch_k / 100.0 - 0.5) feature.append(fast_stoch_d / 100.0 - 0.5) feature.append(fast_rsi_k / 100.0 - 0.5) feature.append(fast_rsi_d / 100.0 - 0.5) if feature_type == 'AO': median_price = (high_prices + low_prices) / 2 ao = talib.SMA(median_price, 5) - talib.SMA(median_price, 34) feature.append(ao) if feature_type == 'ROC': roc5 = talib.ROC(close_prices, timeperiod=5) roc10 = talib.ROC(close_prices, timeperiod=10) roc20 = talib.ROC(close_prices, timeperiod=20) roc25 = talib.ROC(close_prices, timeperiod=25) feature.append(roc5) feature.append(roc10) feature.append(roc20) feature.append(roc25) if feature_type == 'WILLR': willr = talib.WILLR(high_prices, low_prices, close_prices, timeperiod=14) feature.append(willr / 100.0 - 0.5) return feature
def techIndi(self): try: daySqlOra = "SELECT NVL(MAX(SUBSTR(TRADE_TIME,1,8)),TO_CHAR(SYSDATE,'YYYYMMDD')) YMD FROM TRADE_TECH " \ "WHERE SUBSTR(TRADE_TIME,1,8) <> '%s' " \ % datetime.datetime.today().strftime("%Y%m%d") dateD = self.kiwoom.selectDBOra(daySqlOra) dateS = dateD[0][0] except Exception as e: e.msg = "techindi daySql 에러" print(e) try: sqlOra71 = "SELECT DISTINCT TRIM(A.STOCK_CODE) STOCK_CODE " \ "FROM TRADE_HOLD A " \ "WHERE A.YMD >= '20200401' " \ " AND A.REQ_VOLUME <> 0" \ "UNION " \ "SELECT DISTINCT TRIM(B.STOCK_CODE) STOCK_CODE " \ "FROM TRADE_LIST B " \ "WHERE B.YMD >= '20200401' " summaryG = self.kiwoom.selectDBOra(sqlOra71) except Exception as e: e.msg = "techIndi Sql 에러" print(e) print("-----------------------------------------------------------------") print("["+ datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S") + "] " + "Process2 : 보조지표 만들기 시작!" ) try: if len(summaryG) > 0: for row_data in summaryG: try: sql = "SELECT RN, STOCK_CODE, TRADE_TIME, START_PRICE, HIGH_PRICE, LOW_PRICE, CURRENT_PRICE, VOLUME " \ "FROM ( " \ " SELECT A.*, ROW_NUMBER() OVER(PARTITION BY STOCK_CODE ORDER BY TRADE_TIME DESC) RN" \ " , ROW_NUMBER() OVER(PARTITION BY STOCK_CODE ORDER BY TRADE_TIME ASC) RN2" \ " FROM TRADE_CRR_BACK A" \ " WHERE 1=1 " \ " AND A.STOCK_CODE = '%s' " \ " AND A.STOCK_CODE NOT IN ('155960','900090') " \ " ) X " % row_data[0] sql2 = "WHERE RN BETWEEN 1 AND 800 " \ "ORDER BY RN2" summaryG = self.kiwoom.selectDBOra(sql + sql2) except Exception as e: print(e) df = pd.DataFrame(summaryG) try: if len(df) > 0: df.columns = ["rn", "stockCd", "tradeTime", "open", "high", "low", "close", "volume"] # cloF = pd.Series(df.iloc[len(df) - 1]['open'], name='close') # 3분봉 종가 만들어주는 로직 # clo = pd.Series(df.iloc[1:len(df)]['open'], name='close') # clo = pd.DataFrame(clo.append(cloF)) # clo = clo.reset_index(drop=True) # # df = df.join(clo) macd, macdsignal, macdhist = talib.MACD(df['close'], fastperiod=12, slowperiod=26, signalperiod=9) slowk, slowd = talib.STOCH(df['high'], df['low'], df['close'], fastk_period=5, slowk_period=3, slowk_matype=3, slowd_period=3, slowd_matype=0) fastk, fastd = talib.STOCHF(df['high'], df['low'], df['close'], fastk_period=20, fastd_period=10) sma5 = talib.SMA(df['close'], 5) sma10 = talib.SMA(df['close'], 10) sma20 = talib.SMA(df['close'], 20) sma60 = talib.SMA(df['close'], 60) sma120 = talib.SMA(df['close'], 120) cci = talib.CCI(df['high'], df['low'], df['close'], 20) rsi = talib.RSI(df['close'], 14) roc1 = talib.ROC(df['close'], 1) roc5 = talib.ROC(df['close'], 5) rocr1 = talib.ROCR(df['close'], 1) rocr5 = talib.ROCR(df['close'], 5) df = df.join(pd.DataFrame(pd.Series(macd, name="MACD"))) df = df.join(pd.DataFrame(pd.Series(macdsignal, name="MACDSIG"))) df = df.join(pd.DataFrame(pd.Series(slowd, name="SLOWD"))) df = df.join(pd.DataFrame(pd.Series(fastd, name="FASTD"))) df = df.join(pd.DataFrame(pd.Series(sma5, name="SMA5"))) df = df.join(pd.DataFrame(pd.Series(sma10, name="SMA10"))) df = df.join(pd.DataFrame(pd.Series(sma20, name="SMA20"))) df = df.join(pd.DataFrame(pd.Series(sma60, name="SMA60"))) df = df.join(pd.DataFrame(pd.Series(sma120, name="SMA120"))) df = df.join(pd.DataFrame(pd.Series(cci, name="CCI"))) df = df.join(pd.DataFrame(pd.Series(rsi, name="RSI"))) df = df.join(pd.DataFrame(pd.Series(roc1, name="ROC1"))) df = df.join(pd.DataFrame(pd.Series(roc5, name="ROC5"))) df = df.join(pd.DataFrame(pd.Series(rocr1, name="ROCR1"))) df = df.join(pd.DataFrame(pd.Series(rocr5, name="ROCR5"))) df = df.fillna(0) try: for i in range(4, len(df)): if df.iloc[i]['SMA10'] == 0: dis10 = 0 else: dis10 = float(df.iloc[i]['close']) / float(df.iloc[i]['SMA10']) * 100 if df.iloc[i]['SMA20'] == 0: dis20 = 0 else: dis20 = float(df.iloc[i]['close']) / float(df.iloc[i]['SMA20']) * 100 file = open("C:/Users/jini/PycharmProjects/stock/sql/sqlOra72_1.sql", 'r') # TRADE_TECH에 데이터 넣기 sqlOra72 = '' line = file.readline() while line: sqlOra72 += ' ' + line.strip('\n').strip('\t') line = file.readline() file.close() sqlOra72 = sqlOra72 % ( df.iloc[i]['tradeTime'], df.iloc[i]['stockCd'] , df.iloc[i - 3]['high'], df.iloc[i - 2]['high'], df.iloc[i - 1]['high'] , df.iloc[i]['high'], df.iloc[i - 3]['low'], df.iloc[i - 2]['low'], df.iloc[i - 1]['low'] , df.iloc[i]['low'], df.iloc[i - 3]['open'], df.iloc[i - 2]['open'], df.iloc[i - 1]['open'] , df.iloc[i]['open'], df.iloc[i - 3]['close'], df.iloc[i - 2]['close'] , df.iloc[i - 1]['close'], df.iloc[i]['close'], df.iloc[i - 3]['volume'] , df.iloc[i - 2]['volume'], df.iloc[i - 1]['volume'], df.iloc[i]['volume'] , (df.iloc[i - 2]['high'] - df.iloc[i - 3]['high']) / df.iloc[i - 3][ 'high'] , (df.iloc[i - 1]['high'] - df.iloc[i - 2]['high']) / df.iloc[i - 2][ 'high'] , (df.iloc[i]['high'] - df.iloc[i - 1]['high']) / df.iloc[i - 1]['high'] , (df.iloc[i]['high'] - df.iloc[i - 3]['high']) / df.iloc[i - 3]['high'] , (df.iloc[i]['high'] - df.iloc[i - 2]['high']) / df.iloc[i - 2]['high'] , (df.iloc[i - 2]['low'] - df.iloc[i - 3]['low']) / df.iloc[i - 3]['low'] , (df.iloc[i - 1]['low'] - df.iloc[i - 2]['low']) / df.iloc[i - 2]['low'] , (df.iloc[i]['low'] - df.iloc[i - 1]['low']) / df.iloc[i - 1]['low'] , (df.iloc[i]['low'] - df.iloc[i - 3]['low']) / df.iloc[i - 3]['low'] , (df.iloc[i]['low'] - df.iloc[i - 2]['low']) / df.iloc[i - 2]['low'] , df.iloc[i]['SMA5'], df.iloc[i]['SMA10'], df.iloc[i]['SMA20'], df.iloc[i]['SMA60'] , df.iloc[i]['SMA120'], df.iloc[i]['RSI'], df.iloc[i]['CCI'] , float(dis10) , float(dis20) , df.iloc[i]['MACD'], df.iloc[i]['MACDSIG'], df.iloc[i]['SLOWD'], df.iloc[i]['FASTD'] , (max(df.iloc[i]['high'],df.iloc[i-1]['high'],df.iloc[i-2]['high']) - min(df.iloc[i]['low'],df.iloc[i-1]['low'],df.iloc[i-2]['low'])) / min(df.iloc[i]['low'],df.iloc[i-1]['low'],df.iloc[i-2]['low']) * 100 , df.iloc[i]['MACD'] - df.iloc[i]['MACDSIG'] , (df.iloc[i]['close'] - df.iloc[i]['high']) * 100 / df.iloc[i]['high'] , (df.iloc[i]['close'] - max(df.iloc[i]['high'],df.iloc[i-1]['high'],df.iloc[i-2]['high'],df.iloc[i-3]['high'])) * 100 / max(df.iloc[i]['high'],df.iloc[i-1]['high'],df.iloc[i-2]['high'],df.iloc[i-3]['high']) , (df.iloc[i]['open'] - max(df.iloc[i]['high'],df.iloc[i-1]['high'],df.iloc[i-2]['high'],df.iloc[i-3]['high'])) * 100 / max(df.iloc[i]['high'],df.iloc[i-1]['high'],df.iloc[i-2]['high'],df.iloc[i-3]['high']) , (df.iloc[i]['close'] - min(df.iloc[i]['low'],df.iloc[i-1]['low'],df.iloc[i-2]['low'])) * 100 / min(df.iloc[i]['low'],df.iloc[i-1]['low'],df.iloc[i-2]['low']) , df.iloc[i]['tradeTime']) try: self.kiwoom.updateDBOra(sqlOra72) except Exception as e: print(e) except Exception as e: print(e) except Exception as e: print(e) except Exception as e: print(e) print("["+ datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S") + "] " + "Process2 : 보조지표 만들기 끝!" )
def execute(self): return np.array([ self.open, self.high, self.low, self.close, self.volume, talib.HT_DCPERIOD(self.close), talib.HT_DCPHASE(self.close), talib.HT_PHASOR(self.close)[0], talib.HT_PHASOR(self.close)[1], talib.HT_SINE(self.close)[0], talib.HT_SINE(self.close)[1], talib.HT_TRENDMODE(self.close), talib.ADX(self.high, self.low, self.close), talib.ADXR(self.high, self.low, self.close), talib.APO(self.close), talib.AROON(self.high, self.low)[0], talib.AROON(self.high, self.low)[1], talib.AROONOSC(self.high, self.low), talib.BOP(self.open, self.high, self.low, self.close), talib.CCI(self.high, self.low, self.close), talib.CMO(self.close), talib.DX(self.high, self.low, self.close), talib.MACD(self.close)[0], talib.MACD(self.close)[1], talib.MACD(self.close)[2], talib.MACDEXT(self.close)[0], talib.MACDEXT(self.close)[1], talib.MACDEXT(self.close)[2], talib.MACDFIX(self.close)[0], talib.MACDFIX(self.close)[1], talib.MACDFIX(self.close)[2], talib.MFI(self.high, self.low, self.close, self.volume), talib.MINUS_DI(self.high, self.low, self.close), talib.MINUS_DM(self.high, self.low), talib.MOM(self.close), talib.PLUS_DI(self.high, self.low, self.close), talib.PLUS_DM(self.high, self.low), talib.PPO(self.close), talib.ROC(self.close), talib.ROCP(self.close), talib.ROCR(self.close), talib.ROCR100(self.close), talib.RSI(self.close), talib.STOCH(self.high, self.low, self.close)[0], talib.STOCH(self.high, self.low, self.close)[1], talib.STOCHF(self.high, self.low, self.close)[0], talib.STOCHF(self.high, self.low, self.close)[1], talib.STOCHRSI(self.close)[0], talib.STOCHRSI(self.close)[1], talib.TRIX(self.close), talib.ULTOSC(self.high, self.low, self.close), talib.WILLR(self.high, self.low, self.close), talib.BBANDS(self.close)[0], talib.BBANDS(self.close)[1], talib.BBANDS(self.close)[2], talib.DEMA(self.close), talib.EMA(self.close), talib.HT_TRENDLINE(self.close), talib.KAMA(self.close), talib.MA(self.close), talib.MAMA(self.close)[0], talib.MAMA(self.close)[1], talib.MIDPOINT(self.close), talib.MIDPRICE(self.high, self.low), talib.SAR(self.high, self.low), talib.SAREXT(self.high, self.low), talib.T3(self.close), talib.TEMA(self.close), talib.TRIMA(self.close), talib.WMA(self.close), talib.AVGPRICE(self.open, self.high, self.low, self.close), talib.MEDPRICE(self.high, self.low), talib.TYPPRICE(self.high, self.low, self.close), talib.WCLPRICE(self.high, self.low, self.close), talib.ATR(self.high, self.low, self.close), talib.NATR(self.high, self.low, self.close), talib.TRANGE(self.high, self.low, self.close), talib.AD(self.high, self.low, self.close, self.volume), talib.ADOSC(self.high, self.low, self.close, self.volume), talib.OBV(self.close, self.volume), talib.CDL2CROWS(self.open, self.high, self.low, self.close), talib.CDL3BLACKCROWS(self.open, self.high, self.low, self.close), talib.CDL3INSIDE(self.open, self.high, self.low, self.close), talib.CDL3LINESTRIKE(self.open, self.high, self.low, self.close), talib.CDL3OUTSIDE(self.open, self.high, self.low, self.close), talib.CDL3STARSINSOUTH(self.open, self.high, self.low, self.close), talib.CDL3WHITESOLDIERS(self.open, self.high, self.low, self.close), talib.CDLABANDONEDBABY(self.open, self.high, self.low, self.close), talib.CDLADVANCEBLOCK(self.open, self.high, self.low, self.close), talib.CDLBELTHOLD(self.open, self.high, self.low, self.close), talib.CDLBREAKAWAY(self.open, self.high, self.low, self.close), talib.CDLCLOSINGMARUBOZU(self.open, self.high, self.low, self.close), talib.CDLCONCEALBABYSWALL(self.open, self.high, self.low, self.close), talib.CDLCOUNTERATTACK(self.open, self.high, self.low, self.close), talib.CDLDARKCLOUDCOVER(self.open, self.high, self.low, self.close), talib.CDLDOJI(self.open, self.high, self.low, self.close), talib.CDLDOJISTAR(self.open, self.high, self.low, self.close), talib.CDLDRAGONFLYDOJI(self.open, self.high, self.low, self.close), talib.CDLENGULFING(self.open, self.high, self.low, self.close), talib.CDLEVENINGDOJISTAR(self.open, self.high, self.low, self.close), talib.CDLEVENINGSTAR(self.open, self.high, self.low, self.close), talib.CDLGAPSIDESIDEWHITE(self.open, self.high, self.low, self.close), talib.CDLGRAVESTONEDOJI(self.open, self.high, self.low, self.close), talib.CDLHAMMER(self.open, self.high, self.low, self.close), talib.CDLHANGINGMAN(self.open, self.high, self.low, self.close), talib.CDLHARAMI(self.open, self.high, self.low, self.close), talib.CDLHARAMICROSS(self.open, self.high, self.low, self.close), talib.CDLHIGHWAVE(self.open, self.high, self.low, self.close), talib.CDLHIKKAKE(self.open, self.high, self.low, self.close), talib.CDLHIKKAKEMOD(self.open, self.high, self.low, self.close), talib.CDLHOMINGPIGEON(self.open, self.high, self.low, self.close), talib.CDLIDENTICAL3CROWS(self.open, self.high, self.low, self.close), talib.CDLINNECK(self.open, self.high, self.low, self.close), talib.CDLINVERTEDHAMMER(self.open, self.high, self.low, self.close), talib.CDLKICKING(self.open, self.high, self.low, self.close), talib.CDLKICKINGBYLENGTH(self.open, self.high, self.low, self.close), talib.CDLLADDERBOTTOM(self.open, self.high, self.low, self.close), talib.CDLLONGLEGGEDDOJI(self.open, self.high, self.low, self.close), talib.CDLLONGLINE(self.open, self.high, self.low, self.close), talib.CDLMARUBOZU(self.open, self.high, self.low, self.close), talib.CDLMATCHINGLOW(self.open, self.high, self.low, self.close), talib.CDLMATHOLD(self.open, self.high, self.low, self.close), talib.CDLMORNINGDOJISTAR(self.open, self.high, self.low, self.close), talib.CDLMORNINGSTAR(self.open, self.high, self.low, self.close), talib.CDLONNECK(self.open, self.high, self.low, self.close), talib.CDLPIERCING(self.open, self.high, self.low, self.close), talib.CDLRICKSHAWMAN(self.open, self.high, self.low, self.close), talib.CDLRISEFALL3METHODS(self.open, self.high, self.low, self.close), talib.CDLSEPARATINGLINES(self.open, self.high, self.low, self.close), talib.CDLSHOOTINGSTAR(self.open, self.high, self.low, self.close), talib.CDLSHORTLINE(self.open, self.high, self.low, self.close), talib.CDLSPINNINGTOP(self.open, self.high, self.low, self.close), talib.CDLSTALLEDPATTERN(self.open, self.high, self.low, self.close), talib.CDLSTICKSANDWICH(self.open, self.high, self.low, self.close), talib.CDLTAKURI(self.open, self.high, self.low, self.close), talib.CDLTASUKIGAP(self.open, self.high, self.low, self.close), talib.CDLTHRUSTING(self.open, self.high, self.low, self.close), talib.CDLTRISTAR(self.open, self.high, self.low, self.close), talib.CDLUNIQUE3RIVER(self.open, self.high, self.low, self.close), talib.CDLUPSIDEGAP2CROWS(self.open, self.high, self.low, self.close), talib.CDLXSIDEGAP3METHODS(self.open, self.high, self.low, self.close), ]).transpose()
def execute(self): ema = talib.EMA(self.close, self.ema_period) rsi = talib.RSI(self.close, self.rsi_period) stoch_K, stoch_D = talib.STOCHF(self.high, self.low, self.close, fastk_period=self.stoch_period) macd, macdsignal, macdhist = talib.MACD(self.close) sar = talib.SAR(self.high, self.low) mom = talib.MOM(self.close, self.mom_period) adx = talib.ADX(self.high, self.low, self.close, self.adx_period) willr = talib.WILLR(self.high, self.low, self.close, self.willr_period) cci = talib.CCI(self.high, self.low, self.close, self.cci_period) roc = talib.ROC(self.close, self.roc_period) stochrsi_K, stochrsi_D = talib.STOCHRSI(self.close, self.stochrsi_period) trix = talib.TRIX(self.close, self.trix_period) mfi = talib.MFI(self.high, self.low, self.close, self.volume, self.mfi_period) ultosc = talib.ULTOSC(self.high, self.low, self.close, self.ultosc_1_period, self.ultosc_2_period, self.ultosc_3_period) aroon_down, aroon_up = talib.AROON(self.high, self.low, self.aroon_period) aroonosc = talib.AROONOSC(self.high, self.low, self.aroonosc_period) atr = talib.ATR(self.high, self.low, self.close, self.atr_period) ad = talib.AD(self.high, self.low, self.close, self.volume) obv = talib.OBV(self.close, self.volume) adosc = talib.ADOSC(self.high, self.low, self.close, self.volume, self.adoscfast_period, self.adoscslow_period) spread_ema = ema - self.close spread_stoch = stoch_K - stoch_D spread_stochrsi = stochrsi_K - stochrsi_D spread_aroon = aroon_up - aroon_down return np.array([ self.close, spread_ema, rsi, macd, macdhist, stoch_K, spread_stoch, sar, mom, adx, willr, cci, roc, spread_stochrsi, trix, mfi, ultosc, aroon_down, aroon_up, spread_aroon, aroonosc, atr, ad, obv, adosc, ]).transpose()
def STOCHF(data, **kwargs): _check_talib_presence() _, phigh, plow, pclose, _ = _extract_ohlc(data) return talib.STOCHF(phigh, plow, pclose, **kwargs)
def STOCHF(DataFrame, fastk_period=5, fastd_period=3, fastd_matype=0): fastk, fastd = talib.STOCHF(DataFrame.high.values, DataFrame.low.values, DataFrame.close.values, fastk_period, fastd_period, fastd_matype) return pd.DataFrame({'STOCHF_FASTK': fastk, 'STOCHF_FASTD': fastd}, index=DataFrame.index)
def add_momentum_indicators(data_list): # (momentum) Indicators common for all Time-frames for data in data_list: # 1) ADX - Average Directional Movement Index real = talib.ADX(data.High, data.Low, data.Close, timeperiod=14) data['ADX_14'] = real # 2) ADXR - Average Directional Movement Index Rating real = talib.ADXR(data.High, data.Low, data.Close, timeperiod=14) data['ADXR_14'] = real # 3) APO - Absolute Price Oscillator real = talib.APO(data.Close, fastperiod=12, slowperiod=26, matype=0) data['APO'] = real # 4) AROON - Aroon aroondown, aroonup = talib.AROON(data.High, data.Low, timeperiod=14) data['Aroon_down_14'] = aroondown data['Aroon_up_14'] = aroonup # 5) AROONOSC - Aroon Oscillator real = talib.AROONOSC(data.High, data.Low, timeperiod=14) data['AROONOSC_14'] = real # 6) BOP - Balance Of Power real = talib.BOP(data.Open, data.High, data.Low, data.Close) data['BOP'] = real # 7) CCI - Commodity Channel Index real = talib.CCI(data.High, data.Low, data.Close, timeperiod=14) data['CCI_14'] = real # 8) CMO - Chande Momentum Oscillator real = talib.CMO(data.Close, timeperiod=14) data['CMO_14'] = real # 9) DX - Directional Movement Index real = talib.DX(data.High, data.Low, data.Close, timeperiod=14) data['DMI_14'] = real # 10) MACD - Moving Average Convergence/Divergence macd, macdsignal, macdhist = talib.MACD(data.Close, fastperiod=12, slowperiod=26, signalperiod=9) data['macd'] = macd data['macd_sig'] = macdsignal data['macd_hist'] = macdhist # 11) MFI - Money Flow Index real = talib.MFI(data.High, data.Low, data.Close, data.Volume, timeperiod=14) data['MFT_14'] = real # 12) MINUS_DI - Minus Directional Indicator real = talib.MINUS_DI(data.High, data.Low, data.Close, timeperiod=14) data['MINUS_DI_14'] = real # 13) MINUS_DM - Minus Directional Movement real = talib.MINUS_DM(data.High, data.Low, timeperiod=14) data['MINUS_DM_14'] = real # 14) MOM - Momentum real = talib.MOM(data.Close, timeperiod=14) data['MOM_14'] = real # 15) PLUS_DI - Plus Directional Indicator real = talib.PLUS_DI(data.High, data.Low, data.Close, timeperiod=14) data['PLUS_DI_14'] = real # 16) PLUS_DM - Plus Directional Movement real = talib.PLUS_DM(data.High, data.Low, timeperiod=14) data['PLUS_DM_14'] = real # 17) PPO - Percentage Price Oscillator real = talib.PPO(data.Close, fastperiod=12, slowperiod=26, matype=0) data['PPO'] = real # 18) ROC - Rate of change : ((price/prevPrice)-1)*100 real = talib.ROC(data.Close, timeperiod=14) data['ROC_14'] = real # 19) RSI - Relative Strength Index real = talib.RSI(data.Close, timeperiod=14) data['RSI_14'] = real # 20) STOCH - Stochastic slowk, slowd = talib.STOCH(data.High, data.Low, data.Close, fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0) data['slowk'] = slowk data['slowd'] = slowd # 21) STOCHF - Stochastic Fast fastk, fastd = talib.STOCHF(data.High, data.Low, data.Close, fastk_period=5, fastd_period=3, fastd_matype=0) data['fastk'] = fastk data['fastd'] = fastd # 22) TRIX - 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA real = talib.TRIX(data.Close, timeperiod=20) data['TRIX_20'] = real # 23) ULTOSC - Ultimate Oscillator real = talib.ULTOSC(data.High, data.Low, data.Close, timeperiod1=7, timeperiod2=14, timeperiod3=28) data['ULTOSC'] = real # 24) WILLR - Williams' %R real = talib.WILLR(data.High, data.Low, data.Close, timeperiod=14) data['WILLR_14'] = real data_weekly = data_list[6] data_monthly = data_list[7] data_15min = data_list[2] data_daily = data_list[5] data_60min = data_list[4] data_1min = data_list[0] data_5min = data_list[1] data_30min = data_list[3] # Create (momentum) indicators for a only to a particular timeframe here.. return data_list
def third_making_indicator(dataframe): Open_lis = np.array(dataframe['open'], dtype='float') High_lis = np.array(dataframe['high'], dtype='float') Low_lis = np.array(dataframe['low'], dtype='float') Clz_lis = np.array(dataframe['weigted_price'], dtype='float') Vol_lis = np.array(dataframe['volume'], dtype='float') ##지표## SMA_3_H = ta.SMA(High_lis, timeperiod=3) SMA_3_L = ta.SMA(Low_lis, timeperiod=3) SMA_3_C = ta.SMA(Clz_lis, timeperiod=3) SMA_5_H = ta.SMA(High_lis, timeperiod=5) SMA_5_L = ta.SMA(Low_lis, timeperiod=5) SMA_5_C = ta.SMA(Clz_lis, timeperiod=5) SMA_7_H = ta.SMA(High_lis, timeperiod=7) SMA_7_L = ta.SMA(Low_lis, timeperiod=7) SMA_7_C = ta.SMA(Clz_lis, timeperiod=7) RSI_3_H = ta.RSI(High_lis, timeperiod=3) RSI_3_L = ta.RSI(Low_lis, timeperiod=3) RSI_3_C = ta.RSI(Clz_lis, timeperiod=3) RSI_5_H = ta.RSI(High_lis, timeperiod=5) RSI_5_L = ta.RSI(Low_lis, timeperiod=5) RSI_5_C = ta.RSI(Clz_lis, timeperiod=5) RSI_7_H = ta.RSI(High_lis, timeperiod=7) RSI_7_L = ta.RSI(Low_lis, timeperiod=7) RSI_7_C = ta.RSI(Clz_lis, timeperiod=7) ADX = ta.ADX(High_lis, Low_lis, Clz_lis, timeperiod=7) ADXR = ta.ADXR(High_lis, Low_lis, Clz_lis, timeperiod=7) ADX_2 = ta.ADX(High_lis, Low_lis, Clz_lis, timeperiod=5) ADXR_2 = ta.ADXR(High_lis, Low_lis, Clz_lis, timeperiod=5) Aroondown, Aroonup = ta.AROON(High_lis, Low_lis, timeperiod=14) Aroondown_2, Aroonup_2 = ta.AROON(High_lis, Low_lis, timeperiod=7) Aroonosc = ta.AROONOSC(High_lis, Low_lis, timeperiod=14) Aroonosc_2 = ta.AROONOSC(High_lis, Low_lis, timeperiod=7) BOP = ta.BOP(Open_lis, High_lis, Low_lis, Clz_lis) CMO = ta.CMO(Clz_lis, timeperiod=7) DX = ta.DX(High_lis, Low_lis, Clz_lis, timeperiod=7) MINUS_DI = ta.MINUS_DI(High_lis, Low_lis, Clz_lis, timeperiod=7) PLUSDI = ta.PLUS_DI(High_lis, Low_lis, Clz_lis, timeperiod=7) PPO = ta.PPO(Clz_lis, fastperiod=12, slowperiod=26, matype=0) PPO_2 = ta.PPO(Clz_lis, fastperiod=6, slowperiod=13, matype=0) ROCR100 = ta.ROCR100(Clz_lis, timeperiod=10) ROCR100_2 = ta.ROCR100(Clz_lis, timeperiod=5) STOCHF_f, _ = ta.STOCHF(High_lis, Low_lis, Clz_lis, fastk_period=3, fastd_period=2, fastd_matype=0) Fastk, _ = ta.STOCHRSI(Clz_lis, timeperiod=7, fastk_period=5, fastd_period=3, fastd_matype=0) TRIX = ta.TRIX(Clz_lis, timeperiod=7) ULTOSC = ta.ULTOSC(High_lis, Low_lis, Clz_lis, timeperiod1=7, timeperiod2=14, timeperiod3=28) WILLR = ta.WILLR(High_lis, Low_lis, Clz_lis, timeperiod=14) WILLR_2 = ta.WILLR(High_lis, Low_lis, Clz_lis, timeperiod=7) NATR = ta.NATR(High_lis, Low_lis, Clz_lis, timeperiod=7) integer = ta.HT_TRENDMODE(Clz_lis) #append dataframe['SMA_3_H'] = SMA_3_H dataframe['SMA_3_L'] = SMA_3_L dataframe['SMA_3_C'] = SMA_3_C dataframe['SMA_5_H'] = SMA_5_H dataframe['SMA_5_L'] = SMA_5_L dataframe['SMA_5_C'] = SMA_5_C dataframe['SMA_7_H'] = SMA_7_H dataframe['SMA_7_L'] = SMA_7_L dataframe['SMA_7_C'] = SMA_7_C dataframe['RSI_3_H'] = (RSI_3_H / 100.) * 2 - 1. dataframe['RSI_3_L'] = (RSI_3_L / 100.) * 2 - 1. dataframe['RSI_3_C'] = (RSI_3_C / 100.) * 2 - 1. dataframe['RSI_5_H'] = (RSI_5_H / 100.) * 2 - 1. dataframe['RSI_5_L'] = (RSI_5_L / 100.) * 2 - 1. dataframe['RSI_5_C'] = (RSI_5_C / 100.) * 2 - 1. dataframe['RSI_7_H'] = (RSI_7_H / 100.) * 2 - 1. dataframe['RSI_7_L'] = (RSI_7_L / 100.) * 2 - 1. dataframe['RSI_7_C'] = (RSI_7_C / 100.) * 2 - 1. dataframe['ADX'] = (ADX / 100.) * 2 - 1. dataframe['ADX_2'] = (ADX_2 / 100.) * 2 - 1. dataframe['ADXR'] = (ADXR / 100.) * 2 - 1. dataframe['ADXR_2'] = (ADXR_2 / 100.) * 2 - 1. dataframe['Aroondown'] = (Aroondown / 100.) * 2 - 1 dataframe['Aroondown_2'] = (Aroondown_2 / 100.) * 2 - 1 dataframe['Aroonup'] = (Aroonup / 100.) * 2 - 1 dataframe['Aroonup_2'] = (Aroonup_2 / 100.) * 2 - 1 dataframe['Aroonosc'] = Aroonosc / 100. dataframe['Aroonosc_2'] = Aroonosc_2 / 100. dataframe['BOP'] = BOP dataframe['CMO'] = CMO / 100. dataframe['DX'] = (DX / 100.) * 2 - 1 dataframe['MINUS_DI'] = (MINUS_DI / 100.) * 2 - 1 dataframe['PLUSDI'] = (PLUSDI / 100.) * 2 - 1 dataframe['PPO'] = PPO dataframe['PPO_2'] = PPO_2 dataframe['ROCR100'] = ((ROCR100 / 100.) - 1.0) * 100. dataframe['STOCHF_f'] = (STOCHF_f / 100.) * 2 - 1 dataframe['Fastk'] = (Fastk / 100.) * 2 - 1 dataframe['TRIX'] = TRIX * 10. dataframe['ULTOSC'] = (ULTOSC / 100.) * 2 - 1 dataframe['WILLR'] = (WILLR / 100.) * 2 + 1 dataframe['WILLR_2'] = (WILLR_2 / 100.) * 2 + 1 dataframe['NATR'] = NATR * 2 - 1 dataframe['integer'] = integer return dataframe
def ExecuteTrendFollowing(self, exchange, moneta, tool, risultato): #Attention: static stoploss and dynamic stoploss cannot be activated simultaneously tool.attivazione_stoploss_statico = 0 #with zero not activated, with 1 activated tool.attivazione_stoploss_dinamico = 1 # with zero not activated, with 1 activated tool.profitto = 0.4 #minimum percentage of profit tool.stoploss_1 = 0.8 #percentage of stoploss tool.stoploss_2 = 2.0 #second level stoploss percentage (not active for now) tool.commissioni = 0.25 #percentage of fees in buy and sell tool.nrtransizioni = 2000 #do not use tool.stoploss_dinamico_moltiplicatore = 0.997 #multiplier of the trailing stop tool.stoploss_dinamico_formula = "row.close * tool.stoploss_dinamico_moltiplicatore" #formula per il calcolo dello stoploss dinamico (trailing stop) tool.attivazione_stoploss_dinamico_limiti = 1 #with zero not activated, with 1 activated. It works if dynamic stoploss is activated tool.stoploss_dinamico_min_profitto = 0.30 #minimum profit compared to lastbuy if activated stoploss_dinamico_limiti tool.stoploss_dinamico_max_perdita = 2 #max loss in percentage compared to lastbuy if activated stoploss_dinamico_limiti tool.hours = 36 #timedelta from now tool.periodo = '5m' #candlestick timeframe self.nome = " Test Strategy Trend Following " candle = candlestick.Candlestick() self.df1 = candle.getCandle(exchange, moneta, tool.hours, tool.periodo) moneta = moneta exchange = exchange self.df1 = self.df1.apply(pd.to_numeric) #-------------Indicators and oscillators self.df1['rsi'] = ta.RSI(self.df1.close.values, timeperiod=14) self.df1['adx'] = ta.ADX(self.df1['high'].values, self.df1['low'].values, self.df1['close'].values, timeperiod=14) # Bollinger bands with qtpylib-------------------------------------- """ bollinger = qt.bollinger_bands(qt.typical_price(self.df1), window=20, stds=2) self.df1['lower'] = bollinger['lower'] self.df1['middle'] = bollinger['mid'] self.df1['upper'] = bollinger['upper'] """ #------------------------------------------------------------------ # Bollinger bands with TA library self.df1['upper'], self.df1['middle'], self.df1['lower'] = ta.BBANDS( self.df1['close'].values, timeperiod=5,nbdevup=1,nbdevdn=1, matype=1) self.df1['upper2'], self.df1['middle2'], self.df1[ 'lower2'] = ta.BBANDS(self.df1['close'].values, timeperiod=5,nbdevup=1.6,nbdevdn=1.6, matype=1) self.df1['upper3'], self.df1['middle3'], self.df1[ 'lower3'] = ta.BBANDS(self.df1['close'].values, timeperiod=5,nbdevup=2,nbdevdn=2, matype=1) #------------------------------------------------------------------ self.df1['PrezzoMed'] = self.df1['close'].mean() self.df1['STDDEV'] = ta.STDDEV(self.df1['close'].values, timeperiod=15, nbdev=1) self.df1['macd'], self.df1['macdsignal'], self.df1[ 'macdhist'] = ta.MACD(self.df1.close.values, fastperiod=12, slowperiod=26, signalperiod=9) self.df1['minus_di'] = ta.MINUS_DI(self.df1['high'].values, self.df1['low'].values, self.df1['close'].values, timeperiod=25) self.df1['plus_di'] = ta.PLUS_DI(self.df1['high'].values, self.df1['low'].values, self.df1['close'].values, timeperiod=25) self.df1['sar'] = ta.SAR(self.df1['high'].values, self.df1['low'].values, acceleration=0, maximum=0) self.df1['mom'] = ta.MOM(self.df1['close'].values, timeperiod=14) self.df1['atr'] = ta.ATR(self.df1['high'].values, self.df1['low'].values, self.df1['close'].values, timeperiod=14) self.df1['ema'] = ta.EMA(self.df1['close'].values, timeperiod=20) self.df1['ema1'] = ta.EMA(self.df1['close'].values, timeperiod=28) self.df1['ema2'] = ta.EMA(self.df1['close'].values, timeperiod=35) self.df1['ema3'] = ta.EMA(self.df1['close'].values, timeperiod=48) self.df1['ema50'] = ta.EMA(self.df1['close'].values, timeperiod=50) self.df1['dema20']= ta.DEMA(self.df1['close'].values, timeperiod=20) self.df1['dema50']= ta.DEMA(self.df1['close'].values, timeperiod=50) self.df1['tema20']= ta.TEMA(self.df1['close'].values, timeperiod=5) self.df1['tema50']= ta.TEMA(self.df1['close'].values, timeperiod=20) self.df1['cci'] = ta.CCI(self.df1['high'].values, self.df1['low'].values, self.df1['close'].values, timeperiod=14) #ta lib moving average self.df1['shortma']= ta.SMA(self.df1['close'].values, timeperiod=10) self.df1['longma']= ta.SMA(self.df1['close'].values, timeperiod=20) # MFI self.df1['mfi'] = ta.MFI(self.df1['high'].values,self.df1['low'].values, self.df1['close'].values, self.df1['volume'].values, timeperiod=14) # Stoch self.df1['slowk'],self.df1['slowd'] = ta.STOCH(self.df1['high'].values,self.df1['low'].values, self.df1['close'].values) # Hammer: values [0, 100] - pattern recognised self.df1['CDLHAMMER'] = ta.CDLHAMMER(self.df1['open'].values,self.df1['high'].values,self.df1['low'].values, self.df1['close'].values) # Inverted Hammer: values self.df1['CDLINVERTEDHAMMER'] = ta.CDLINVERTEDHAMMER(self.df1['open'].values,self.df1['high'].values,self.df1['low'].values, self.df1['close'].values) # Engulfing self.df1['CDLENGULFING'] = ta.CDLENGULFING(self.df1['open'].values,self.df1['high'].values,self.df1['low'].values, self.df1['close'].values) # Hiddake self.df1['CDLHIKKAKE'] = ta.CDLHIKKAKE(self.df1['open'].values,self.df1['high'].values,self.df1['low'].values, self.df1['close'].values) # Doji self.df1['CDLDOJI'] = ta.CDLDOJI(self.df1['open'].values,self.df1['high'].values,self.df1['low'].values, self.df1['close'].values) # DojiStar self.df1['CDLDOJISTAR'] = ta.CDLDOJISTAR(self.df1['open'].values,self.df1['high'].values,self.df1['low'].values, self.df1['close'].values) # Stoch fast self.df1['fastk'], self.df1['fastd'] = ta.STOCHF(self.df1.high.values, self.df1.low.values, self.df1.close.values) # Inverse Fisher transform on RSI, values [-1.0, 1.0] (https://goo.gl/2JGGoy) rsi = 0.1 * (self.df1['rsi'] - 50) self.df1['fisher_rsi'] =(np.exp(2 * rsi) - 1) / (np.exp(2 * rsi) + 1) # EMA - Exponential Moving Average self.df1['ema5'] = ta.EMA(self.df1.close.values, timeperiod=5) self.df1['ema10'] = ta.EMA(self.df1.close.values, timeperiod=10) self.df1['ema50'] = ta.EMA(self.df1.close.values, timeperiod=50) self.df1['ema100'] = ta.EMA(self.df1.close.values, timeperiod=100) # SMA - Simple Moving Average self.df1['sma'] = ta.SMA(self.df1.close.values, timeperiod=40) #----------------------------------------------------------------------- self.df1['Sellsignal'] = 0 self.df1['Buysignal'] = 0 #---------------------example 1 strategy buy and sell ---------------------------------------- #-------------Buy conditions---------------------------------------------------------- """ self.df1.loc[((( (self.df1['macd'] > self.df1['macdsignal']) & (self.df1['cci'] <= -50.0)))),'BuySignal'] = 1 """ #-------------Sell conditions---------------------------------------------------------- """ self.df1.loc[((( (self.df1['macd'] < self.df1['macdsignal']) & (self.df1['cci'] >= 100.0)))),'SellSignal'] = -1 """ #------------------------example 2 strategy buy and sell--------------------------------------- #-------------Buy conditions---------------------------------------------------------- """ self.df1.loc[((( (self.df1['adx'] > 25) & (self.df1['mom'] < 0) & (self.df1['minus_di'] > 25) & (self.df1['plus_di'] < self.df1['minus_di'])))),'BuySignal'] = 1 """ #-------------Sell conditions---------------------------------------------------------- """ self.df1.loc[((( (self.df1['adx'] > 25) & (self.df1['mom'] > 0) & (self.df1['minus_di'] > 25) & (self.df1['plus_di'] > self.df1['minus_di'])))),'SellSignal'] = -1 """ # -------------------------------------------------------------------------- #example 3 strategy macd and midprice with qtpylib Sell & Buy #-------------Sell conditions---------------------------------------------------------- self.df1.loc[((( self.qt.crossed_below(self.df1['macd'], self.df1['macdsignal'])))), 'Sellsignal'] = -1 #-------------Buy conditions---------------------------------------------------------- self.df1.loc[((( self.qt.crossed_above(self.df1['macd'], self.df1['macdsignal'])) & (self.df1['close'] < self.df1['PrezzoMed']))), 'Buysignal'] = 1 # -------------------------------------------------------------------------- #example 4 strategy Bollinger Bands with rsi #-------------Buy conditions---------------------------------------------------------- """ self.df1.loc[ ((self.df1['close'] < self.df1['lower']) & (self.df1['rsi'] < 30) ),'Buysignal'] = 1 #-------------Sell conditions---------------------------------------------------------- self.df1.loc[ ((self.df1['close']>self.df1['upper']) | (self.df1['rsi'] > 70) ),'Sellsignal'] = -1 """ #--------------------------------------------------------------------------- #example 5 Bollinger Bands with rsi qtpylib library Sell & Buy #-------------Buy conditions---------------------------------------------------------- """ self.df1.loc[ ( (self.df1['rsi'] < 30) & (self.df1['close'] < self.df1['lower']) ), 'Buysignal'] = 1 #------------Sell conditions-------------------------------------------- self.df1.loc[ ( (self.df1['rsi'] > 70) ), 'Sellsignal'] = -1 """ # -------------------------------------------------------------------------- #example 6 strategy longma and shortma with qtpylib Sell & Buy #-------------Sell conditions---------------------------------------------------------- """ self.df1.loc[((( self.qt.crossed_below(self.df1['shortma'], self.df1['longma'])))), 'Sellsignal'] = -1 #-------------Buy and Sell conditions---------------------------------------------------------- self.df1.loc[((( self.qt.crossed_above(self.df1['shortma'], self.df1['longma'])) & (self.df1['close'] < self.df1['PrezzoMed']))), 'Buysignal'] = 1 """ #-------------------------------------------------------------------------- #example 7 strategy with qtpylib and TA-lib Sell & Buy #-------------Buy conditions-------------------------------- """ self.df1.loc[ ( (self.df1['rsi'] < 28) & (self.df1['rsi'] > 0) & (self.df1['close'] < self.df1['sma']) & (self.df1['fisher_rsi'] < -0.94) & (self.df1['mfi'] < 16.0) & ( (self.df1['ema50'] > self.df1['ema100']) | (qt.crossed_above(self.df1['ema5'], self.df1['ema10'])) ) & (self.df1['fastd'] > self.df1['fastk']) & (self.df1['fastd'] > 0) ), 'Buysignal'] = 1 #------------Sell conditions--------------------------------------------- self.df1.loc[ ( (self.df1['sar'] > self.df1['close']) & (self.df1['fisher_rsi'] > 0.3) ), 'Sellsignal'] = -1 """ # ---------------------------------------------------------------------- #example 8 strategy - multiple indicators with pattern indicator HAMMER #------------------Sell conditions-------------------------------------- """ self.df1.loc[ ( (self.df1['rsi'] < 30) & (self.df1['slowk'] < 20) & (self.df1['lower'] > self.df1['close']) & (self.df1['CDLHAMMER'] == 100) ), 'Buysignal'] = 1 #---------------Buy conditions------------------------------------------ self.df1.loc[ ( (self.df1['sar'] > self.df1['close']) & (self.df1['fisher_rsi'] > 0.3) ), 'Sellsignal'] = -1 """ # ---------------------------------------------------------------------- #example 9 strategy pattern strategy ENGULFING strategy Sell and Buy #---------------Sell conditions------------------------------------------ """ print(self.df1['CDLENGULFING'].values) self.df1.loc[ ( (self.df1['CDLENGULFING'].values < -99) ), 'Buysignal'] = 1 #---------------Buy conditions------------------------------------------ self.df1.loc[ ( (self.df1['CDLENGULFING'].values > 99) ), 'Sellsignal'] = -1 """ #--------------------------------------------------------------------------------- #example 10 strategy Bollinger Bands with rsi with technical indicators Sell & Buy """risultati_index_buy = self.df1.index[self.df1['CDLINVERTEDHAMMER'] == 100].tolist() risultato_last_index = self.df1.index[-1] if ((risultati_index_buy == None) or (risultato_last_index == None) or (risultato_last_index == '') or (len(risultati_index_buy) == 0)): print('None Result') else: risultato_last_index = str(risultati_index_buy[-1]) risultato_last_index = risultato_last_index[:-3] risultato_last_index = (str(risultato_last_index))[:-3] #rimozione dei tre caratteri data1 = datetime.fromtimestamp(int(risultato_last_index)) data2 = datetime.fromtimestamp(int(risultato_last_index)) print(data2,data1) print(self.df1) #------------------Buy conditions---------------------------------- self.df1.loc[( self.df1['CDLINVERTEDHAMMER'] == 100 ),'CDLHIKKAKE_CLOSE'] = self.df1['close'] self.df1.loc[ ( (self.df1['close'] < self.df1['lower3']) ) ,'Buysignal'] = 1 #------------------Sell conditions---------------------------------- self.df1.loc[ ( self.qt.crossed_above(self.df1['dema20'], self.df1['dema50']) ),'Sellsignal'] = -1 """ #---------------------------------------------------------------------- #example 11 strategy DOJISTAR strategy Sell and Buy #---------------Buy conditions------------------------------------------ """ self.df1.loc[ ( (self.df1['CDLDOJISTAR'].values == -100) ), 'Buysignal'] = 1 #---------------Sell conditions---------------------------------------- self.df1.loc[ ( (self.df1['CDLHIKKAKE'].values == 200) ), 'Sellsignal'] = -1 """ #----------------------------------------------------------------------- #example 12 strategy DEMA of EMA BuySignal and SellSignal #---------------Buy conditions------------------------------------------ """ self.df1.loc[((( self.qt.crossed_below(self.df1['ema50'], self.df1['dema200'])))), 'BuySignal'] = 1 #---------------Sell conditions------------------------------------------ self.df1.loc[ ( (self.df1['CDLHIKKAKE'].values > 99) ), 'Sellsignal'] = -1 """ #---------------------------trailing stoploss--------------------------- #example 1 #tool.stoploss_dinamico_formula = "row.close * tool.stoploss_dinamico_moltiplicatore" #formula for calculating dynamic stoploss (trailing stop) #example 2 tool.stoploss_dinamico_formula = "row.ema3" x = [] y = [] balance = [] lower_vect = [] lower2_vect = [] upper_vect = [] upper2_vect = [] pattern_vect = [] close_vect = [] buysignal_vect = [] sellsignal_vect = [] prezzmed_vect = [] stdev_vect = [] stoplosssignal_vect = [] stoplossprezzo_vect = [] ema_vect = [] ema_long_vect = [] ema_short_vect = [] date = [] volume_vect = [] macd_vect = [] macd_signal_vect = [] macd_hist_vect = [] atr_vect = [] rsi_vect = [] i = 0 for row in self.df1.itertuples(): a = row.Index / 1000.0 b = datetime.fromtimestamp(a) self.stoploss = self.getStoploss(row, i, tool) logging.info("-----------Loop line processing " + str(i)) logging.info("1) self.stoploss value = " + str(self.stoploss)) if (i > 0): stoplossprezzo_vect.append(self.stoplossprezzo) logging.info( "2) Value of i greater than zero not first loop for i =" + str(i)) logging.info("2.1) Value of self.stoplossprezzo = " + str(self.stoplossprezzo)) else: self.stoplossprezzo = row.close * 0.99 logging.info( "2) Value of i equal to zero first loop for i = " + str(i)) stoplossprezzo_vect.append(self.stoplossprezzo) logging.info("2.1) Value of self.stoplossprezzo = " + str(self.stoplossprezzo)) if (self.stoploss == 1): logging.info( "3) self.stoploss value = 1 after getstoploss method ") x.append(i) y.append(row.close) if (row.Sellsignal == 0 and self.stoploss == 0) or (row.Sellsignal == 1 and self.stoploss == 1): logging.info("4) Value of self.stoploss before If for sell " + str(self.stoploss)) logging.info("4.1) Value of row.Sellsignal " + str(row.Sellsignal)) sellsignal_vect.append(np.nan) stoplosssignal_vect.append(np.nan) else: if (self.stoploss == 1): logging.info("5) self.stoploss value = 1 else before if ") logging.info( "5.1) Indication of sell in presence of self.stoploss = 1" ) if (self.sell == 0) and (self.buy == 1): logging.info( "5.2) Sell with self.stoploss = 1 self.stoploss = " + str(self.stoploss)) logging.info( "5.2.1) Sell with self.stoploss = 1 self.sell = " + str(self.sell)) logging.info( "5.2.2) Sell with self.stoploss = 1 self.buy = " + str(self.buy)) #increases variable by 1 num_of_trades by one self.nr_of_trades = self.nr_of_trades+1 sellsignal_vect.append(row.close) stoplosssignal_vect.append(row.close) percentualecommissioni = ( float(row.close) / 100) * float(tool.commissioni) logging.info( "5.3) Percentage of fees in presence of self.stoploss = 1" + str(percentualecommissioni)) balance.append( [row.close - (percentualecommissioni), 1]) if ((row.close - percentualecommissioni) > self.lastbuy): self.nr_positive_trades = self.nr_positive_trades +1 elif ((row.close - percentualecommissioni) < self.lastbuy): self.nr_negative_trades = self.nr_negative_trades +1 else: print('Non risulta positiva ne negativa') self.totalecommissioni = self.totalecommissioni + percentualecommissioni logging.info( "5.4) Total fees in presence of self.stoploss = 1 " + str(self.totalecommissioni)) self.sell = 1 self.buy = 0 self.stoploss = 0 logging.info( "5.5) Assign value zero to self.stoploss = " + str(self.stoploss)) logging.info("5.6) Assign value 1 to self.sell = " + str(self.sell)) logging.info("5.7) Assign value zero to self.buy = " + str(self.buy)) else: sellsignal_vect.append(np.nan) stoplosssignal_vect.append(np.nan) self.stoploss = 0 else: stoplosssignal_vect.append(np.nan) if ((self.sell == 0) and (self.buy == 1) and (tool.attivazione_stoploss_dinamico == 0)): logging.info( "6.0) Sell normal not in the presence of dynamic stoploss" ) logging.info("6.1) Value of self.sell: " + str(self.sell)) logging.info("6.2) Value of self.buy: " + str(self.buy)) logging.info( "6.3) Dynamic stoploss activation parameter value: " + str(tool.attivazione_stoploss_dinamico)) price1 = float(self.lastbuy) + ( (float(self.lastbuy)) / 100) * float(tool.profitto) logging.info("6.4) Value of self.lastbuy: " + str(self.lastbuy)) logging.info("6.5) Price1 price of sell: " + str(price1)) logging.info("6.6) Profit parameters: " + str(tool.profitto)) if (float(row.close) > float(price1)): logging.info( "6.7) Sell in presence of row.close greater than value of price1" ) logging.info("6.8) Value of row.close: " + str(row.close)) logging.info("6.9) Value of sell price: " + str(price1)) #increases variable by 1 num_of_trades by one self.nr_positive_trades = self.nr_positive_trades +1 sellsignal_vect.append(row.close) percentualecommissioni = (float( row.close) / 100) * float(tool.commissioni) logging.info( "6.9.1) Percentage of fees in presence of self.stoploss = 1 " + str(percentualecommissioni)) balance.append( [row.close - (percentualecommissioni), 1]) self.totalecommissioni = self.totalecommissioni + percentualecommissioni logging.info( "6.9.2) Total of fees in presence of self.stoploss = 1" + str(self.totalecommissioni)) self.sell = 1 self.buy = 0 self.stoploss = 0 logging.info( "6.9.3) Assign value zero to self.stoploss = " + str(self.stoploss)) logging.info( "6.9.4) Assign value 1 to self.sell = " + str(self.sell)) logging.info( "6.9.5) Assign value 0 to self.buy = " + str(self.buy)) else: sellsignal_vect.append(np.nan) else: sellsignal_vect.append(np.nan) if ((row.Buysignal == 0 or row.Buysignal == '0')): logging.info( "7) Value of self.stoploss in if row.BuySignal = 0 " + str(self.stoploss)) logging.info("7.1) Value of row.Buysignal " + str(row.Buysignal)) buysignal_vect.append(np.nan) else: if ((row.Buysignal == 1 or row.Buysignal == '1')): logging.info("8) Value of row.Buysignal " + str(row.Buysignal)) if (self.buy == '0' or self.buy == 0): logging.info( "8.1) Buy in presence of self.stoploss = " + str(self.stoploss)) logging.info("8.2) Value of self.sell = " + str(self.sell)) logging.info("8.3) Value of self.buy = " + str(self.buy)) buysignal_vect.append(row.close) percentualecommissioni = ( float(row.close) / 100) * float(tool.commissioni) logging.info( "8.4) Percentage of fees in presence of self.stoploss = 1 " + str(percentualecommissioni)) self.totalecommissioni = self.totalecommissioni + percentualecommissioni logging.info( "8.5) Total of fees in presence of stoploss = 1" + str(self.totalecommissioni)) balance.append([(-row.close - percentualecommissioni), 0]) self.buy = 1 self.sell = 0 logging.info( "8.5.1) Assign value zero to self.stoploss = " + str(self.stoploss)) logging.info( "8.5.2) Assign value zero to self.sell = " + str(self.sell)) logging.info("8.5.3) Assign value 1 to self.buy = " + str(self.buy)) if (tool.attivazione_stoploss_dinamico == 1): logging.info( "8.6) Value of tool.attivazione_stoploss_dinamico equal to : " + str(tool.attivazione_stoploss_dinamico)) self.stoplossprezzo = eval( tool.stoploss_dinamico_formula) logging.info( "8.6.1) Value of self.stoplossprezzo " + str(self.stoplossprezzo)) else: self.stoplossprezzo = (row.close - ( (row.close / 100) * tool.stoploss_1)) logging.info( "8.7) Value of self.stoplossprezzo with tool.attivazione_stoploss_dinamico equal to 1 = " + str(self.stoplossprezzo)) self.lastbuy = row.close logging.info("8.8) Value of self.lastbuy" + str(self.lastbuy)) logging.info("8.9.0) Value of self.stoploss = " + str(self.stoploss)) logging.info("8.9.1) Value of self.sell = " + str(self.sell)) logging.info("8.9.2) Value of self.buy = " + str(self.buy)) logging.info("8.9.3) Value of self.stoplossprezzo = " + str(self.stoplossprezzo)) logging.info("8.9.4) Value of self.lastbuy = " + str(self.lastbuy)) logging.info( "8.9.5) Value of tool.attivazione_stoploss_dinamico = " + str(tool.attivazione_stoploss_dinamico)) logging.info( "8.9.6) Value of tool.attivazione_stoploss_statico = " + str(tool.attivazione_stoploss_statico)) else: buysignal_vect.append(np.nan) else: buysignal_vect.append(np.nan) #add indicators,oscillators and others prezzmed_vect.append(row.PrezzoMed) stdev_vect.append(row.STDDEV) ema_vect.append(row.ema3) date.append(b) rsi_vect.append(row.rsi) #pattern_vect.append(row.CDLHIKKAKE_CLOSE) volume_vect.append(row.volume) lower2_vect.append(row.lower2) upper2_vect.append(row.upper2) ema_long_vect.append(row.tema50) ema_short_vect.append(row.tema20) lower_vect.append(row.lower) upper_vect.append(row.upper) macd_vect.append(row.macd) macd_signal_vect.append(row.macdsignal) macd_hist_vect.append(row.macdhist) atr_vect.append(row.atr) i = i + 1 self.valorestrategia = self.getValoreStrategia(balance) tool.setVisualizzaGrafico(1) if (tool.visualizzagrafico == 1 or tool.visualizzagrafico == '1'): ds = draw.Draw() ds.setNrGrafici(2) ds.draw_graphic(moneta, x, y, self.nr_of_trades, self.nr_positive_trades,self.nr_negative_trades, buysignal_vect, sellsignal_vect, prezzmed_vect, stoplossprezzo_vect, stdev_vect, self.nome, self.valorestrategia, date, ema_vect, rsi_vect,pattern_vect,volume_vect,lower2_vect, upper2_vect,ema_short_vect,ema_long_vect,lower_vect,upper_vect,macd_vect,macd_signal_vect,macd_hist_vect,atr_vect)
def Stock_Ana(arg_stock, str_prev_date, str_today): sear_comp_id = arg_stock[0] #日線資料讀取 strsql = "select quo_date, open, high, low, close, vol from STOCK_QUO " strsql += "where " strsql += "SEAR_COMP_ID='" + sear_comp_id + "' and " strsql += "QUO_DATE between '" + str_prev_date + "' and '" + str_today + "' " strsql += "order by QUO_DATE " cursor = conn.execute(strsql) result = cursor.fetchall() none_flag = False if len(result) > 0: df = pd.DataFrame( result, columns=['date', 'open', 'high', 'low', 'close', 'vol']) #print(df) else: none_flag = True #關閉cursor cursor.close() ls_result = [] if none_flag == False: #LIST轉換為Numpy Array npy_high = np.array(df['high']) npy_low = np.array(df['low']) npy_close = np.array(df['close']) stock_vol = df['vol'].tail(6) / 1000 #取近六天成交量,並由股換算為張 last_vol = df['vol'].tail(1) / 1000 #取最近一天成交量,並換算為張 last_open = df['open'].tail(1) last_close = df['close'].tail(1) prev_close = df['close'].shift(1).tail(1) avg_vol = stock_vol.mean() #取平均 #最近一天交易日,成交量漲幅 rt = 0 if avg_vol > 0: rt = (last_vol.iloc[0] - avg_vol) / avg_vol * 100 #最近一天交易日,K棒本體漲幅 kbody_chg = 0 if last_open.iloc[0] > 0: kbody_chg = (last_close.iloc[0] - last_open.iloc[0]) / last_open.iloc[0] * 100 #最近一天交易日當天漲幅 rise_rt = 0 if prev_close.iloc[0] > 0: rise_rt = (last_close.iloc[0] - prev_close.iloc[0]) / prev_close.iloc[0] * 100 #計算20MA ma20 = talib.MA(npy_close, timeperiod=20, matype=0) df['ma20'] = ma20 #最近一個交易日20MA值 last_20ma = df['ma20'].tail(1) #倒數第2個交易日20MA值 prev_20ma = df['ma20'].shift(1).tail(1) #print('## last_close=' + str(last_close)) #print(prev_close.iloc[0]) # http://www.tadoc.org/indicator/STOCH.htm slowk, slowd = talib.STOCH(npy_high, npy_low, npy_close, fastk_period=9, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0) print("slowk=" + str(slowk[-1])) print("slowd=" + str(slowd[-1])) # http://www.tadoc.org/indicator/STOCHF.htm fastk, fastd = talib.STOCHF(npy_high, npy_low, npy_close, fastk_period=9, fastd_period=9, fastd_matype=0) print("fastk=" + str(fastk[-1])) print("fastd=" + str(fastd[-1])) # http://www.tadoc.org/indicator/STOCHRSI.htm fastk, fastd = talib.STOCHRSI(npy_close, timeperiod=9, fastk_period=3, fastd_period=3, fastd_matype=0) print("fastk=" + str(fastk[-1])) print("fastd=" + str(fastd[-1])) if (prev_close.iloc[0] <= prev_20ma.iloc[0]) and \ (last_close.iloc[0] > last_20ma.iloc[0]): print("##" + arg_stock[0] + "##" + arg_stock[1] + "##\n") """ #三條均線變異數介於0~1間、最近一天成交量相對平均量成長20%、當天上漲3%以下、 #最近一天收盤價在8MA跟50MA之上、成交量均量需大於500張 if (var_val > 0 and var_val < 1) and \ rt >= 20 and \ (rise_rt > 0 and rise_rt < 3) and \ (last_close.iloc[0] > last_8ma.iloc[0]) and \ (last_close.iloc[0] > last_50ma.iloc[0]) and \ avg_vol > 500: #讀取個股籌碼資料 strsql = "select FR_BAS_CNT, IT_BAS_CNT, DE_BAS_CNT, RANK " strsql += "from REPORT_CHIP_ANA " strsql += "where " strsql += "SEAR_COMP_ID='" + sear_comp_id + "' " cursor = conn.execute(strsql) result = list(cursor.fetchone()) if len(result) > 0: fr_bas_cnt = str(result[0]) it_bas_cnt = str(result[1]) de_bas_cnt = str(result[2]) rank = result[3] else: fr_bas_cnt = "0" it_bas_cnt = "0" de_bas_cnt = "0" rank = " " #關閉cursor cursor.close() #print("##" + arg_stock[0] + "##" + arg_stock[1] + "##" + fr_bas_cnt + "##" + it_bas_cnt + "##" + de_bas_cnt + "##" + rank + "##\n") ls_result = [[arg_stock[0],arg_stock[1],var_val,rt,fr_bas_cnt,it_bas_cnt,de_bas_cnt,rank]] df_result = pd.DataFrame(ls_result, columns=['代號', '名稱', 'var', 'burst_rt','外資買賣超天數','投信買賣超天數','自營商買賣超天數','類別']) """ if len(ls_result) == 0: df_result = pd.DataFrame() return df_result
matype=0) df['ROC'] = ta.ROC(np.array(df['Adj Close'].shift(1)), timeperiod=n) df['ROCP'] = ta.ROCP(np.array(df['Adj Close'].shift(1)), timeperiod=n) df['ROCR'] = ta.ROCR(np.array(df['Adj Close'].shift(1)), timeperiod=n) df['ROCR100'] = ta.ROCR100(np.array(df['Adj Close'].shift(1)), timeperiod=n) df['slowk'], df['slowd'] = ta.STOCH(np.array(df['High'].shift(1)), np.array(df['Low'].shift(1)), np.array(df['Adj Close']), fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0) df['fastk'], df['fastd'] = ta.STOCHF(np.array(df['High'].shift(1)), np.array(df['Low'].shift(1)), np.array(df['Adj Close']), fastk_period=5, fastd_period=3, fastd_matype=0) # df['fastk'], df['fastd'] =ta.STOCHRIS(np.array(df['Adj Close'].shift(1)), timeperiod=N, fastk_period=5, fastd_period=3, fastd_matype=0) df['TRIX'] = ta.TRIX(np.array(df['Adj Close'].shift(1)), timeperiod=n) df['ULTOSC'] = ta.ULTOSC(np.array(df['High'].shift(1)), np.array(df['Low'].shift(1)), np.array(df['Adj Close']), timeperiod1=7, timeperiod2=14, timeperiod3=28) df['WILLR'] = ta.WILLR(np.array(df['High'].shift(1)), np.array(df['Low'].shift(1)), np.array(df['Adj Close'].shift(1)), timeperiod=n)
def test_stoch(self): result = pandas_ta.stoch(self.high, self.low, self.close, fast_k=14, slow_k=14, slow_d=14) self.assertIsInstance(result, DataFrame) self.assertEqual(result.name, "STOCH_14_14_14") self.assertEqual(len(result.columns), 4) result = pandas_ta.stoch(self.high, self.low, self.close) self.assertIsInstance(result, DataFrame) self.assertEqual(result.name, "STOCH_14_5_3") try: tal_stochf = tal.STOCHF(self.high, self.low, self.close) tal_stoch = tal.STOCH(self.high, self.low, self.close) tal_stochdf = DataFrame({ "STOCHF_14": tal_stochf[0], "STOCHF_3": tal_stochf[1], "STOCH_5": tal_stoch[0], "STOCH_3": tal_stoch[1] }) pdt.assert_frame_equal(result, tal_stochdf) except AssertionError as ae: try: stochfk_corr = pandas_ta.utils.df_error_analysis( result.iloc[:, 0], tal_stochdf.iloc[:, 0], col=CORRELATION) self.assertGreater(stochfk_corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result.iloc[:, 0], CORRELATION, ex) try: stochfd_corr = pandas_ta.utils.df_error_analysis( result.iloc[:, 1], tal_stochdf.iloc[:, 1], col=CORRELATION) self.assertGreater(stochfd_corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result.iloc[:, 1], CORRELATION, ex, newline=False) try: stochsk_corr = pandas_ta.utils.df_error_analysis( result.iloc[:, 2], tal_stochdf.iloc[:, 2], col=CORRELATION) self.assertGreater(stochsk_corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result.iloc[:, 2], CORRELATION, ex, newline=False) try: stochsd_corr = pandas_ta.utils.df_error_analysis( result.iloc[:, 3], tal_stochdf.iloc[:, 3], col=CORRELATION) self.assertGreater(stochsd_corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result.iloc[:, 3], CORRELATION, ex, newline=False)
def extract_by_type(self, feature_type, open_prices=None, close_prices=None, high_prices=None, low_prices=None): if feature_type == 'ROCP': rocp = talib.ROCP(close_prices, timeperiod=1) self.feature.append(rocp) if feature_type == 'OROCP': orocp = talib.ROCP(open_prices, timeperiod=1) self.feature.append(orocp) if feature_type == 'HROCP': hrocp = talib.ROCP(high_prices, timeperiod=1) self.feature.append(hrocp) if feature_type == 'LROCP': lrocp = talib.ROCP(low_prices, timeperiod=1) self.feature.append(lrocp) if feature_type == 'MACD': macd, signal, hist = talib.MACD(close_prices, fastperiod=12, slowperiod=26, signalperiod=9) norm_macd = numpy.nan_to_num(macd) / math.sqrt( numpy.var(numpy.nan_to_num(macd))) norm_signal = numpy.nan_to_num(signal) / math.sqrt( numpy.var(numpy.nan_to_num(signal))) norm_hist = numpy.nan_to_num(hist) / math.sqrt( numpy.var(numpy.nan_to_num(hist))) macdrocp = talib.ROCP(norm_macd + numpy.max(norm_macd) - numpy.min(norm_macd), timeperiod=1) signalrocp = talib.ROCP(norm_signal + numpy.max(norm_signal) - numpy.min(norm_signal), timeperiod=1) histrocp = talib.ROCP(norm_hist + numpy.max(norm_hist) - numpy.min(norm_hist), timeperiod=1) # self.feature.append(macd / 100.0) # self.feature.append(signal / 100.0) # self.feature.append(hist / 100.0) self.feature.append(norm_macd) self.feature.append(norm_signal) self.feature.append(norm_hist) self.feature.append(macdrocp) self.feature.append(signalrocp) self.feature.append(histrocp) if feature_type == 'RSI': rsi6 = talib.RSI(close_prices, timeperiod=6) rsi12 = talib.RSI(close_prices, timeperiod=12) rsi24 = talib.RSI(close_prices, timeperiod=24) rsi6rocp = talib.ROCP(rsi6 + 100., timeperiod=1) rsi12rocp = talib.ROCP(rsi12 + 100., timeperiod=1) rsi24rocp = talib.ROCP(rsi24 + 100., timeperiod=1) self.feature.append(rsi6 / 100.0 - 0.5) self.feature.append(rsi12 / 100.0 - 0.5) self.feature.append(rsi24 / 100.0 - 0.5) # self.feature.append(numpy.maximum(rsi6 / 100.0 - 0.8, 0)) # self.feature.append(numpy.maximum(rsi12 / 100.0 - 0.8, 0)) # self.feature.append(numpy.maximum(rsi24 / 100.0 - 0.8, 0)) # self.feature.append(numpy.minimum(rsi6 / 100.0 - 0.2, 0)) # self.feature.append(numpy.minimum(rsi6 / 100.0 - 0.2, 0)) # self.feature.append(numpy.minimum(rsi6 / 100.0 - 0.2, 0)) # self.feature.append(numpy.maximum(numpy.minimum(rsi6 / 100.0 - 0.5, 0.3), -0.3)) # self.feature.append(numpy.maximum(numpy.minimum(rsi6 / 100.0 - 0.5, 0.3), -0.3)) # self.feature.append(numpy.maximum(numpy.minimum(rsi6 / 100.0 - 0.5, 0.3), -0.3)) self.feature.append(rsi6rocp) self.feature.append(rsi12rocp) self.feature.append(rsi24rocp) if feature_type == 'UO': ult_osc = talib.ULTOSC(high_prices, low_prices, close_prices, timeperiod1=7, timeperiod2=14, timeperiod3=28) self.feature.append(ult_osc / 100.0 - 0.5) if feature_type == 'BOLL': upperband, middleband, lowerband = talib.BBANDS(close_prices, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0) self.feature.append((upperband - close_prices) / close_prices) self.feature.append((middleband - close_prices) / close_prices) self.feature.append((lowerband - close_prices) / close_prices) if feature_type == 'MA': ma5 = talib.MA(close_prices, timeperiod=5) ma10 = talib.MA(close_prices, timeperiod=10) ma20 = talib.MA(close_prices, timeperiod=20) ma30 = talib.MA(close_prices, timeperiod=30) ma60 = talib.MA(close_prices, timeperiod=60) ma90 = talib.MA(close_prices, timeperiod=90) ma120 = talib.MA(close_prices, timeperiod=120) ma180 = talib.MA(close_prices, timeperiod=180) #ma360 = talib.MA(close_prices, timeperiod=360) #ma720 = talib.MA(close_prices, timeperiod=720) ma5rocp = talib.ROCP(ma5, timeperiod=1) ma10rocp = talib.ROCP(ma10, timeperiod=1) ma20rocp = talib.ROCP(ma20, timeperiod=1) ma30rocp = talib.ROCP(ma30, timeperiod=1) ma60rocp = talib.ROCP(ma60, timeperiod=1) ma90rocp = talib.ROCP(ma90, timeperiod=1) ma120rocp = talib.ROCP(ma120, timeperiod=1) ma180rocp = talib.ROCP(ma180, timeperiod=1) #ma360rocp = talib.ROCP(ma360, timeperiod=1) #ma720rocp = talib.ROCP(ma720, timeperiod=1) self.feature.append(ma5rocp) self.feature.append(ma10rocp) self.feature.append(ma20rocp) self.feature.append(ma30rocp) self.feature.append(ma60rocp) self.feature.append(ma90rocp) self.feature.append(ma120rocp) self.feature.append(ma180rocp) #self.feature.append(ma360rocp) #self.feature.append(ma720rocp) self.feature.append((ma5 - close_prices) / close_prices) self.feature.append((ma10 - close_prices) / close_prices) self.feature.append((ma20 - close_prices) / close_prices) self.feature.append((ma30 - close_prices) / close_prices) self.feature.append((ma60 - close_prices) / close_prices) self.feature.append((ma90 - close_prices) / close_prices) self.feature.append((ma120 - close_prices) / close_prices) self.feature.append((ma180 - close_prices) / close_prices) #self.feature.append((ma360 - close_prices) / close_prices) #self.feature.append((ma720 - close_prices) / close_prices) if feature_type == 'STOCH': slow_stoch_k, slow_stoch_d = talib.STOCH(high_prices, low_prices, close_prices, fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0) fast_stoch_k, fast_stoch_d = talib.STOCHF(high_prices, low_prices, close_prices, fastk_period=5, fastd_period=3, fastd_matype=0) fast_rsi_k, fast_rsi_d = talib.STOCHRSI(close_prices, timeperiod=14, fastk_period=5, fastd_period=3, fastd_matype=0) self.feature.append(slow_stoch_k / 100.0 - 0.5) self.feature.append(slow_stoch_d / 100.0 - 0.5) self.feature.append(fast_stoch_k / 100.0 - 0.5) self.feature.append(fast_stoch_d / 100.0 - 0.5) self.feature.append(fast_rsi_k / 100.0 - 0.5) self.feature.append(fast_rsi_d / 100.0 - 0.5) if feature_type == 'AO': median_price = (high_prices + low_prices) / 2 ao = talib.SMA(median_price, 5) - talib.SMA(median_price, 34) self.feature.append(ao) return self.feature