def ultosc(self, time_period1: int = 7, time_period2: int = 14, time_period3: int = 28, array: bool = False) -> Union[float, np.ndarray]: """ Ultimate Oscillator. """ result = talib.ULTOSC(self.high, self.low, self.close, time_period1, time_period2, time_period3) if array: return result return result[-1]
def add_tech_ind(self, price_map): # Visit for technical indicator documentation: http://mrjbq7.github.io/ta-lib/funcs.html new_price_map = {} for symbol in price_map: symbol_data = price_map[symbol] symbol_data['osc'] = ta.ULTOSC(symbol_data['high'], symbol_data['low'], symbol_data['open'], 7, 14, 21) new_price_map[symbol] = symbol_data return new_price_map
def test_uo(self): result = pandas_ta.uo(self.high, self.low, self.close) self.assertIsInstance(result, Series) self.assertEqual(result.name, 'UO_7_14_28') try: expected = tal.ULTOSC(self.high, self.low, self.close) pdt.assert_series_equal(result, expected, check_names=False) except AssertionError as ae: try: corr = pandas_ta.utils.df_error_analysis(result, expected, col=CORRELATION) self.assertGreater(corr, CORRELATION_THRESHOLD) except Exception as ex: error_analysis(result, CORRELATION, ex)
def populateindicators(dataframe): bardata = dataframe.assign(mfi=ta.MFI(dataframe['high'], dataframe['low'], dataframe['close'], np.asarray(dataframe['volume'], dtype='float'), timeperiod=14), ultosc=ta.ULTOSC(dataframe['high'], dataframe['low'], dataframe['close']), minusdi=tab.MINUS_DI(dataframe, timeperiod=14), plusdi=tab.PLUS_DI(dataframe, timeperiod=14), rsi=tab.RSI(dataframe, timeperiod=14, price='close'), adx=tab.ADX(dataframe)) return bardata
def ultosc( client, symbol, range="6m", highcol="high", lowcol="low", closecol="close", period1=7, period2=14, period3=28, ): """This will return a dataframe of Ultimate Oscillator for the given symbol across the given range Args: client (pyEX.Client): Client symbol (string): Ticker range (string): range to use, for pyEX.chart highcol (string): column to use to calculate lowcol (string): column to use to calculate closecol (string): column to use to calculate period1 (int): period to calculate across period2 (int): period to calculate across period3 (int): period to calculate across Returns: DataFrame: result """ df = client.chartDF(symbol, range) x = t.ULTOSC( df[highcol].values.astype(float), df[lowcol].values.astype(float), df[closecol].values.astype(float), timeperiod1=period1, timeperiod2=period2, timeperiod3=period3, ) return pd.DataFrame( { highcol: df[highcol].values, lowcol: df[lowcol].values, closecol: df[closecol].values, "ultosc": x, } )
def generate_tech_data_default(stock, open_name, close_name, high_name, low_name, volume_name='vol'): open_price = stock[open_name].values close_price = stock[close_name].values low_price = stock[low_name].values high_price = stock[high_name].values volume = stock[volume_name].values data = stock.copy() data['MOM'] = talib.MOM(close_price) data['HT_DCPERIOD'] = talib.HT_DCPERIOD(close_price) data['HT_DCPHASE'] = talib.HT_DCPHASE(close_price) data['sine'], data['leadsine'] = talib.HT_SINE(close_price) data['inphase'], data['quadrature'] = talib.HT_PHASOR(close_price) data['ADXR'] = talib.ADXR(high_price, low_price, close_price) data['APO'] = talib.APO(close_price) data['AROON_UP'], _ = talib.AROON(high_price, low_price) data['CCI'] = talib.CCI(high_price, low_price, close_price) data['PLUS_DI'] = talib.PLUS_DI(high_price, low_price, close_price) data['PPO'] = talib.PPO(close_price) data['macd'], data['macd_sig'], data['macd_hist'] = talib.MACD(close_price) data['CMO'] = talib.CMO(close_price) data['ROCP'] = talib.ROCP(close_price) data['fastk'], data['fastd'] = talib.STOCHF(high_price, low_price, close_price) data['TRIX'] = talib.TRIX(close_price) data['ULTOSC'] = talib.ULTOSC(high_price, low_price, close_price) data['WILLR'] = talib.WILLR(high_price, low_price, close_price) data['NATR'] = talib.NATR(high_price, low_price, close_price) data['MFI'] = talib.MFI(high_price, low_price, close_price, volume) data['RSI'] = talib.RSI(close_price) data['AD'] = talib.AD(high_price, low_price, close_price, volume) data['OBV'] = talib.OBV(close_price, volume) data['EMA'] = talib.EMA(close_price) data['SAREXT'] = talib.SAREXT(high_price, low_price) data['TEMA'] = talib.EMA(close_price) #data = data.drop([open_name, close_name, high_name, low_name, volume_name, 'amount', 'count'], axis=1) data = drop_columns(data, [ open_name, close_name, high_name, low_name, volume_name, 'amount', 'count' ]) data = data.dropna().astype(np.float32) return data
def getCustomData(df): open = df['Open'] high = df['High'] low = df['Low'] close = df['Close'] volume = df['Volume'] df['TRENDMODE'] = ta.HT_TRENDMODE(close) df['RSI'] = ta.RSI(close,timeperiod=14) df['RSI2'] = ta.RSI(close,timeperiod=7) df['RSI3'] = ta.RSI(close,timeperiod=28) df['ADX1'] = ta.ADX(high,low,close,timeperiod=7) df['ADX2'] = ta.ADX(high,low,close,timeperiod=28) df['ADX'] = ta.ADX(high,low,close,timeperiod=14) df['SLOWK'], df['SLOWD'] = ta.STOCH(high, low, close, fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0) df['FASTK'], df['FASTD'] = ta.STOCHF(high, low, close, fastk_period=5, fastd_period=3, fastd_matype=0) df['ULTOSC'] = ta.ULTOSC(high, low, close, timeperiod1=7, timeperiod2=14, timeperiod3=28) df['WILLR'] = ta.WILLR(high, low, close, timeperiod=14)
def calc_indicators(df): po = df.open.values ph = df.high.values pl = df.low.values pc = df.close.values po = np.array(po, dtype=float) ph = np.array(ph, dtype=float) pl = np.array(pl, dtype=float) pc = np.array(pc, dtype=float) ma = [] ema = [] for i in [5, 10, 20, 60, 120]: ma.append(talib.MA(pc, i)[-1]) ema.append(talib.EMA(pc, i)[-1]) macd = talib.MACD(pc)[2][-1] rsi = talib.RSI(pc, 14)[-1] stoch = talib.STOCH(ph, pl, pc, 9, 6)[0][-1] adx = talib.ADX(ph, pl, pc, 14)[-1] cci = talib.CCI(ph, pl, pc, 14)[-1] # willr = talib.WILLR(ph, pl, pc, 14)[-1] stochrsi = talib.STOCHRSI(pc, 14)[0][-1] uo = talib.ULTOSC(ph, pl, pc)[-1] roc = pc[-1] / pc[-2] - 1 sar = talib.SAR(ph, pl)[-1] plusDI = talib.PLUS_DI(ph, pl, pc, 14)[-1] minusDI = talib.MINUS_DI(ph, pl, pc, 14)[-1] adx *= (lambda x: 1 if x > 0 else -1 if x < 0 else 0)(plusDI - minusDI) # print(ma, ema, macd, rsi, stoch, adx, cci, stochrsi, uo, roc, sar) indicators = {'ma': ma, 'ema': ema, 'macd': macd, 'rsi': rsi, 'stoch': stoch, 'adx': adx, 'cci': cci, 'stochrsi': stochrsi, 'uo': uo, 'roc': roc, 'sar': sar} return indicators
def updateIndicator(self, data, candles_visible): # ULTOSC(high, low, close, timeperiod1=7, timeperiod2=14, timeperiod3=28) ult_osc = talib.ULTOSC(data[2], data[3], data[4], timeperiod1=7, timeperiod2=14, timeperiod3=28) try: firstNotNan = np.where(np.isnan(ult_osc))[0][-1] + 1 except: firstNotNan = 0 ult_osc[:firstNotNan] = ult_osc[firstNotNan] ult_osc = ult_osc[-candles_visible:] self.line.clear() for i in range(candles_visible): self.line.append(i + 0.5, ult_osc[i]) # detach and remove old axes for ax in self.line.attachedAxes(): self.line.detachAxis(ax) for ax in self.axes(): self.removeAxis(ax) # set x axes ax = QtChart.QValueAxis() ax.setRange(0, candles_visible) ax.hide() # set y axes ay = QtChart.QValueAxis() ay.setRange(0, 100) ay.setGridLinePen(QtGui.QPen(QtGui.QColor(80, 80, 80), 0.5)) ay.setLinePen(QtGui.QPen(QtGui.QColor(0, 0, 0), 0.5)) ay.applyNiceNumbers() ay.setTickCount(3) # add and attach new axes self.addAxis(ax, QtCore.Qt.AlignBottom) self.addAxis(ay, QtCore.Qt.AlignRight) self.line.attachAxis(ax) self.line.attachAxis(ay)
def generate_tech_data(stock, open_name, close_name, high_name, low_name): open_price = stock[open_name].values close_price = stock[close_name].values low_price = stock[low_name].values high_price = stock[high_name].values data = pd.DataFrame(stock) data['MOM'] = talib.MOM(close_price) data['SMA'] = talib.SMA(close_price) data['HT_DCPERIOD'] = talib.HT_DCPERIOD(close_price) data['HT_DCPHASE'] = talib.HT_DCPHASE(close_price) data['sine'], data['leadsine'] = talib.HT_SINE(close_price) data['inphase'], data['quadrature'] = talib.HT_PHASOR(close_price) data['HT_TRENDMODE'] = talib.HT_TRENDMODE(close_price) data['SAREXT'] = talib.SAREXT(high_price, low_price) data['ADX'] = talib.ADX(high_price, low_price, close_price) data['ADXR'] = talib.ADX(high_price, low_price, close_price) data['APO'] = talib.APO(close_price) data['AROON_UP'], data['AROON_DOWN'] = talib.AROON(high_price, low_price) data['AROONOSC'] = talib.AROONOSC(high_price, low_price) data['BOP'] = talib.BOP(open_price, high_price, low_price, close_price) data['CCI'] = talib.CCI(high_price, low_price, close_price) data['PLUS_DI'] = talib.PLUS_DI(high_price, low_price, close_price) data['PLUS_DM'] = talib.PLUS_DM(high_price, low_price) data['PPO'] = talib.PPO(close_price) data['macd'], data['macd_sig'], data['macd_hist'] = talib.MACD(close_price) data['RSI'] = talib.RSI(close_price) data['CMO'] = talib.CMO(close_price) data['ROC'] = talib.ROC(close_price) data['ROCP'] = talib.ROCP(close_price) data['ROCR'] = talib.ROCR(close_price) data['slowk'], data['slowd'] = talib.STOCH(high_price, low_price, close_price) data['fastk'], data['fastd'] = talib.STOCHF(high_price, low_price, close_price) data['TRIX'] = talib.TRIX(close_price) data['ULTOSC'] = talib.ULTOSC(high_price, low_price, close_price) data['WILLR'] = talib.WILLR(high_price, low_price, close_price) data['NATR'] = talib.NATR(high_price, low_price, close_price) data['TRANGE'] = talib.TRANGE(high_price, low_price, close_price) data = data.drop([open_name, close_name, high_name, low_name], axis=1) data = data.dropna() return data
def _get_indicators(security, open_name, close_name, high_name, low_name, volume_name): open_price = security[open_name].values close_price = security[close_name].values low_price = security[low_name].values high_price = security[high_name].values volume = security[volume_name].values if volume_name else None security['MOM'] = talib.MOM(close_price) security['HT_DCPERIOD'] = talib.HT_DCPERIOD(close_price) security['HT_DCPHASE'] = talib.HT_DCPHASE(close_price) security['SINE'], security['LEADSINE'] = talib.HT_SINE(close_price) security['INPHASE'], security['QUADRATURE'] = talib.HT_PHASOR( close_price) security['ADXR'] = talib.ADXR(high_price, low_price, close_price) security['APO'] = talib.APO(close_price) security['AROON_UP'], _ = talib.AROON(high_price, low_price) security['CCI'] = talib.CCI(high_price, low_price, close_price) security['PLUS_DI'] = talib.PLUS_DI(high_price, low_price, close_price) security['PPO'] = talib.PPO(close_price) security['MACD'], security['MACD_SIG'], security[ 'MACD_HIST'] = talib.MACD(close_price) security['CMO'] = talib.CMO(close_price) security['ROCP'] = talib.ROCP(close_price) security['FASTK'], security['FASTD'] = talib.STOCHF( high_price, low_price, close_price) security['TRIX'] = talib.TRIX(close_price) security['ULTOSC'] = talib.ULTOSC(high_price, low_price, close_price) security['WILLR'] = talib.WILLR(high_price, low_price, close_price) security['NATR'] = talib.NATR(high_price, low_price, close_price) security['RSI'] = talib.RSI(close_price) security['EMA'] = talib.EMA(close_price) security['SAREXT'] = talib.SAREXT(high_price, low_price) security['RR'] = security[close_name] / security[close_name].shift( 1).fillna(1) security['LOG_RR'] = np.log(security['RR']) if volume_name: security['MFI'] = talib.MFI(high_price, low_price, close_price, volume) security[volume_name] = np.log(security[volume_name]) security.drop([open_name, close_name, high_name, low_name], axis=1) security = security.dropna().astype(np.float32) return security
def ultosc(candles: np.ndarray, timeperiod1=7, timeperiod2=14, timeperiod3=28, sequential=False) -> Union[float, np.ndarray]: """ ULTOSC - Ultimate Oscillator :param candles: np.ndarray :param timeperiod1: int - default=7 :param timeperiod2: int - default=14 :param timeperiod3: int - default=28 :param sequential: bool - default=False :return: float | np.ndarray """ if not sequential and len(candles) > 240: candles = candles[-240:] res = talib.ULTOSC(candles[:, 3], candles[:, 4], candles[:, 2], timeperiod1=timeperiod1, timeperiod2=timeperiod2, timeperiod3=timeperiod3) if sequential: return res else: return None if np.isnan(res[-1]) else res[-1]
def extract_features(data): high = data['High'] low = data['Low'] close = data['Close'] volume = data['Volume'] open_ = data['Open'] data['ADX'] = ta.ADX(high, low, close, timeperiod=19) data['CCI'] = ta.CCI(high, low, close, timeperiod=19) data['CMO'] = ta.CMO(close, timeperiod=14) data['MACD'], X, Y = ta.MACD(close, fastperiod=10, slowperiod=30, signalperiod=9) data['MFI'] = ta.MFI(high, low, close, volume, timeperiod=19) data['MOM'] = ta.MOM(close, timeperiod=9) data['ROCR'] = ta.ROCR(close, timeperiod=12) data['RSI'] = ta.RSI(close, timeperiod=19) data['STOCHSLOWK'], data['STOCHSLOWD'] = ta.STOCH(high, low, close, fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0) data['TRIX'] = ta.TRIX(close, timeperiod=30) data['WILLR'] = ta.WILLR(high, low, close, timeperiod=14) data['OBV'] = ta.OBV(close, volume) data['TSF'] = ta.TSF(close, timeperiod=14) data['NATR'] = ta.NATR(high, low, close) #, timeperiod=14) data['ULTOSC'] = ta.ULTOSC(high, low, close) data['AROONOSC'] = ta.AROONOSC(high, low, timeperiod=14) data['BOP'] = ta.BOP(open_, high, low, close) data['LINEARREG'] = ta.LINEARREG(close) data['AP0'] = ta.APO(close, fastperiod=9, slowperiod=23, matype=1) data['TEMA'] = ta.TRIMA(close, 29) return data
def generate_tech_data(stock, open_name, close_name, high_name, low_name, max_time_window=10): open_price = stock[open_name].values close_price = stock[close_name].values low_price = stock[low_name].values high_price = stock[high_name].values data = pd.DataFrame(stock) data['MOM'] = talib.MOM(close_price, timeperiod=max_time_window) # data['_SMA'] = talib.SMA(close_price) data['HT_DCPERIOD'] = talib.HT_DCPERIOD(close_price) data['HT_DCPHASE'] = talib.HT_DCPHASE(close_price) data['sine'], data['leadsine'] = talib.HT_SINE(close_price) data['inphase'], data['quadrature'] = talib.HT_PHASOR(close_price) # data['_HT_TRENDMODE'] = talib.HT_TRENDMODE(close_price) # data['_SAREXT'] = talib.SAREXT(high_price, low_price) # data['_ADX'] = talib.ADX(high_price, low_price, close_price) data['ADXR'] = talib.ADXR(high_price, low_price, close_price, timeperiod=max_time_window) data['APO'] = talib.APO(close_price, fastperiod=max_time_window // 2, slowperiod=max_time_window) data['AROON_UP'], _ = talib.AROON(high_price, low_price, timeperiod=max_time_window) # data['_BOP'] = talib.BOP(open_price, high_price, low_price, close_price) data['CCI'] = talib.CCI(high_price, low_price, close_price, timeperiod=max_time_window) data['PLUS_DI'] = talib.PLUS_DI(high_price, low_price, close_price, timeperiod=max_time_window) # data['_PLUS_DM'] = talib.PLUS_DM(high_price, low_price) data['PPO'] = talib.PPO(close_price, fastperiod=max_time_window // 2, slowperiod=max_time_window) data['macd'], data['macd_sig'], data['macd_hist'] = talib.MACD(close_price, fastperiod=max_time_window // 2, slowperiod=max_time_window, signalperiod=max_time_window // 2) data['CMO'] = talib.CMO(close_price, timeperiod=max_time_window) # data['ROC'] = talib.ROC(close_price) data['ROCP'] = talib.ROCP(close_price, timeperiod=max_time_window) # data['ROCR'] = talib.ROCR(close_price) # data['slowk'], data['slowd'] = talib.STOCH(high_price, low_price, close_price) data['fastk'], data['fastd'] = talib.STOCHF(high_price, low_price, close_price) data['TRIX'] = talib.TRIX(close_price, timeperiod=max_time_window) data['ULTOSC'] = talib.ULTOSC(high_price, low_price, close_price, timeperiod1=max_time_window // 2, timeperiod2=max_time_window, timeperiod3=max_time_window * 2) data['WILLR'] = talib.WILLR(high_price, low_price, close_price, timeperiod=max_time_window) data['NATR'] = talib.NATR(high_price, low_price, close_price, timeperiod=max_time_window) # data['_TRANGE'] = talib.TRANGE(high_price, low_price, close_price) data = data.drop([open_name, close_name, high_name, low_name], axis=1) # data.columns=data.columns.map(lambda x:x[1:]) data = data.dropna().astype(np.float32) return data
def create_Indicators(data): dfs = data df = dfs.copy() df['ADX'] = talib.ADX(df.high, df.low, df.close, timeperiod=14) df['ADXR'] = talib.ADXR(df.high, df.low, df.close, timeperiod=14) df['APO'] = talib.APO(df.close, fastperiod=12, slowperiod=26, matype=0) df['AROONOSC'] = talib.AROONOSC(df.high, df.low, timeperiod=14) df['BOP'] = talib.BOP( df.open, df.high, df.low, df.close) # (Close price – Open price) / (High price – Low price) df["CCI"] = talib.CCI(df.high, df.low, df.close, timeperiod=14) df["CMO"] = talib.CMO(df.close, timeperiod=14) df["DX"] = talib.DX(df.high, df.low, df.close, timeperiod=14) #df["MFI"] = talib.MFI(df.high, df.low, df.close, df.volume, timeperiod=14).pct_change() df["MINUS_DI"] = talib.MINUS_DI(df.high, df.low, df.close, timeperiod=14) df["MINUS_DM"] = talib.MINUS_DM(df.high, df.low, timeperiod=14) df["MOM"] = talib.MOM(df.close, timeperiod=10) df["PLUS_DI"] = talib.PLUS_DI(df.high, df.low, df.close, timeperiod=14) df["PLUS_DM"] = talib.PLUS_DM(df.high, df.low, timeperiod=14) #X_corr["PPO"] = PPO(df.close, fastperiod=12, sdf.lowperiod=26, matype=0) df["ROC"] = talib.ROC(df.close, timeperiod=10) df["ROCP"] = talib.ROCP(df.close, timeperiod=10) df["ROCR"] = talib.ROCR(df.close, timeperiod=10) df["ROCR100"] = talib.ROCR100(df.close, timeperiod=10) df["RSI"] = talib.RSI(df.close, timeperiod=14) #sdf.lowk, sdf.lowd = STOCH(df.high, df.low, df.close, fastk_period=5, sdf.lowk_period=3, sdf.lowk_matype=0, sdf.lowd_period=3, sdf.lowd_matype=0) df["TRIX"] = talib.TRIX(df.close, timeperiod=30) df["ULTOSC"] = talib.ULTOSC(df.high, df.low, df.close, timeperiod1=7, timeperiod2=14, timeperiod3=28) df["WILLR"] = talib.WILLR(df.high, df.low, df.close, timeperiod=14) return df
def TKE(dataframe, *, length=14, emaperiod=5): """ Source: https://www.tradingview.com/script/Pcbvo0zG/ Author: Dr Yasar ERDINC The calculation is simple: TKE=(RSI+STOCHASTIC+ULTIMATE OSCILLATOR+MFI+WIILIAMS %R+MOMENTUM+CCI)/7 Buy signal: when TKE crosses above 20 value Oversold region: under 20 value Overbought region: over 80 value Another usage of TKE is with its EMA , the default value is defined as 5 bars of EMA of the TKE line, Go long: when TKE crosses above EMALine Go short: when TKE crosses below EMALine Usage: `dataframe['TKE'], dataframe['TKEema'] = TKE1(dataframe)` """ import talib.abstract as ta df = dataframe.copy() # TKE=(RSI+STOCHASTIC+ULTIMATE OSCILLATOR+MFI+WIILIAMS %R+MOMENTUM+CCI)/7 df["rsi"] = ta.RSI(df, timeperiod=length) df["stoch"] = (100 * (df["close"] - df["low"].rolling(window=length).min()) / (df["high"].rolling(window=length).max() - df["low"].rolling(window=length).min())) df["ultosc"] = ta.ULTOSC(df, timeperiod1=7, timeperiod2=14, timeperiod3=28) df["mfi"] = ta.MFI(df, timeperiod=length) df["willr"] = ta.WILLR(df, timeperiod=length) df["mom"] = ta.ROCR100(df, timeperiod=length) df["cci"] = ta.CCI(df, timeperiod=length) df["TKE"] = df[["rsi", "stoch", "ultosc", "mfi", "willr", "mom", "cci"]].mean(axis="columns") df["TKEema"] = ta.EMA(df["TKE"], timeperiod=emaperiod) return df["TKE"], df["TKEema"]
def add_ULTOSC(self, timeperiod=14, timeperiod2=14, timeperiod3=28, type='line', color='secondary', **kwargs): """Ultimate Oscillator.""" if not (self.has_high and self.has_low and self.has_close): raise Exception() utils.kwargs_check(kwargs, VALID_TA_KWARGS) if 'kind' in kwargs: type = kwargs['kind'] name = 'ULTOSC({})'.format(str(timeperiod), str(timeperiod2), str(timeperiod3)) self.sec[name] = dict(type=type, color=color) self.ind[name] = talib.ULTOSC(self.df[self.hi].values, self.df[self.lo].values, self.df[self.cl].values, timeperiod, timeperiod2, timeperiod3)
def Feature_Extraction_Momentum(df): df = SOK(df) df = SOD(df) df = SOJ(df) df = MACD(df) df = MACD_Signal(df) df = MACD_Hist(df) df['RSI'] = tas.RSI(df['close'].values) df['ROC'] = tas.ROC(df['close'].values) df['WillR'] = tas.WILLR(df['high'].values, df['low'].values, df['close'].values) df['CCI'] = tas.CCI(df['high'].values, df['low'].values, df['close'].values) df['TSI'] = tsi(df['close'], window_slow=25, window_fast=13) df['ADX'] = tas.ADX(df['high'].values, df['low'].values, df['close'].values) df['MFI'] = tas.MFI(df['high'], df['low'], df['close'], df['volume']) df['MOM'] = tas.MOM(df['close']) df['TRIX'] = tas.TRIX(df['close']) df['ULTOSC'] = tas.ULTOSC(df['high'], df['low'], df['close']) df = df.fillna(0) return df
def UltOsc(self, df, t1=7, t2=14, t3=28): """ Ultimate Oscillator Uses weighted sums of three oscillators, designed to capture momentum across three different timeframes, each of which uses a different time period Args: high, low, close: HLC of instrument t1, t2, t3: various time periods in the calculation, default: 7,14,28 feature_dict: Dictionary of added features Return: UO signal feature_dict """ t1t = 'UltOsc_t1' + str(t1) t2t = '_t2' + str(t2) t3t = '_t3' + str(t3) col_name = t1t + t2t + t3t current_feature['Latest'] = col_name feature_dict[col_name] = 'Keep' df[col_name] = ta.ULTOSC(df.High, df.Low, df.Close, t1, t2, t3) return df
def preprocess_data(self): """calculate returns and percentiles, then removes missing values""" self.data['returns'] = self.data.Close.pct_change() self.data['ret_2'] = self.data.Close.pct_change(2) self.data['ret_5'] = self.data.Close.pct_change(5) self.data['ret_10'] = self.data.Close.pct_change(10) self.data['ret_21'] = self.data.Close.pct_change(21) self.data['rsi'] = talib.STOCHRSI(self.data.Close)[1] self.data['macd'] = talib.MACD(self.data.Close)[1] self.data['atr'] = talib.ATR(self.data.High, self.data.Low, self.data.Close) slowk, slowd = talib.STOCH(self.data.High, self.data.Low, self.data.Close) self.data['stoch'] = slowd - slowk self.data['atr'] = talib.ATR(self.data.High, self.data.Low, self.data.Close) self.data['ultosc'] = talib.ULTOSC(self.data.High, self.data.Low, self.data.Close) self.data = (self.data.replace( (np.inf, -np.inf), np.nan).drop([ 'High', 'Low', 'Close', 'Volume', 'Symbol', 'Volume ETH', 'Volume BTC', 'Unix Timestamp' ], axis=1).dropna()) r = self.data.returns.copy() if self.normalize: self.data = pd.DataFrame(scale(self.data), columns=self.data.columns, index=self.data.index) features = self.data.columns.drop('returns') self.data['returns'] = r # don't scale returns self.data = self.data.loc[:, ['returns'] + list(features)] log.info(self.data.info())
def extract_by_type(feature_type, open_prices=None, close_prices=None, high_prices=None, low_prices=None): 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(macd / 100.0) # feature.append(signal / 100.0) # feature.append(hist / 100.0) 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(numpy.maximum(rsi6 / 100.0 - 0.8, 0)) # feature.append(numpy.maximum(rsi12 / 100.0 - 0.8, 0)) # feature.append(numpy.maximum(rsi24 / 100.0 - 0.8, 0)) # feature.append(numpy.minimum(rsi6 / 100.0 - 0.2, 0)) # feature.append(numpy.minimum(rsi6 / 100.0 - 0.2, 0)) # feature.append(numpy.minimum(rsi6 / 100.0 - 0.2, 0)) # feature.append(numpy.maximum(numpy.minimum(rsi6 / 100.0 - 0.5, 0.3), -0.3)) # feature.append(numpy.maximum(numpy.minimum(rsi6 / 100.0 - 0.5, 0.3), -0.3)) # feature.append(numpy.maximum(numpy.minimum(rsi6 / 100.0 - 0.5, 0.3), -0.3)) 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) #ma360 = talib.MA(close_prices, timeperiod=70) #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) 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) #ma360rocp = talib.ROCP(ma360, timeperiod=1) #ma720rocp = talib.ROCP(ma720, 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(ma360rocp) #feature.append(ma720rocp) 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) #feature.append((ma360 - close_prices) / close_prices) #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) 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 generate_tech_data(stock, open_name, close_name, high_name, low_name, max_time_window=10): open_price = stock[open_name].values close_price = stock[close_name].values low_price = stock[low_name].values high_price = stock[high_name].values data = stock.copy() data['MOM'] = talib.MOM(close_price, timeperiod=max_time_window) data['HT_DCPERIOD'] = talib.HT_DCPERIOD(close_price) data['HT_DCPHASE'] = talib.HT_DCPHASE(close_price) data['sine'], data['leadsine'] = talib.HT_SINE(close_price) data['inphase'], data['quadrature'] = talib.HT_PHASOR(close_price) data['ADXR'] = talib.ADXR(high_price, low_price, close_price, timeperiod=max_time_window) data['APO'] = talib.APO(close_price, fastperiod=max_time_window // 2, slowperiod=max_time_window) data['AROON_UP'], _ = talib.AROON(high_price, low_price, timeperiod=max_time_window) data['CCI'] = talib.CCI(high_price, low_price, close_price, timeperiod=max_time_window) data['PLUS_DI'] = talib.PLUS_DI(high_price, low_price, close_price, timeperiod=max_time_window) data['PPO'] = talib.PPO(close_price, fastperiod=max_time_window // 2, slowperiod=max_time_window) data['macd'], data['macd_sig'], data['macd_hist'] = talib.MACD( close_price, fastperiod=max_time_window // 2, slowperiod=max_time_window, signalperiod=max_time_window // 2) data['CMO'] = talib.CMO(close_price, timeperiod=max_time_window) data['ROCP'] = talib.ROCP(close_price, timeperiod=max_time_window) data['fastk'], data['fastd'] = talib.STOCHF(high_price, low_price, close_price) data['TRIX'] = talib.TRIX(close_price, timeperiod=max_time_window) data['ULTOSC'] = talib.ULTOSC(high_price, low_price, close_price, timeperiod1=max_time_window // 2, timeperiod2=max_time_window, timeperiod3=max_time_window * 2) data['WILLR'] = talib.WILLR(high_price, low_price, close_price, timeperiod=max_time_window) data['NATR'] = talib.NATR(high_price, low_price, close_price, timeperiod=max_time_window) data = data.drop([open_name, close_name, high_name, low_name], axis=1) data = data.dropna().astype(np.float32) return data
def get_factors(index, Open, Close, High, Low, Volume, rolling=26, drop=False, normalization=True): tmp = pd.DataFrame() tmp['tradeTime'] = index # 累积/派发线(Accumulation / Distribution Line,该指标将每日的成交量通过价格加权累计, # 用以计算成交量的动量。属于趋势型因子 tmp['AD'] = talib.AD(High, Low, Close, Volume) # 佳庆指标(Chaikin Oscillator),该指标基于AD曲线的指数移动均线而计算得到。属于趋势型因子 tmp['ADOSC'] = talib.ADOSC(High, Low, Close, Volume, fastperiod=3, slowperiod=10) # 平均动向指数,DMI因子的构成部分。属于趋势型因子 tmp['ADX'] = talib.ADX(High, Low, Close, timeperiod=14) # 相对平均动向指数,DMI因子的构成部分。属于趋势型因子 tmp['ADXR'] = talib.ADXR(High, Low, Close, timeperiod=14) # 绝对价格振荡指数 tmp['APO'] = talib.APO(Close, fastperiod=12, slowperiod=26) # Aroon通过计算自价格达到近期最高值和最低值以来所经过的期间数,帮助投资者预测证券价格从趋势到区域区域或反转的变化, # Aroon指标分为Aroon、AroonUp和AroonDown3个具体指标。属于趋势型因子 tmp['AROONDown'], tmp['AROONUp'] = talib.AROON(High, Low, timeperiod=14) tmp['AROONOSC'] = talib.AROONOSC(High, Low, timeperiod=14) # 均幅指标(Average TRUE Ranger),取一定时间周期内的股价波动幅度的移动平均值, # 是显示市场变化率的指标,主要用于研判买卖时机。属于超买超卖型因子。 tmp['ATR14'] = talib.ATR(High, Low, Close, timeperiod=14) tmp['ATR6'] = talib.ATR(High, Low, Close, timeperiod=6) # 布林带 tmp['Boll_Up'], tmp['Boll_Mid'], tmp['Boll_Down'] = talib.BBANDS( Close, timeperiod=20, nbdevup=2, nbdevdn=2, matype=0) # 均势指标 tmp['BOP'] = talib.BOP(Open, High, Low, Close) # 5日顺势指标(Commodity Channel Index),专门测量股价是否已超出常态分布范围。属于超买超卖型因子。 tmp['CCI5'] = talib.CCI(High, Low, Close, timeperiod=5) tmp['CCI10'] = talib.CCI(High, Low, Close, timeperiod=10) tmp['CCI20'] = talib.CCI(High, Low, Close, timeperiod=20) tmp['CCI88'] = talib.CCI(High, Low, Close, timeperiod=88) # 钱德动量摆动指标(Chande Momentum Osciliator),与其他动量指标摆动指标如相对强弱指标(RSI)和随机指标(KDJ)不同, # 钱德动量指标在计算公式的分子中采用上涨日和下跌日的数据。属于超买超卖型因子 tmp['CMO_Close'] = talib.CMO(Close, timeperiod=14) tmp['CMO_Open'] = talib.CMO(Close, timeperiod=14) # DEMA双指数移动平均线 tmp['DEMA6'] = talib.DEMA(Close, timeperiod=6) tmp['DEMA12'] = talib.DEMA(Close, timeperiod=12) tmp['DEMA26'] = talib.DEMA(Close, timeperiod=26) # DX 动向指数 tmp['DX'] = talib.DX(High, Low, Close, timeperiod=14) # EMA 指数移动平均线 tmp['EMA6'] = talib.EMA(Close, timeperiod=6) tmp['EMA12'] = talib.EMA(Close, timeperiod=12) tmp['EMA26'] = talib.EMA(Close, timeperiod=26) # KAMA 适应性移动平均线 tmp['KAMA'] = talib.KAMA(Close, timeperiod=30) # MACD tmp['MACD_DIF'], tmp['MACD_DEA'], tmp['MACD_bar'] = talib.MACD( Close, fastperiod=12, slowperiod=24, signalperiod=9) # 中位数价格 不知道是什么意思 tmp['MEDPRICE'] = talib.MEDPRICE(High, Low) # 负向指标 负向运动 tmp['MiNUS_DI'] = talib.MINUS_DI(High, Low, Close, timeperiod=14) tmp['MiNUS_DM'] = talib.MINUS_DM(High, Low, timeperiod=14) # 动量指标(Momentom Index),动量指数以分析股价波动的速度为目的,研究股价在波动过程中各种加速, # 减速,惯性作用以及股价由静到动或由动转静的现象。属于趋势型因子 tmp['MOM'] = talib.MOM(Close, timeperiod=10) # 归一化平均值范围 tmp['NATR'] = talib.NATR(High, Low, Close, timeperiod=14) # OBV 能量潮指标(On Balance Volume,OBV),以股市的成交量变化来衡量股市的推动力, # 从而研判股价的走势。属于成交量型因子 tmp['OBV'] = talib.OBV(Close, Volume) # PLUS_DI 更向指示器 tmp['PLUS_DI'] = talib.PLUS_DI(High, Low, Close, timeperiod=14) tmp['PLUS_DM'] = talib.PLUS_DM(High, Low, timeperiod=14) # PPO 价格振荡百分比 tmp['PPO'] = talib.PPO(Close, fastperiod=6, slowperiod=26, matype=0) # ROC 6日变动速率(Price Rate of Change),以当日的收盘价和N天前的收盘价比较, # 通过计算股价某一段时间内收盘价变动的比例,应用价格的移动比较来测量价位动量。属于超买超卖型因子。 tmp['ROC6'] = talib.ROC(Close, timeperiod=6) tmp['ROC20'] = talib.ROC(Close, timeperiod=20) # 12日量变动速率指标(Volume Rate of Change),以今天的成交量和N天前的成交量比较, # 通过计算某一段时间内成交量变动的幅度,应用成交量的移动比较来测量成交量运动趋向, # 达到事先探测成交量供需的强弱,进而分析成交量的发展趋势及其将来是否有转势的意愿, # 属于成交量的反趋向指标。属于成交量型因子 tmp['VROC6'] = talib.ROC(Volume, timeperiod=6) tmp['VROC20'] = talib.ROC(Volume, timeperiod=20) # ROC 6日变动速率(Price Rate of Change),以当日的收盘价和N天前的收盘价比较, # 通过计算股价某一段时间内收盘价变动的比例,应用价格的移动比较来测量价位动量。属于超买超卖型因子。 tmp['ROCP6'] = talib.ROCP(Close, timeperiod=6) tmp['ROCP20'] = talib.ROCP(Close, timeperiod=20) # 12日量变动速率指标(Volume Rate of Change),以今天的成交量和N天前的成交量比较, # 通过计算某一段时间内成交量变动的幅度,应用成交量的移动比较来测量成交量运动趋向, # 达到事先探测成交量供需的强弱,进而分析成交量的发展趋势及其将来是否有转势的意愿, # 属于成交量的反趋向指标。属于成交量型因子 tmp['VROCP6'] = talib.ROCP(Volume, timeperiod=6) tmp['VROCP20'] = talib.ROCP(Volume, timeperiod=20) # RSI tmp['RSI'] = talib.RSI(Close, timeperiod=14) # SAR 抛物线转向 tmp['SAR'] = talib.SAR(High, Low, acceleration=0.02, maximum=0.2) # TEMA tmp['TEMA6'] = talib.TEMA(Close, timeperiod=6) tmp['TEMA12'] = talib.TEMA(Close, timeperiod=12) tmp['TEMA26'] = talib.TEMA(Close, timeperiod=26) # TRANGE 真实范围 tmp['TRANGE'] = talib.TRANGE(High, Low, Close) # TYPPRICE 典型价格 tmp['TYPPRICE'] = talib.TYPPRICE(High, Low, Close) # TSF 时间序列预测 tmp['TSF'] = talib.TSF(Close, timeperiod=14) # ULTOSC 极限振子 tmp['ULTOSC'] = talib.ULTOSC(High, Low, Close, timeperiod1=7, timeperiod2=14, timeperiod3=28) # 威廉指标 tmp['WILLR'] = talib.WILLR(High, Low, Close, timeperiod=14) # 标准化 if normalization: factors_list = tmp.columns.tolist()[1:] if rolling >= 26: for i in factors_list: tmp[i] = (tmp[i] - tmp[i].rolling(window=rolling, center=False).mean()) \ / tmp[i].rolling(window=rolling, center=False).std() elif rolling < 26 & rolling > 0: print('Recommended rolling range greater than 26') elif rolling <= 0: for i in factors_list: tmp[i] = (tmp[i] - tmp[i].mean()) / tmp[i].std() if drop: tmp.dropna(inplace=True) tmp.set_index('tradeTime', inplace=True) return tmp
def main(): ohlcv = api_ohlcv('20191017') open, high, low, close, volume, timestamp = [], [], [], [], [], [] for i in ohlcv: open.append(int(i[0])) high.append(int(i[1])) low.append(int(i[2])) close.append(int(i[3])) volume.append(float(i[4])) time_str = str(i[5]) timestamp.append( datetime.fromtimestamp(int( time_str[:10])).strftime('%Y/%m/%d %H:%M:%M')) date_time_index = pd.to_datetime( timestamp) # convert to DateTimeIndex type df = pd.DataFrame( { 'open': open, 'high': high, 'low': low, 'close': close, 'volume': volume }, index=date_time_index) # df.index += pd.offsets.Hour(9) # adjustment for JST if required print(df.shape) print(df.columns) # pct_change f = lambda x: 1 if x > 0.0001 else -1 if x < -0.0001 else 0 if -0.0001 <= x <= 0.0001 else np.nan y = df.rename(columns={ 'close': 'y' }).loc[:, 'y'].pct_change(1).shift(-1).fillna(0) X = df.copy() y_ = pd.DataFrame(y.map(f), columns=['y']) y = df.rename(columns={'close': 'y'}).loc[:, 'y'].pct_change(1).fillna(0) df_ = pd.concat([X, y_], axis=1) # check the shape print( '----------------------------------------------------------------------------------------' ) print('X shape: (%i,%i)' % X.shape) print('y shape: (%i,%i)' % y_.shape) print( '----------------------------------------------------------------------------------------' ) print(y_.groupby('y').size()) print('y=1 up, y=0 stay, y=-1 down') print( '----------------------------------------------------------------------------------------' ) # feature calculation open = pd.Series(df['open']) high = pd.Series(df['high']) low = pd.Series(df['low']) close = pd.Series(df['close']) volume = pd.Series(df['volume']) # pct_change for new column X['diff'] = y # Exponential Moving Average ema = talib.EMA(close, timeperiod=3) ema = ema.fillna(ema.mean()) # Momentum momentum = talib.MOM(close, timeperiod=5) momentum = momentum.fillna(momentum.mean()) # RSI rsi = talib.RSI(close, timeperiod=14) rsi = rsi.fillna(rsi.mean()) # ADX adx = talib.ADX(high, low, close, timeperiod=14) adx = adx.fillna(adx.mean()) # ADX change adx_change = adx.pct_change(1).shift(-1) adx_change = adx_change.fillna(adx_change.mean()) # AD ad = talib.AD(high, low, close, volume) ad = ad.fillna(ad.mean()) X_ = pd.concat([X, ema, momentum, rsi, adx_change, ad], axis=1).drop(['open', 'high', 'low', 'close'], axis=1) X_.columns = ['volume', 'diff', 'ema', 'momentum', 'rsi', 'adx', 'ad'] X_.join(y_).head(10) # default parameter models X_train, X_test, y_train, y_test = train_test_split(X_, y_, test_size=0.33, random_state=42) print('X_train shape: {}'.format(X_train.shape)) print('X_test shape: {}'.format(X_test.shape)) print('y_train shape: {}'.format(y_train.shape)) print('y_test shape: {}'.format(y_test.shape)) pipe_knn = Pipeline([('scl', StandardScaler()), ('est', KNeighborsClassifier(n_neighbors=3))]) pipe_logistic = Pipeline([('scl', StandardScaler()), ('est', LogisticRegression(solver='lbfgs', multi_class='multinomial', random_state=39))]) pipe_rf = Pipeline([('scl', StandardScaler()), ('est', RandomForestClassifier(random_state=39))]) pipe_gb = Pipeline([('scl', StandardScaler()), ('est', GradientBoostingClassifier(random_state=39))]) pipe_names = ['KNN', 'Logistic', 'RandomForest', 'GradientBoosting'] pipe_lines = [pipe_knn, pipe_logistic, pipe_rf, pipe_gb] for (i, pipe) in enumerate(pipe_lines): pipe.fit(X_train, y_train.values.ravel()) print(pipe) print('%s: %.3f' % (pipe_names[i] + ' Train Accuracy', accuracy_score(y_train.values.ravel(), pipe.predict(X_train)))) print('%s: %.3f' % (pipe_names[i] + ' Test Accuracy', accuracy_score(y_test.values.ravel(), pipe.predict(X_test)))) print('%s: %.3f' % (pipe_names[i] + ' Train F1 Score', f1_score(y_train.values.ravel(), pipe.predict(X_train), average='micro'))) print('%s: %.3f' % (pipe_names[i] + ' Test F1 Score', f1_score(y_test.values.ravel(), pipe.predict(X_test), average='micro'))) for (i, pipe) in enumerate(pipe_lines): predict = pipe.predict(X_test) cm = confusion_matrix(y_test.values.ravel(), predict, labels=[-1, 0, 1]) print('{} Confusion Matrix'.format(pipe_names[i])) print(cm) ## Overlap Studies Functions # DEMA - Double Exponential Moving Average dema = talib.DEMA(close, timeperiod=3) dema = dema.fillna(dema.mean()) print('DEMA - Double Exponential Moving Average shape: {}'.format( dema.shape)) # EMA - Exponential Moving Average ema = talib.EMA(close, timeperiod=3) ema = ema.fillna(ema.mean()) print('EMA - Exponential Moving Average shape: {}'.format(ema.shape)) # HT_TRENDLINE - Hilbert Transform - Instantaneous Trendline hilbert = talib.HT_TRENDLINE(close) hilbert = hilbert.fillna(hilbert.mean()) print( 'HT_TRENDLINE - Hilbert Transform - Instantaneous Trendline shape: {}'. format(hilbert.shape)) # KAMA - Kaufman Adaptive Moving Average kama = talib.KAMA(close, timeperiod=3) kama = kama.fillna(kama.mean()) print('KAMA - Kaufman Adaptive Moving Average shape: {}'.format( kama.shape)) # MA - Moving average ma = talib.MA(close, timeperiod=3, matype=0) ma = ma.fillna(ma.mean()) print('MA - Moving average shape: {}'.format(kama.shape)) # MIDPOINT - MidPoint over period midpoint = talib.MIDPOINT(close, timeperiod=7) midpoint = midpoint.fillna(midpoint.mean()) print('MIDPOINT - MidPoint over period shape: {}'.format(midpoint.shape)) # MIDPRICE - Midpoint Price over period midprice = talib.MIDPRICE(high, low, timeperiod=7) midprice = midprice.fillna(midprice.mean()) print('MIDPRICE - Midpoint Price over period shape: {}'.format( midprice.shape)) # SAR - Parabolic SAR sar = talib.SAR(high, low, acceleration=0, maximum=0) sar = sar.fillna(sar.mean()) print('SAR - Parabolic SAR shape: {}'.format(sar.shape)) # SAREXT - Parabolic SAR - Extended sarext = talib.SAREXT(high, low, startvalue=0, offsetonreverse=0, accelerationinitlong=0, accelerationlong=0, accelerationmaxlong=0, accelerationinitshort=0, accelerationshort=0, accelerationmaxshort=0) sarext = sarext.fillna(sarext.mean()) print('SAREXT - Parabolic SAR - Extended shape: {}'.format(sarext.shape)) # SMA - Simple Moving Average sma = talib.SMA(close, timeperiod=3) sma = sma.fillna(sma.mean()) print('SMA - Simple Moving Average shape: {}'.format(sma.shape)) # T3 - Triple Exponential Moving Average (T3) t3 = talib.T3(close, timeperiod=5, vfactor=0) t3 = t3.fillna(t3.mean()) print('T3 - Triple Exponential Moving Average shape: {}'.format(t3.shape)) # TEMA - Triple Exponential Moving Average tema = talib.TEMA(close, timeperiod=3) tema = tema.fillna(tema.mean()) print('TEMA - Triple Exponential Moving Average shape: {}'.format( tema.shape)) # TRIMA - Triangular Moving Average trima = talib.TRIMA(close, timeperiod=3) trima = trima.fillna(trima.mean()) print('TRIMA - Triangular Moving Average shape: {}'.format(trima.shape)) # WMA - Weighted Moving Average wma = talib.WMA(close, timeperiod=3) wma = wma.fillna(wma.mean()) print('WMA - Weighted Moving Average shape: {}'.format(wma.shape)) ## Momentum Indicator Functions # ADX - Average Directional Movement Index adx = talib.ADX(high, low, close, timeperiod=14) adx = adx.fillna(adx.mean()) print('ADX - Average Directional Movement Index shape: {}'.format( adx.shape)) # ADXR - Average Directional Movement Index Rating adxr = talib.ADXR(high, low, close, timeperiod=7) adxr = adxr.fillna(adxr.mean()) print('ADXR - Average Directional Movement Index Rating shape: {}'.format( adxr.shape)) # APO - Absolute Price Oscillator apo = talib.APO(close, fastperiod=12, slowperiod=26, matype=0) apo = apo.fillna(apo.mean()) print('APO - Absolute Price Oscillator shape: {}'.format(apo.shape)) # AROONOSC - Aroon Oscillator aroon = talib.AROONOSC(high, low, timeperiod=14) aroon = aroon.fillna(aroon.mean()) print('AROONOSC - Aroon Oscillator shape: {}'.format(apo.shape)) # BOP - Balance Of Power bop = talib.BOP(open, high, low, close) bop = bop.fillna(bop.mean()) print('BOP - Balance Of Power shape: {}'.format(apo.shape)) # CCI - Commodity Channel Index cci = talib.CCI(high, low, close, timeperiod=7) cci = cci.fillna(cci.mean()) print('CCI - Commodity Channel Index shape: {}'.format(cci.shape)) # CMO - Chande Momentum Oscillator cmo = talib.CMO(close, timeperiod=7) cmo = cmo.fillna(cmo.mean()) print('CMO - Chande Momentum Oscillator shape: {}'.format(cmo.shape)) # DX - Directional Movement Index dx = talib.DX(high, low, close, timeperiod=7) dx = dx.fillna(dx.mean()) print('DX - Directional Movement Index shape: {}'.format(dx.shape)) # MFI - Money Flow Index mfi = talib.MFI(high, low, close, volume, timeperiod=7) mfi = mfi.fillna(mfi.mean()) print('MFI - Money Flow Index shape: {}'.format(mfi.shape)) # MINUS_DI - Minus Directional Indicator minusdi = talib.MINUS_DI(high, low, close, timeperiod=14) minusdi = minusdi.fillna(minusdi.mean()) print('MINUS_DI - Minus Directional Indicator shape: {}'.format( minusdi.shape)) # MINUS_DM - Minus Directional Movement minusdm = talib.MINUS_DM(high, low, timeperiod=14) minusdm = minusdm.fillna(minusdm.mean()) print('MINUS_DM - Minus Directional Movement shape: {}'.format( minusdm.shape)) # MOM - Momentum mom = talib.MOM(close, timeperiod=5) mom = mom.fillna(mom.mean()) print('MOM - Momentum shape: {}'.format(mom.shape)) # PLUS_DI - Plus Directional Indicator plusdi = talib.PLUS_DI(high, low, close, timeperiod=14) plusdi = plusdi.fillna(plusdi.mean()) print('PLUS_DI - Plus Directional Indicator shape: {}'.format( plusdi.shape)) # PLUS_DM - Plus Directional Movement plusdm = talib.PLUS_DM(high, low, timeperiod=14) plusdm = plusdm.fillna(plusdm.mean()) print('PLUS_DM - Plus Directional Movement shape: {}'.format(plusdi.shape)) # PPO - Percentage Price Oscillator ppo = talib.PPO(close, fastperiod=12, slowperiod=26, matype=0) ppo = ppo.fillna(ppo.mean()) print('PPO - Percentage Price Oscillator shape: {}'.format(ppo.shape)) # ROC - Rate of change:((price/prevPrice)-1)*100 roc = talib.ROC(close, timeperiod=10) roc = roc.fillna(roc.mean()) print('ROC - Rate of change : ((price/prevPrice)-1)*100 shape: {}'.format( roc.shape)) # RSI - Relative Strength Index rsi = talib.RSI(close, timeperiod=14) rsi = rsi.fillna(rsi.mean()) print('RSI - Relative Strength Index shape: {}'.format(rsi.shape)) # TRIX - 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA trix = talib.TRIX(close, timeperiod=30) trix = trix.fillna(trix.mean()) print('TRIX - 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA shape: {}'. format(trix.shape)) # ULTOSC - Ultimate Oscillator ultosc = talib.ULTOSC(high, low, close, timeperiod1=7, timeperiod2=14, timeperiod3=28) ultosc = ultosc.fillna(ultosc.mean()) print('ULTOSC - Ultimate Oscillator shape: {}'.format(ultosc.shape)) # WILLR - Williams'%R willr = talib.WILLR(high, low, close, timeperiod=7) willr = willr.fillna(willr.mean()) print("WILLR - Williams'%R shape: {}".format(willr.shape)) ## Volume Indicator Functions # AD - Chaikin A/D Line ad = talib.AD(high, low, close, volume) ad = ad.fillna(ad.mean()) print('AD - Chaikin A/D Line shape: {}'.format(ad.shape)) # ADOSC - Chaikin A/D Oscillator adosc = talib.ADOSC(high, low, close, volume, fastperiod=3, slowperiod=10) adosc = adosc.fillna(adosc.mean()) print('ADOSC - Chaikin A/D Oscillator shape: {}'.format(adosc.shape)) # OBV - On Balance Volume obv = talib.OBV(close, volume) obv = obv.fillna(obv.mean()) print('OBV - On Balance Volume shape: {}'.format(obv.shape)) ## Volatility Indicator Functions # ATR - Average True Range atr = talib.ATR(high, low, close, timeperiod=7) atr = atr.fillna(atr.mean()) print('ATR - Average True Range shape: {}'.format(atr.shape)) # NATR - Normalized Average True Range natr = talib.NATR(high, low, close, timeperiod=7) natr = natr.fillna(natr.mean()) print('NATR - Normalized Average True Range shape: {}'.format(natr.shape)) # TRANGE - True Range trange = talib.TRANGE(high, low, close) trange = trange.fillna(trange.mean()) print('TRANGE - True Range shape: {}'.format(natr.shape)) ## Price Transform Functions # AVGPRICE - Average Price avg = talib.AVGPRICE(open, high, low, close) avg = avg.fillna(avg.mean()) print('AVGPRICE - Average Price shape: {}'.format(natr.shape)) # MEDPRICE - Median Price medprice = talib.MEDPRICE(high, low) medprice = medprice.fillna(medprice.mean()) print('MEDPRICE - Median Price shape: {}'.format(medprice.shape)) # TYPPRICE - Typical Price typ = talib.TYPPRICE(high, low, close) typ = typ.fillna(typ.mean()) print('TYPPRICE - Typical Price shape: {}'.format(typ.shape)) # WCLPRICE - Weighted Close Price wcl = talib.WCLPRICE(high, low, close) wcl = wcl.fillna(wcl.mean()) print('WCLPRICE - Weighted Close Price shape: {}'.format(wcl.shape)) ## Cycle Indicator Functions # HT_DCPERIOD - Hilbert Transform - Dominant Cycle Period dcperiod = talib.HT_DCPERIOD(close) dcperiod = dcperiod.fillna(dcperiod.mean()) print('HT_DCPERIOD - Hilbert Transform - Dominant Cycle Period shape: {}'. format(dcperiod.shape)) # HT_DCPHASE - Hilbert Transform - Dominant Cycle Phase dcphase = talib.HT_DCPHASE(close) dcphase = dcphase.fillna(dcphase.mean()) print('HT_DCPHASE - Hilbert Transform - Dominant Cycle Phase shape: {}'. format(dcperiod.shape)) ## Statistic Functions # BETA - Beta beta = talib.BETA(high, low, timeperiod=3) beta = beta.fillna(beta.mean()) print('BETA - Beta shape: {}'.format(beta.shape)) # CORREL - Pearson's Correlation Coefficient(r) correl = talib.CORREL(high, low, timeperiod=30) correl = correl.fillna(correl.mean()) print("CORREL - Pearson's Correlation Coefficient(r) shape: {}".format( beta.shape)) # LINEARREG - Linear Regression linreg = talib.LINEARREG(close, timeperiod=7) linreg = linreg.fillna(linreg.mean()) print("LINEARREG - Linear Regression shape: {}".format(linreg.shape)) # STDDEV - Standard Deviation stddev = talib.STDDEV(close, timeperiod=5, nbdev=1) stddev = stddev.fillna(stddev.mean()) print("STDDEV - Standard Deviation shape: {}".format(stddev.shape)) # TSF - Time Series Forecast tsf = talib.TSF(close, timeperiod=7) tsf = tsf.fillna(tsf.mean()) print("TSF - Time Series Forecast shape: {}".format(tsf.shape)) # VAR - Variance var = talib.VAR(close, timeperiod=5, nbdev=1) var = var.fillna(var.mean()) print("VAR - Variance shape: {}".format(var.shape)) ## Feature DataFrame X_full = pd.concat([ X, dema, ema, hilbert, kama, ma, midpoint, midprice, sar, sarext, sma, t3, tema, trima, wma, adx, adxr, apo, aroon, bop, cci, cmo, mfi, minusdi, minusdm, mom, plusdi, plusdm, ppo, roc, rsi, trix, ultosc, willr, ad, adosc, obv, atr, natr, trange, avg, medprice, typ, wcl, dcperiod, dcphase, beta, correl, linreg, stddev, tsf, var ], axis=1).drop(['open', 'high', 'low', 'close'], axis=1) X_full.columns = [ 'volume', 'diff', 'dema', 'ema', 'hilbert', 'kama', 'ma', 'midpoint', 'midprice', 'sar', 'sarext', 'sma', 't3', 'tema', 'trima', 'wma', 'adx', 'adxr', 'apo', 'aroon', 'bop', 'cci', 'cmo', 'mfi', 'minusdi', 'minusdm', 'mom', 'plusdi', 'plusdm', 'ppo', 'roc', 'rsi', 'trix', 'ultosc', 'willr', 'ad', 'adosc', 'obv', 'atr', 'natr', 'trange', 'avg', 'medprice', 'typ', 'wcl', 'dcperiod', 'dcphase', 'beta', 'correl', 'linreg', 'stddev', 'tsf', 'var' ] X_full.join(y_).head(10) # full feature models X_train_full, X_test_full, y_train_full, y_test_full = train_test_split( X_full, y_, test_size=0.33, random_state=42) print('X_train shape: {}'.format(X_train_full.shape)) print('X_test shape: {}'.format(X_test_full.shape)) print('y_train shape: {}'.format(y_train_full.shape)) print('y_test shape: {}'.format(y_test_full.shape)) pipe_knn_full = Pipeline([('scl', StandardScaler()), ('est', KNeighborsClassifier(n_neighbors=3))]) pipe_logistic_full = Pipeline([ ('scl', StandardScaler()), ('est', LogisticRegression(solver='lbfgs', multi_class='multinomial', random_state=39)) ]) pipe_rf_full = Pipeline([('scl', StandardScaler()), ('est', RandomForestClassifier(random_state=39))]) pipe_gb_full = Pipeline([('scl', StandardScaler()), ('est', GradientBoostingClassifier(random_state=39))]) pipe_names = ['KNN', 'Logistic', 'RandomForest', 'GradientBoosting'] pipe_lines_full = [ pipe_knn_full, pipe_logistic_full, pipe_rf_full, pipe_gb_full ] for (i, pipe) in enumerate(pipe_lines_full): pipe.fit(X_train_full, y_train_full.values.ravel()) print(pipe) print('%s: %.3f' % (pipe_names[i] + ' Train Accuracy', accuracy_score(y_train_full.values.ravel(), pipe.predict(X_train_full)))) print('%s: %.3f' % (pipe_names[i] + ' Test Accuracy', accuracy_score(y_test_full.values.ravel(), pipe.predict(X_test_full)))) print('%s: %.3f' % (pipe_names[i] + ' Train F1 Score', f1_score(y_train_full.values.ravel(), pipe.predict(X_train_full), average='micro'))) print('%s: %.3f' % (pipe_names[i] + ' Test F1 Score', f1_score(y_test_full.values.ravel(), pipe.predict(X_test_full), average='micro'))) # Univariate Statistics select = SelectPercentile(percentile=25) select.fit(X_train_full, y_train_full.values.ravel()) X_train_selected = select.transform(X_train_full) X_test_selected = select.transform(X_test_full) # GradientBoost Classifier print( '--------------------------Without Univariate Statistics-------------------------------------' ) pipe_gb = Pipeline([('scl', StandardScaler()), ('est', GradientBoostingClassifier(random_state=39))]) pipe_gb.fit(X_train_full, y_train_full.values.ravel()) print('Train Accuracy: {:.3f}'.format( accuracy_score(y_train_full.values.ravel(), pipe_gb.predict(X_train_full)))) print('Test Accuracy: {:.3f}'.format( accuracy_score(y_test_full.values.ravel(), pipe_gb.predict(X_test_full)))) print('Train F1 Score: {:.3f}'.format( f1_score(y_train_full.values.ravel(), pipe_gb.predict(X_train_full), average='micro'))) print('Test F1 Score: {:.3f}'.format( f1_score(y_test_full.values.ravel(), pipe_gb.predict(X_test_full), average='micro'))) # GradientBoost Cllassifier with Univariate Statistics print( '---------------------------With Univariate Statistics--------------------------------------' ) pipe_gb_percentile = Pipeline([ ('scl', StandardScaler()), ('est', GradientBoostingClassifier(random_state=39)) ]) pipe_gb_percentile.fit(X_train_selected, y_train_full.values.ravel()) print('Train Accuracy: {:.3f}'.format( accuracy_score(y_train_full.values.ravel(), pipe_gb_percentile.predict(X_train_selected)))) print('Test Accuracy: {:.3f}'.format( accuracy_score(y_test_full.values.ravel(), pipe_gb_percentile.predict(X_test_selected)))) print('Train F1 Score: {:.3f}'.format( f1_score(y_train_full.values.ravel(), pipe_gb_percentile.predict(X_train_selected), average='micro'))) print('Test F1 Score: {:.3f}'.format( f1_score(y_test_full.values.ravel(), pipe_gb_percentile.predict(X_test_selected), average='micro'))) # Model-based Selection select = SelectFromModel(RandomForestClassifier(n_estimators=100, random_state=42), threshold="1.25*mean") select.fit(X_train_full, y_train_full.values.ravel()) X_train_model = select.transform(X_train_full) X_test_model = select.transform(X_test_full) # GradientBoost Classifier print( '--------------------------Without Model-based Selection--------------------------------------' ) pipe_gb = Pipeline([('scl', StandardScaler()), ('est', GradientBoostingClassifier(random_state=39))]) pipe_gb.fit(X_train_full, y_train_full.values.ravel()) print('Train Accuracy: {:.3f}'.format( accuracy_score(y_train_full.values.ravel(), pipe_gb.predict(X_train_full)))) print('Test Accuracy: {:.3f}'.format( accuracy_score(y_test_full.values.ravel(), pipe_gb.predict(X_test_full)))) print('Train F1 Score: {:.3f}'.format( f1_score(y_train_full.values.ravel(), pipe_gb.predict(X_train_full), average='micro'))) print('Test F1 Score: {:.3f}'.format( f1_score(y_test_full.values.ravel(), pipe_gb.predict(X_test_full), average='micro'))) # GradientBoost Classifier with Model-based Selection print( '----------------------------With Model-based Selection--------------------------------------' ) pipe_gb_model = Pipeline([('scl', StandardScaler()), ('est', GradientBoostingClassifier(random_state=39))]) pipe_gb_model.fit(X_train_model, y_train_full.values.ravel()) print('Train Accuracy: {:.3f}'.format( accuracy_score(y_train_full.values.ravel(), pipe_gb_model.predict(X_train_model)))) print('Test Accuracy: {:.3f}'.format( accuracy_score(y_test_full.values.ravel(), pipe_gb_model.predict(X_test_model)))) print('Train F1 Score: {:.3f}'.format( f1_score(y_train_full.values.ravel(), pipe_gb_model.predict(X_train_model), average='micro'))) print('Test F1 Score: {:.3f}'.format( f1_score(y_test_full.values.ravel(), pipe_gb_model.predict(X_test_model), average='micro'))) # Recursive Feature Elimination select = RFE(RandomForestClassifier(n_estimators=100, random_state=42), n_features_to_select=15) select.fit(X_train_full, y_train_full.values.ravel()) X_train_rfe = select.transform(X_train_full) X_test_rfe = select.transform(X_test_full) # GradientBoost Classifier print( '--------------------------Without Recursive Feature Elimination-------------------------------------' ) pipe_gb = Pipeline([('scl', StandardScaler()), ('est', GradientBoostingClassifier(random_state=39))]) pipe_gb.fit(X_train_full, y_train_full.values.ravel()) print('Train Accuracy: {:.3f}'.format( accuracy_score(y_train_full.values.ravel(), pipe_gb.predict(X_train_full)))) print('Test Accuracy: {:.3f}'.format( accuracy_score(y_test_full.values.ravel(), pipe_gb.predict(X_test_full)))) print('Train F1 Score: {:.3f}'.format( f1_score(y_train_full.values.ravel(), pipe_gb.predict(X_train_full), average='micro'))) print('Test F1 Score: {:.3f}'.format( f1_score(y_test_full.values.ravel(), pipe_gb.predict(X_test_full), average='micro'))) # GradientBoost Classifier with Recursive Feature Elimination print( '----------------------------With Recursive Feature Elimination--------------------------------------' ) pipe_gb_rfe = Pipeline([('scl', StandardScaler()), ('est', GradientBoostingClassifier(random_state=39))]) pipe_gb_rfe.fit(X_train_rfe, y_train_full.values.ravel()) print('Train Accuracy: {:.3f}'.format( accuracy_score(y_train_full.values.ravel(), pipe_gb_rfe.predict(X_train_rfe)))) print('Test Accuracy: {:.3f}'.format( accuracy_score(y_test_full.values.ravel(), pipe_gb_rfe.predict(X_test_rfe)))) print('Train F1 Score: {:.3f}'.format( f1_score(y_train_full.values.ravel(), pipe_gb_rfe.predict(X_train_rfe), average='micro'))) print('Test F1 Score: {:.3f}'.format( f1_score(y_test_full.values.ravel(), pipe_gb_rfe.predict(X_test_rfe), average='micro'))) cv = cross_val_score(pipe_gb, X_, y_.values.ravel(), cv=StratifiedKFold(n_splits=10, shuffle=True, random_state=39)) print('Cross validation with StratifiedKFold scores: {}'.format(cv)) print('Cross Validation with StatifiedKFold mean: {}'.format(cv.mean())) # GridSearch n_features = len(df.columns) param_grid = { 'learning_rate': [0.01, 0.1, 1, 10], 'n_estimators': [1, 10, 100, 200, 300], 'max_depth': [1, 2, 3, 4, 5] } stratifiedcv = StratifiedKFold(n_splits=10, shuffle=True, random_state=39) X_train, X_test, y_train, y_test = train_test_split(X_, y_, test_size=0.33, random_state=42) grid_search = GridSearchCV(GradientBoostingClassifier(), param_grid, cv=stratifiedcv) grid_search.fit(X_train, y_train.values.ravel()) print('GridSearch Train Accuracy: {:.3f}'.format( accuracy_score(y_train.values.ravel(), grid_search.predict(X_train)))) print('GridSearch Test Accuracy: {:.3f}'.format( accuracy_score(y_test.values.ravel(), grid_search.predict(X_test)))) print('GridSearch Train F1 Score: {:.3f}'.format( f1_score(y_train.values.ravel(), grid_search.predict(X_train), average='micro'))) print('GridSearch Test F1 Score: {:.3f}'.format( f1_score(y_test.values.ravel(), grid_search.predict(X_test), average='micro'))) # GridSearch results print("Best params:\n{}".format(grid_search.best_params_)) print("Best cross-validation score: {:.2f}".format( grid_search.best_score_)) results = pd.DataFrame(grid_search.cv_results_) corr_params = results.drop(results.columns[[ 0, 1, 2, 3, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 19, 20 ]], axis=1) corr_params.head() # GridSearch in nested cv_gb = cross_val_score(grid_search, X_, y_.values.ravel(), cv=StratifiedKFold(n_splits=3, shuffle=True, random_state=39)) print('Grid Search with nested cross validation scores: {}'.format(cv_gb)) print('Grid Search with nested cross validation mean: {}'.format( cv_gb.mean()))
def calculate(self, para): self.t = self.inputdata[:, 0] self.op = self.inputdata[:, 1] self.high = self.inputdata[:, 2] self.low = self.inputdata[:, 3] self.close = self.inputdata[:, 4] #adjusted close self.close1 = self.inputdata[:, 5] self.volume = self.inputdata[:, 6] #Overlap study #Overlap Studies #Overlap Studies if para is 'BBANDS': #Bollinger Bands upperband, middleband, lowerband = ta.BBANDS(self.close, timeperiod=self.tp, nbdevup=2, nbdevdn=2, matype=0) self.output = [upperband, middleband, lowerband] elif para is 'DEMA': #Double Exponential Moving Average self.output = ta.DEMA(self.close, timeperiod=self.tp) elif para is 'EMA': #Exponential Moving Average self.output = ta.EMA(self.close, timeperiod=self.tp) elif para is 'HT_TRENDLINE': #Hilbert Transform - Instantaneous Trendline self.output = ta.HT_TRENDLINE(self.close) elif para is 'KAMA': #Kaufman Adaptive Moving Average self.output = ta.KAMA(self.close, timeperiod=self.tp) elif para is 'MA': #Moving average self.output = ta.MA(self.close, timeperiod=self.tp, matype=0) elif para is 'MAMA': #MESA Adaptive Moving Average mama, fama = ta.MAMA(self.close, fastlimit=0, slowlimit=0) elif para is 'MAVP': #Moving average with variable period self.output = ta.MAVP(self.close, periods=10, minperiod=self.tp, maxperiod=self.tp1, matype=0) elif para is 'MIDPOINT': #MidPoint over period self.output = ta.MIDPOINT(self.close, timeperiod=self.tp) elif para is 'MIDPRICE': #Midpoint Price over period self.output = ta.MIDPRICE(self.high, self.low, timeperiod=self.tp) elif para is 'SAR': #Parabolic SAR self.output = ta.SAR(self.high, self.low, acceleration=0, maximum=0) elif para is 'SAREXT': #Parabolic SAR - Extended self.output = ta.SAREXT(self.high, self.low, startvalue=0, offsetonreverse=0, accelerationinitlong=0, accelerationlong=0, accelerationmaxlong=0, accelerationinitshort=0, accelerationshort=0, accelerationmaxshort=0) elif para is 'SMA': #Simple Moving Average self.output = ta.SMA(self.close, timeperiod=self.tp) elif para is 'T3': #Triple Exponential Moving Average (T3) self.output = ta.T3(self.close, timeperiod=self.tp, vfactor=0) elif para is 'TEMA': #Triple Exponential Moving Average self.output = ta.TEMA(self.close, timeperiod=self.tp) elif para is 'TRIMA': #Triangular Moving Average self.output = ta.TRIMA(self.close, timeperiod=self.tp) elif para is 'WMA': #Weighted Moving Average self.output = ta.WMA(self.close, timeperiod=self.tp) #Momentum Indicators elif para is 'ADX': #Average Directional Movement Index self.output = ta.ADX(self.high, self.low, self.close, timeperiod=self.tp) elif para is 'ADXR': #Average Directional Movement Index Rating self.output = ta.ADXR(self.high, self.low, self.close, timeperiod=self.tp) elif para is 'APO': #Absolute Price Oscillator self.output = ta.APO(self.close, fastperiod=12, slowperiod=26, matype=0) elif para is 'AROON': #Aroon aroondown, aroonup = ta.AROON(self.high, self.low, timeperiod=self.tp) self.output = [aroondown, aroonup] elif para is 'AROONOSC': #Aroon Oscillator self.output = ta.AROONOSC(self.high, self.low, timeperiod=self.tp) elif para is 'BOP': #Balance Of Power self.output = ta.BOP(self.op, self.high, self.low, self.close) elif para is 'CCI': #Commodity Channel Index self.output = ta.CCI(self.high, self.low, self.close, timeperiod=self.tp) elif para is 'CMO': #Chande Momentum Oscillator self.output = ta.CMO(self.close, timeperiod=self.tp) elif para is 'DX': #Directional Movement Index self.output = ta.DX(self.high, self.low, self.close, timeperiod=self.tp) elif para is 'MACD': #Moving Average Convergence/Divergence macd, macdsignal, macdhist = ta.MACD(self.close, fastperiod=12, slowperiod=26, signalperiod=9) self.output = [macd, macdsignal, macdhist] elif para is 'MACDEXT': #MACD with controllable MA type macd, macdsignal, macdhist = ta.MACDEXT(self.close, fastperiod=12, fastmatype=0, slowperiod=26, slowmatype=0, signalperiod=9, signalmatype=0) self.output = [macd, macdsignal, macdhist] elif para is 'MACDFIX': #Moving Average Convergence/Divergence Fix 12/26 macd, macdsignal, macdhist = ta.MACDFIX(self.close, signalperiod=9) self.output = [macd, macdsignal, macdhist] elif para is 'MFI': #Money Flow Index self.output = ta.MFI(self.high, self.low, self.close, self.volume, timeperiod=self.tp) elif para is 'MINUS_DI': #Minus Directional Indicator self.output = ta.MINUS_DI(self.high, self.low, self.close, timeperiod=self.tp) elif para is 'MINUS_DM': #Minus Directional Movement self.output = ta.MINUS_DM(self.high, self.low, timeperiod=self.tp) elif para is 'MOM': #Momentum self.output = ta.MOM(self.close, timeperiod=10) elif para is 'PLUS_DI': #Plus Directional Indicator self.output = ta.PLUS_DI(self.high, self.low, self.close, timeperiod=self.tp) elif para is 'PLUS_DM': #Plus Directional Movement self.output = ta.PLUS_DM(self.high, self.low, timeperiod=self.tp) elif para is 'PPO': #Percentage Price Oscillator self.output = ta.PPO(self.close, fastperiod=12, slowperiod=26, matype=0) elif para is 'ROC': #Rate of change : ((price/prevPrice)-1)*100 self.output = ta.ROC(self.close, timeperiod=10) elif para is 'ROCP': #Rate of change Percentage: (price-prevPrice)/prevPrice self.output = ta.ROCP(self.close, timeperiod=10) elif para is 'ROCR': #Rate of change ratio: (price/prevPrice) self.output = ta.ROCR(self.close, timeperiod=10) elif para is 'ROCR100': #Rate of change ratio 100 scale: (price/prevPrice)*100 self.output = ta.ROCR100(self.close, timeperiod=10) elif para is 'RSI': #Relative Strength Index self.output = ta.RSI(self.close, timeperiod=self.tp) elif para is 'STOCH': #Stochastic slowk, slowd = ta.STOCH(self.high, self.low, self.close, fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0) self.output = [slowk, slowd] elif para is 'STOCHF': #Stochastic Fast fastk, fastd = ta.STOCHF(self.high, self.low, self.close, fastk_period=5, fastd_period=3, fastd_matype=0) self.output = [fastk, fastd] elif para is 'STOCHRSI': #Stochastic Relative Strength Index fastk, fastd = ta.STOCHRSI(self.close, timeperiod=self.tp, fastk_period=5, fastd_period=3, fastd_matype=0) self.output = [fastk, fastd] elif para is 'TRIX': #1-day Rate-Of-Change (ROC) of a Triple Smooth EMA self.output = ta.TRIX(self.close, timeperiod=self.tp) elif para is 'ULTOSC': #Ultimate Oscillator self.output = ta.ULTOSC(self.high, self.low, self.close, timeperiod1=self.tp, timeperiod2=self.tp1, timeperiod3=self.tp2) elif para is 'WILLR': #Williams' %R self.output = ta.WILLR(self.high, self.low, self.close, timeperiod=self.tp) # Volume Indicators : # elif para is 'AD': #Chaikin A/D Line self.output = ta.AD(self.high, self.low, self.close, self.volume) elif para is 'ADOSC': #Chaikin A/D Oscillator self.output = ta.ADOSC(self.high, self.low, self.close, self.volume, fastperiod=3, slowperiod=10) elif para is 'OBV': #On Balance Volume self.output = ta.OBV(self.close, self.volume) # Volatility Indicators: # elif para is 'ATR': #Average True Range self.output = ta.ATR(self.high, self.low, self.close, timeperiod=self.tp) elif para is 'NATR': #Normalized Average True Range self.output = ta.NATR(self.high, self.low, self.close, timeperiod=self.tp) elif para is 'TRANGE': #True Range self.output = ta.TRANGE(self.high, self.low, self.close) #Price Transform : # elif para is 'AVGPRICE': #Average Price self.output = ta.AVGPRICE(self.op, self.high, self.low, self.close) elif para is 'MEDPRICE': #Median Price self.output = ta.MEDPRICE(self.high, self.low) elif para is 'TYPPRICE': #Typical Price self.output = ta.TYPPRICE(self.high, self.low, self.close) elif para is 'WCLPRICE': #Weighted Close Price self.output = ta.WCLPRICE(self.high, self.low, self.close) #Cycle Indicators : # elif para is 'HT_DCPERIOD': #Hilbert Transform - Dominant Cycle Period self.output = ta.HT_DCPERIOD(self.close) elif para is 'HT_DCPHASE': #Hilbert Transform - Dominant Cycle Phase self.output = ta.HT_DCPHASE(self.close) elif para is 'HT_PHASOR': #Hilbert Transform - Phasor Components inphase, quadrature = ta.HT_PHASOR(self.close) self.output = [inphase, quadrature] elif para is 'HT_SINE': #Hilbert Transform - SineWave #2 sine, leadsine = ta.HT_SINE(self.close) self.output = [sine, leadsine] elif para is 'HT_TRENDMODE': #Hilbert Transform - Trend vs Cycle Mode self.integer = ta.HT_TRENDMODE(self.close) #Pattern Recognition : # elif para is 'CDL2CROWS': #Two Crows self.integer = ta.CDL2CROWS(self.op, self.high, self.low, self.close) elif para is 'CDL3BLACKCROWS': #Three Black Crows self.integer = ta.CDL3BLACKCROWS(self.op, self.high, self.low, self.close) elif para is 'CDL3INSIDE': #Three Inside Up/Down self.integer = ta.CDL3INSIDE(self.op, self.high, self.low, self.close) elif para is 'CDL3LINESTRIKE': #Three-Line Strike self.integer = ta.CDL3LINESTRIKE(self.op, self.high, self.low, self.close) elif para is 'CDL3OUTSIDE': #Three Outside Up/Down self.integer = ta.CDL3OUTSIDE(self.op, self.high, self.low, self.close) elif para is 'CDL3STARSINSOUTH': #Three Stars In The South self.integer = ta.CDL3STARSINSOUTH(self.op, self.high, self.low, self.close) elif para is 'CDL3WHITESOLDIERS': #Three Advancing White Soldiers self.integer = ta.CDL3WHITESOLDIERS(self.op, self.high, self.low, self.close) elif para is 'CDLABANDONEDBABY': #Abandoned Baby self.integer = ta.CDLABANDONEDBABY(self.op, self.high, self.low, self.close, penetration=0) elif para is 'CDLBELTHOLD': #Belt-hold self.integer = ta.CDLBELTHOLD(self.op, self.high, self.low, self.close) elif para is 'CDLBREAKAWAY': #Breakaway self.integer = ta.CDLBREAKAWAY(self.op, self.high, self.low, self.close) elif para is 'CDLCLOSINGMARUBOZU': #Closing Marubozu self.integer = ta.CDLCLOSINGMARUBOZU(self.op, self.high, self.low, self.close) elif para is 'CDLCONCEALBABYSWALL': #Concealing Baby Swallow self.integer = ta.CDLCONCEALBABYSWALL(self.op, self.high, self.low, self.close) elif para is 'CDLCOUNTERATTACK': #Counterattack self.integer = ta.CDLCOUNTERATTACK(self.op, self.high, self.low, self.close) elif para is 'CDLDARKCLOUDCOVER': #Dark Cloud Cover self.integer = ta.CDLDARKCLOUDCOVER(self.op, self.high, self.low, self.close, penetration=0) elif para is 'CDLDOJI': #Doji self.integer = ta.CDLDOJI(self.op, self.high, self.low, self.close) elif para is 'CDLDOJISTAR': #Doji Star self.integer = ta.CDLDOJISTAR(self.op, self.high, self.low, self.close) elif para is 'CDLDRAGONFLYDOJI': #Dragonfly Doji self.integer = ta.CDLDRAGONFLYDOJI(self.op, self.high, self.low, self.close) elif para is 'CDLENGULFING': #Engulfing Pattern self.integer = ta.CDLENGULFING(self.op, self.high, self.low, self.close) elif para is 'CDLEVENINGDOJISTAR': #Evening Doji Star self.integer = ta.CDLEVENINGDOJISTAR(self.op, self.high, self.low, self.close, penetration=0) elif para is 'CDLEVENINGSTAR': #Evening Star self.integer = ta.CDLEVENINGSTAR(self.op, self.high, self.low, self.close, penetration=0) elif para is 'CDLGAPSIDESIDEWHITE': #Up/Down-gap side-by-side white lines self.integer = ta.CDLGAPSIDESIDEWHITE(self.op, self.high, self.low, self.close) elif para is 'CDLGRAVESTONEDOJI': #Gravestone Doji self.integer = ta.CDLGRAVESTONEDOJI(self.op, self.high, self.low, self.close) elif para is 'CDLHAMMER': #Hammer self.integer = ta.CDLHAMMER(self.op, self.high, self.low, self.close) elif para is 'CDLHANGINGMAN': #Hanging Man self.integer = ta.CDLHANGINGMAN(self.op, self.high, self.low, self.close) elif para is 'CDLHARAMI': #Harami Pattern self.integer = ta.CDLHARAMI(self.op, self.high, self.low, self.close) elif para is 'CDLHARAMICROSS': #Harami Cross Pattern self.integer = ta.CDLHARAMICROSS(self.op, self.high, self.low, self.close) elif para is 'CDLHIGHWAVE': #High-Wave Candle self.integer = ta.CDLHIGHWAVE(self.op, self.high, self.low, self.close) elif para is 'CDLHIKKAKE': #Hikkake Pattern self.integer = ta.CDLHIKKAKE(self.op, self.high, self.low, self.close) elif para is 'CDLHIKKAKEMOD': #Modified Hikkake Pattern self.integer = ta.CDLHIKKAKEMOD(self.op, self.high, self.low, self.close) elif para is 'CDLHOMINGPIGEON': #Homing Pigeon self.integer = ta.CDLHOMINGPIGEON(self.op, self.high, self.low, self.close) elif para is 'CDLIDENTICAL3CROWS': #Identical Three Crows self.integer = ta.CDLIDENTICAL3CROWS(self.op, self.high, self.low, self.close) elif para is 'CDLINNECK': #In-Neck Pattern self.integer = ta.CDLINNECK(self.op, self.high, self.low, self.close) elif para is 'CDLINVERTEDHAMMER': #Inverted Hammer self.integer = ta.CDLINVERTEDHAMMER(self.op, self.high, self.low, self.close) elif para is 'CDLKICKING': #Kicking self.integer = ta.CDLKICKING(self.op, self.high, self.low, self.close) elif para is 'CDLKICKINGBYLENGTH': #Kicking - bull/bear determined by the longer marubozu self.integer = ta.CDLKICKINGBYLENGTH(self.op, self.high, self.low, self.close) elif para is 'CDLLADDERBOTTOM': #Ladder Bottom self.integer = ta.CDLLADDERBOTTOM(self.op, self.high, self.low, self.close) elif para is 'CDLLONGLEGGEDDOJI': #Long Legged Doji self.integer = ta.CDLLONGLEGGEDDOJI(self.op, self.high, self.low, self.close) elif para is 'CDLLONGLINE': #Long Line Candle self.integer = ta.CDLLONGLINE(self.op, self.high, self.low, self.close) elif para is 'CDLMARUBOZU': #Marubozu self.integer = ta.CDLMARUBOZU(self.op, self.high, self.low, self.close) elif para is 'CDLMATCHINGLOW': #Matching Low self.integer = ta.CDLMATCHINGLOW(self.op, self.high, self.low, self.close) elif para is 'CDLMATHOLD': #Mat Hold self.integer = ta.CDLMATHOLD(self.op, self.high, self.low, self.close, penetration=0) elif para is 'CDLMORNINGDOJISTAR': #Morning Doji Star self.integer = ta.CDLMORNINGDOJISTAR(self.op, self.high, self.low, self.close, penetration=0) elif para is 'CDLMORNINGSTAR': #Morning Star self.integer = ta.CDLMORNINGSTAR(self.op, self.high, self.low, self.close, penetration=0) elif para is 'CDLONNECK': #On-Neck Pattern self.integer = ta.CDLONNECK(self.op, self.high, self.low, self.close) elif para is 'CDLPIERCING': #Piercing Pattern self.integer = ta.CDLPIERCING(self.op, self.high, self.low, self.close) elif para is 'CDLRICKSHAWMAN': #Rickshaw Man self.integer = ta.CDLRICKSHAWMAN(self.op, self.high, self.low, self.close) elif para is 'CDLRISEFALL3METHODS': #Rising/Falling Three Methods self.integer = ta.CDLRISEFALL3METHODS(self.op, self.high, self.low, self.close) elif para is 'CDLSEPARATINGLINES': #Separating Lines self.integer = ta.CDLSEPARATINGLINES(self.op, self.high, self.low, self.close) elif para is 'CDLSHOOTINGSTAR': #Shooting Star self.integer = ta.CDLSHOOTINGSTAR(self.op, self.high, self.low, self.close) elif para is 'CDLSHORTLINE': #Short Line Candle self.integer = ta.CDLSHORTLINE(self.op, self.high, self.low, self.close) elif para is 'CDLSPINNINGTOP': #Spinning Top self.integer = ta.CDLSPINNINGTOP(self.op, self.high, self.low, self.close) elif para is 'CDLSTALLEDPATTERN': #Stalled Pattern self.integer = ta.CDLSTALLEDPATTERN(self.op, self.high, self.low, self.close) elif para is 'CDLSTICKSANDWICH': #Stick Sandwich self.integer = ta.CDLSTICKSANDWICH(self.op, self.high, self.low, self.close) elif para is 'CDLTAKURI': #Takuri (Dragonfly Doji with very long lower shadow) self.integer = ta.CDLTAKURI(self.op, self.high, self.low, self.close) elif para is 'CDLTASUKIGAP': #Tasuki Gap self.integer = ta.CDLTASUKIGAP(self.op, self.high, self.low, self.close) elif para is 'CDLTHRUSTING': #Thrusting Pattern self.integer = ta.CDLTHRUSTING(self.op, self.high, self.low, self.close) elif para is 'CDLTRISTAR': #Tristar Pattern self.integer = ta.CDLTRISTAR(self.op, self.high, self.low, self.close) elif para is 'CDLUNIQUE3RIVER': #Unique 3 River self.integer = ta.CDLUNIQUE3RIVER(self.op, self.high, self.low, self.close) elif para is 'CDLUPSIDEGAP2CROWS': #Upside Gap Two Crows self.integer = ta.CDLUPSIDEGAP2CROWS(self.op, self.high, self.low, self.close) elif para is 'CDLXSIDEGAP3METHODS': #Upside/Downside Gap Three Methods self.integer = ta.CDLXSIDEGAP3METHODS(self.op, self.high, self.low, self.close) #Statistic Functions : # elif para is 'BETA': #Beta self.output = ta.BETA(self.high, self.low, timeperiod=5) elif para is 'CORREL': #Pearson's Correlation Coefficient (r) self.output = ta.CORREL(self.high, self.low, timeperiod=self.tp) elif para is 'LINEARREG': #Linear Regression self.output = ta.LINEARREG(self.close, timeperiod=self.tp) elif para is 'LINEARREG_ANGLE': #Linear Regression Angle self.output = ta.LINEARREG_ANGLE(self.close, timeperiod=self.tp) elif para is 'LINEARREG_INTERCEPT': #Linear Regression Intercept self.output = ta.LINEARREG_INTERCEPT(self.close, timeperiod=self.tp) elif para is 'LINEARREG_SLOPE': #Linear Regression Slope self.output = ta.LINEARREG_SLOPE(self.close, timeperiod=self.tp) elif para is 'STDDEV': #Standard Deviation self.output = ta.STDDEV(self.close, timeperiod=5, nbdev=1) elif para is 'TSF': #Time Series Forecast self.output = ta.TSF(self.close, timeperiod=self.tp) elif para is 'VAR': #Variance self.output = ta.VAR(self.close, timeperiod=5, nbdev=1) else: print('You issued command:' + para)
def TALIB_ULTOSC(close, timeperiod1=7, timeperiod2=14, timeperiod3=28): '''00393,4,1''' return talib.ULTOSC(close, timeperiod1, timeperiod2, timeperiod3)
def process_data(self): self.main_df = self.df.copy() self.main_df["return_log"] = self.main_df["mid"].pct_change(1) self.main_df["Close"] = talib.DEMA( np.array(self.main_df["Close"]), timeperiod=3) self.main_df["High"] = talib.DEMA( np.array(self.main_df["High"]), timeperiod=3) self.main_df["Low"] = talib.DEMA( np.array(self.main_df["Low"]), timeperiod=3) self.main_df["Open"] = talib.DEMA( np.array(self.main_df["Open"]), timeperiod=3) self.main_df["dema"] = talib.DEMA( np.array(self.main_df["Close"]), timeperiod=30) self.main_df["kama"] = talib.KAMA(np.array( self.main_df["Close"]), timeperiod=30) # Kaufman Adaptive Moving Average self.main_df["trima"] = talib.TRIMA( np.array(self.main_df["Close"]), timeperiod=30) # Triple exponential self.main_df["WMA"] = talib.WMA( np.array(self.main_df["Close"]), timeperiod=30) # Weighted moving average self.main_df["adx"] = talib.ADX(np.array(self.main_df["High"]), np.array( self.main_df["Low"]), np.array(self.main_df["Close"]), timeperiod=14) self.main_df["adxr"] = talib.ADXR(np.array(self.main_df["High"]), np.array( self.main_df["Low"]), np.array(self.main_df["Close"]), timeperiod=14) self.main_df["apo"] = talib.APO( np.array(self.main_df["Close"]), fastperiod=12, slowperiod=26) self.main_df["aroondown"], self.main_df["aroonup"] = talib.AROON( np.array(self.main_df["High"]), np.array(self.main_df["Low"]), timeperiod=14) self.main_df["aroonosc"] = talib.AROONOSC( np.array(self.main_df["High"]), np.array(self.main_df["Low"]), timeperiod=14) self.main_df["bop"] = talib.BOP(np.array(self.main_df["Open"]), np.array( self.main_df["High"]), np.array(self.main_df["Low"]), np.array(self.main_df["Close"])) self.main_df["cmo"] = talib.CMO( np.array(self.main_df["Close"]), timeperiod=14) self.main_df["dx"] = talib.DX(np.array(self.main_df["High"]), np.array( self.main_df["Low"]), np.array(self.main_df["Close"]), timeperiod=14) self.main_df["mfi"] = talib.MFI(np.array(self.main_df["High"]), np.array(self.main_df["Low"]), np.array( self.main_df["Close"]), np.array(self.main_df["Volume"]), timeperiod=14) self.main_df["minus_di"] = talib.MINUS_DI(np.array(self.main_df["High"]), np.array( self.main_df["Low"]), np.array(self.main_df["Close"]), timeperiod=14) self.main_df["minus_dm"] = talib.MINUS_DM( np.array(self.main_df["High"]), np.array(self.main_df["Low"]), timeperiod=14) self.main_df["plus_di"] = talib.PLUS_DI(np.array(self.main_df["High"]), np.array( self.main_df["Low"]), np.array(self.main_df["Close"]), timeperiod=14) self.main_df["plus_dm"] = talib.PLUS_DM( np.array(self.main_df["High"]), np.array(self.main_df["Low"]), timeperiod=14) self.main_df["ppo"] = talib.PPO( np.array(self.main_df["Close"]), fastperiod=10, slowperiod=20) self.main_df["rsi_14"] = talib.RSI( np.array(self.main_df["Close"]), timeperiod=14) self.main_df["slowk"], self.main_df["slowd"] = talib.STOCH(np.array(self.main_df["High"]), np.array(self.main_df["Low"]), np.array( self.main_df["Close"]), fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0) self.main_df["macd"], self.main_df["macdsignal"], self.main_df["macdhist"] = talib.MACD( np.array(self.main_df["Close"]), fastperiod=12, slowperiod=26, signalperiod=9) self.main_df["cci"] = talib.CCI(np.array(self.main_df["High"]), np.array( self.main_df["Low"]), np.array(self.main_df["Close"]), timeperiod=14) self.main_df["mom20"] = talib.MOM( np.array(self.main_df["Close"]), timeperiod=20) self.main_df["mom10"] = talib.MOM( np.array(self.main_df["Close"]), timeperiod=10) self.main_df["ma20"] = talib.SMA( np.array(self.main_df["Close"]), timeperiod=20) self.main_df["ma10"] = talib.SMA( np.array(self.main_df["Close"]), timeperiod=10) self.main_df["roc"] = talib.ROC( np.array(self.main_df["Close"]), timeperiod=10) self.main_df["ult"] = talib.ULTOSC(np.array(self.main_df["High"]), np.array( self.main_df["Low"]), np.array(self.main_df["Close"]), timeperiod1=7, timeperiod2=14, timeperiod3=28) self.main_df["will"] = talib.WILLR(np.array(self.main_df["High"]), np.array( self.main_df["Low"]), np.array(self.main_df["Close"]), timeperiod=14) self.main_df["return_1df"] = self.main_df["return_log"].shift( -1) self.main_df = self.main_df.dropna().iloc[140:, :] return self.main_df
def calc_features(df): open = df['op'] high = df['hi'] low = df['lo'] close = df['cl'] volume = df['volume'] orig_columns = df.columns hilo = (df['hi'] + df['lo']) / 2 df['BBANDS_upperband'], df['BBANDS_middleband'], df[ 'BBANDS_lowerband'] = talib.BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0) df['BBANDS_upperband'] -= hilo df['BBANDS_middleband'] -= hilo df['BBANDS_lowerband'] -= hilo df['DEMA'] = talib.DEMA(close, timeperiod=30) - hilo df['EMA'] = talib.EMA(close, timeperiod=30) - hilo df['HT_TRENDLINE'] = talib.HT_TRENDLINE(close) - hilo df['KAMA'] = talib.KAMA(close, timeperiod=30) - hilo df['MA'] = talib.MA(close, timeperiod=30, matype=0) - hilo df['MIDPOINT'] = talib.MIDPOINT(close, timeperiod=14) - hilo df['SMA'] = talib.SMA(close, timeperiod=30) - hilo df['T3'] = talib.T3(close, timeperiod=5, vfactor=0) - hilo df['TEMA'] = talib.TEMA(close, timeperiod=30) - hilo df['TRIMA'] = talib.TRIMA(close, timeperiod=30) - hilo df['WMA'] = talib.WMA(close, timeperiod=30) - hilo df['ADX'] = talib.ADX(high, low, close, timeperiod=14) df['ADXR'] = talib.ADXR(high, low, close, timeperiod=14) df['APO'] = talib.APO(close, fastperiod=12, slowperiod=26, matype=0) df['AROON_aroondown'], df['AROON_aroonup'] = talib.AROON(high, low, timeperiod=14) df['AROONOSC'] = talib.AROONOSC(high, low, timeperiod=14) df['BOP'] = talib.BOP(open, high, low, close) df['CCI'] = talib.CCI(high, low, close, timeperiod=14) df['DX'] = talib.DX(high, low, close, timeperiod=14) df['MACD_macd'], df['MACD_macdsignal'], df['MACD_macdhist'] = talib.MACD( close, fastperiod=12, slowperiod=26, signalperiod=9) # skip MACDEXT MACDFIX たぶん同じなので df['MFI'] = talib.MFI(high, low, close, volume, timeperiod=14) df['MINUS_DI'] = talib.MINUS_DI(high, low, close, timeperiod=14) df['MINUS_DM'] = talib.MINUS_DM(high, low, timeperiod=14) df['MOM'] = talib.MOM(close, timeperiod=10) df['PLUS_DI'] = talib.PLUS_DI(high, low, close, timeperiod=14) df['PLUS_DM'] = talib.PLUS_DM(high, low, timeperiod=14) df['RSI'] = talib.RSI(close, timeperiod=14) df['STOCH_slowk'], df['STOCH_slowd'] = talib.STOCH(high, low, close, fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0) df['STOCHF_fastk'], df['STOCHF_fastd'] = talib.STOCHF(high, low, close, fastk_period=5, fastd_period=3, fastd_matype=0) df['STOCHRSI_fastk'], df['STOCHRSI_fastd'] = talib.STOCHRSI(close, timeperiod=14, fastk_period=5, fastd_period=3, fastd_matype=0) df['TRIX'] = talib.TRIX(close, timeperiod=30) df['ULTOSC'] = talib.ULTOSC(high, low, close, timeperiod1=7, timeperiod2=14, timeperiod3=28) df['WILLR'] = talib.WILLR(high, low, close, timeperiod=14) df['AD'] = talib.AD(high, low, close, volume) df['ADOSC'] = talib.ADOSC(high, low, close, volume, fastperiod=3, slowperiod=10) df['OBV'] = talib.OBV(close, volume) df['ATR'] = talib.ATR(high, low, close, timeperiod=14) df['NATR'] = talib.NATR(high, low, close, timeperiod=14) df['TRANGE'] = talib.TRANGE(high, low, close) df['HT_DCPERIOD'] = talib.HT_DCPERIOD(close) df['HT_DCPHASE'] = talib.HT_DCPHASE(close) df['HT_PHASOR_inphase'], df['HT_PHASOR_quadrature'] = talib.HT_PHASOR( close) df['HT_SINE_sine'], df['HT_SINE_leadsine'] = talib.HT_SINE(close) df['HT_TRENDMODE'] = talib.HT_TRENDMODE(close) df['BETA'] = talib.BETA(high, low, timeperiod=5) df['CORREL'] = talib.CORREL(high, low, timeperiod=30) df['LINEARREG'] = talib.LINEARREG(close, timeperiod=14) - close df['LINEARREG_ANGLE'] = talib.LINEARREG_ANGLE(close, timeperiod=14) df['LINEARREG_INTERCEPT'] = talib.LINEARREG_INTERCEPT( close, timeperiod=14) - close df['LINEARREG_SLOPE'] = talib.LINEARREG_SLOPE(close, timeperiod=14) df['STDDEV'] = talib.STDDEV(close, timeperiod=5, nbdev=1) return df
def get_datasets(asset, currency, granularity, datapoints): """Fetch the API and precess the desired pair Arguments: asset {str} -- First pair currency {str} -- Second pair granularity {str ['day', 'hour']} -- Granularity datapoints {int [100 - 2000]} -- [description] Returns: pandas.Dataframe -- The OHLCV and indicators dataframe """ df_train_path = 'datasets/bot_train_{}_{}_{}.csv'.format( asset + currency, datapoints, granularity) df_rollout_path = 'datasets/bot_rollout_{}_{}_{}.csv'.format( asset + currency, datapoints, granularity) emojis = [ ':moneybag:', ':yen:', ':dollar:', ':pound:', ':euro:', ':credit_card:', ':money_with_wings:', ':gem:' ] if not os.path.exists(df_rollout_path): headers = { 'User-Agent': 'Mozilla/5.0', 'authorization': 'Apikey 3d7d3e9e6006669ac00584978342451c95c3c78421268ff7aeef69995f9a09ce' } # OHLC # url = 'https://min-api.cryptocompare.com/data/histo{}?fsym={}&tsym={}&e=Binance&limit={}'.format(granularity, asset, currency, datapoints) url = 'https://min-api.cryptocompare.com/data/histo{}?fsym={}&tsym={}&limit={}'.format( granularity, asset, currency, datapoints) # print(emoji.emojize(':dizzy: :large_blue_diamond: :gem: :bar_chart: :crystal_ball: :chart_with_downwards_trend: :chart_with_upwards_trend: :large_orange_diamond: loading...', use_aliases=True)) print( colored( emoji.emojize('> ' + random.choice(emojis) + ' downloading ' + asset + '/' + currency, use_aliases=True), 'green')) # print(colored('> downloading ' + asset + '/' + currency, 'green')) response = requests.get(url, headers=headers) json_response = response.json() status = json_response['Response'] if status == "Error": print(colored('=== {} ==='.format(json_response['Message']), 'red')) raise AssertionError() result = json_response['Data'] df = pd.DataFrame(result) print(df.tail()) df['Date'] = pd.to_datetime(df['time'], utc=True, unit='s') df.drop('time', axis=1, inplace=True) # indicators # https://github.com/mrjbq7/ta-lib/blob/master/docs/func.md open_price, high, low, close = np.array(df['open']), np.array( df['high']), np.array(df['low']), np.array(df['close']) volume = np.array(df['volumefrom']) # cycle indicators df.loc[:, 'HT_DCPERIOD'] = talib.HT_DCPERIOD(close) df.loc[:, 'HT_DCPHASE'] = talib.HT_DCPHASE(close) df.loc[:, 'HT_PHASOR_inphase'], df.loc[:, 'HT_PHASOR_quadrature'] = talib.HT_PHASOR( close) df.loc[:, 'HT_SINE_sine'], df.loc[:, 'HT_SINE_leadsine'] = talib.HT_SINE( close) df.loc[:, 'HT_TRENDMODE'] = talib.HT_TRENDMODE(close) # momemtum indicators df.loc[:, 'ADX'] = talib.ADX(high, low, close, timeperiod=12) df.loc[:, 'ADXR'] = talib.ADXR(high, low, close, timeperiod=13) df.loc[:, 'APO'] = talib.APO(close, fastperiod=5, slowperiod=10, matype=0) df.loc[:, 'AROON_down'], df.loc[:, 'AROON_up'] = talib.AROON(high, low, timeperiod=15) df.loc[:, 'AROONOSC'] = talib.AROONOSC(high, low, timeperiod=13) df.loc[:, 'BOP'] = talib.BOP(open_price, high, low, close) df.loc[:, 'CCI'] = talib.CCI(high, low, close, timeperiod=13) df.loc[:, 'CMO'] = talib.CMO(close, timeperiod=14) df.loc[:, 'DX'] = talib.DX(high, low, close, timeperiod=10) df['MACD'], df['MACD_signal'], df['MACD_hist'] = talib.MACD( close, fastperiod=5, slowperiod=10, signalperiod=20) df.loc[:, 'MFI'] = talib.MFI(high, low, close, volume, timeperiod=12) df.loc[:, 'MINUS_DI'] = talib.MINUS_DI(high, low, close, timeperiod=10) df.loc[:, 'MINUS_DM'] = talib.MINUS_DM(high, low, timeperiod=14) df.loc[:, 'MOM'] = talib.MOM(close, timeperiod=20) df.loc[:, 'PPO'] = talib.PPO(close, fastperiod=17, slowperiod=35, matype=2) df.loc[:, 'ROC'] = talib.ROC(close, timeperiod=12) df.loc[:, 'RSI'] = talib.RSI(close, timeperiod=25) df.loc[:, 'STOCH_k'], df.loc[:, 'STOCH_d'] = talib.STOCH(high, low, close, fastk_period=35, slowk_period=12, slowk_matype=0, slowd_period=7, slowd_matype=0) df.loc[:, 'STOCHF_k'], df.loc[:, 'STOCHF_d'] = talib.STOCHF(high, low, close, fastk_period=28, fastd_period=14, fastd_matype=0) df.loc[:, 'STOCHRSI_K'], df.loc[:, 'STOCHRSI_D'] = talib.STOCHRSI( close, timeperiod=35, fastk_period=12, fastd_period=10, fastd_matype=1) df.loc[:, 'TRIX'] = talib.TRIX(close, timeperiod=30) df.loc[:, 'ULTOSC'] = talib.ULTOSC(high, low, close, timeperiod1=14, timeperiod2=28, timeperiod3=35) df.loc[:, 'WILLR'] = talib.WILLR(high, low, close, timeperiod=35) # overlap studies df.loc[:, 'BBANDS_upper'], df.loc[:, 'BBANDS_middle'], df.loc[:, 'BBANDS_lower'] = talib.BBANDS( close, timeperiod= 12, nbdevup=2, nbdevdn=2, matype=0) df.loc[:, 'DEMA'] = talib.DEMA(close, timeperiod=30) df.loc[:, 'EMA'] = talib.EMA(close, timeperiod=7) df.loc[:, 'HT_TRENDLINE'] = talib.HT_TRENDLINE(close) df.loc[:, 'KAMA'] = talib.KAMA(close, timeperiod=5) df.loc[:, 'MA'] = talib.MA(close, timeperiod=5, matype=0) df.loc[:, 'MIDPOINT'] = talib.MIDPOINT(close, timeperiod=20) df.loc[:, 'WMA'] = talib.WMA(close, timeperiod=15) df.loc[:, 'SMA'] = talib.SMA(close) # pattern recoginition df.loc[:, 'CDL2CROWS'] = talib.CDL2CROWS(open_price, high, low, close) df.loc[:, 'CDL3BLACKCROWS'] = talib.CDL3BLACKCROWS( open_price, high, low, close) df.loc[:, 'CDL3INSIDE'] = talib.CDL3INSIDE(open_price, high, low, close) df.loc[:, 'CDL3LINESTRIKE'] = talib.CDL3LINESTRIKE( open_price, high, low, close) # price transform df.loc[:, 'WCLPRICE'] = talib.WCLPRICE(high, low, close) # statistic funcitons df.loc[:, 'BETA'] = talib.BETA(high, low, timeperiod=20) df.loc[:, 'CORREL'] = talib.CORREL(high, low, timeperiod=20) df.loc[:, 'STDDEV'] = talib.STDDEV(close, timeperiod=20, nbdev=1) df.loc[:, 'TSF'] = talib.TSF(close, timeperiod=20) df.loc[:, 'VAR'] = talib.VAR(close, timeperiod=20, nbdev=1) # volatility indicators df.loc[:, 'ATR'] = talib.ATR(high, low, close, timeperiod=7) df.loc[:, 'NATR'] = talib.NATR(high, low, close, timeperiod=20) df.loc[:, 'TRANGE'] = talib.TRANGE(high, low, close) # volume indicators df.loc[:, 'AD'] = talib.AD(high, low, close, volume) df.loc[:, 'ADOSC'] = talib.ADOSC(high, low, close, volume, fastperiod=10, slowperiod=20) df.loc[:, 'OBV'] = talib.OBV(close, volume) # df.fillna(df.mean(), inplace=True) df.dropna(inplace=True) df.set_index('Date', inplace=True) print(colored('> caching' + asset + '/' + currency + ':)', 'cyan')) train_size = round( len(df) * DF_TRAIN_SIZE) # 75% to train -> test with different value df_train = df[:train_size] df_rollout = df[train_size:] df_train.to_csv(df_train_path) df_rollout.to_csv(df_rollout_path) df_train = pd.read_csv( df_train_path) # re-read to avoid indexing issue w/ Ray df_rollout = pd.read_csv(df_rollout_path) else: print( colored( emoji.emojize('> ' + random.choice(emojis) + ' feching ' + asset + '/' + currency + ' from cache', use_aliases=True), 'magenta')) # print(colored('> feching ' + asset + '/' + currency + ' from cache :)', 'magenta')) df_train = pd.read_csv(df_train_path) df_rollout = pd.read_csv(df_rollout_path) # df_train.set_index('Date', inplace=True) # df_rollout.set_index('Date', inplace=True) return df_train, df_rollout
fastd_matype=0) #STOCHRSI - Stochastic Relative Strength Index stochrsi_fastk, stochrsi_fastd = ta.STOCHRSI(close, timeperiod=14, fastk_period=5, fastd_period=3, fastd_matype=0) #TRIX - 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA trix = ta.TRIX(close, timeperiod=30) #ULTOSC - Ultimate Oscillator ultosc = ta.ULTOSC(high, low, close, timeperiod1=7, timeperiod2=14, timeperiod3=28) #WILLR - Williams' %R willr = ta.WILLR(high, low, close, timeperiod=14) df_save = pd.DataFrame( data={ 'Date': np.array(df['date']), 'adx': adx, 'adxr': adxr, 'apo': apo, 'aroondown': aroondown, 'aroonup': aroonup, 'aroonosc': aroonosc,