def add_cycle_indicators(data_list): for data in data_list: #HT_DCPERIOD - Hilbert Transform - Dominant Cycle Period real = talib.HT_DCPERIOD(data.Close) data['HT_DCPERIOD'] = real #HT_DCPHASE - Hilbert Transform - Dominant Cycle Phase real = talib.HT_DCPHASE(data.Close) data['HT_DCPHASE'] = real #HT_PHASOR - Hilbert Transform - Phasor Components inphase, quadrature = talib.HT_PHASOR(data.Close) data['HT_PHASOR_inphase'] = inphase data['HT_PHASOR_quadrature'] = quadrature #HT_SINE - Hilbert Transform - SineWave sine, leadsine = talib.HT_SINE(data.Close) data['HT_SINE_sine'] = sine data['HT_SINE_leadsine'] = leadsine #HT_TRENDMODE - Hilbert Transform - Trend vs Cycle Mode integer = talib.HT_TRENDMODE(data.Close) data['HT_TRENDMODE'] = integer return data_list
def eval(self, environment, gene, date1, date2): date1_ = environment.shift_date(date1, -(self.window - 1), -1) df = gene.next_value(environment, date1_, date2) res = pd.DataFrame(np.nan, index=df.ix[date1:date2].index, columns=df.columns) for i, j in product(range(res.shape[0]), range(res.shape[1])): res.iloc[i, j] = talib.HT_TRENDMODE(df.values[i:i + self.window, j])[-1] return res
def HT_TRENDMODE(close): ''' Hilbert Transform - Trend vs Cycle Mode 希尔伯特变换-趋势与周期模式 分组: Cycle Indicators 周期指标 简介: integer = HT_TRENDMODE(close) ''' return talib.HT_TRENDMODE(close)
def getCycleIndicators(df): high = df['High'] low = df['Low'] close = df['Close'] open = df['Open'] volume = df['Volume'] df['DCPERIOD'] = ta.HT_DCPERIOD(close) df['DCPHASE'] = ta.HT_DCPHASE(close) df['INPHASE'], df['QUADRATURE'] = ta.HT_PHASOR(close) df['SINE'], df['LEADSINE'] = ta.HT_SINE(close) df['TRENDMODE'] = ta.HT_TRENDMODE(close)
def sexy(k): if len(k) > 3: vm = wrap(k) print("--talib--") print(list(talib.HT_DCPERIOD(vm))) print(list(talib.HT_DCPHASE(vm))) print(list(talib.HT_PHASOR(vm))) print(list(talib.HT_SINE(vm))) print(list(talib.HT_TRENDMODE(vm))) print("--talib--") else: pass
def computeHilbertTransformSignals(ticker, pd): closeField = config.ticker2ReturnFieldMap[ticker] close = numpy.array(pd[closeField]) pd['Hilbert.DCPeriod'] = talib.HT_DCPERIOD(close) pd['Hilbert.DCPhase'] = talib.HT_DCPHASE(close) pd['Hilbert.inphase'], pd['Hilbert.quadrature'] = talib.HT_PHASOR(close) pd['Hilbert.sine'], pd['Hilbert.leadsine'] = talib.HT_SINE(close) pd['Hilbert.TrendMode'] = talib.HT_TRENDMODE(close) fields = [ 'Hilbert.DCPeriod', 'Hilbert.DCPhase', 'Hilbert.inphase', 'Hilbert.quadrature', 'Hilbert.sine', 'Hilbert.leadsine', 'Hilbert.TrendMode' ] return pd, fields
def ht_trendmode(candles: np.ndarray, source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: """ HT_TRENDMODE - Hilbert Transform - Trend vs Cycle Mode :param candles: np.ndarray :param source_type: str - default: "close" :param sequential: bool - default: False :return: int | np.ndarray """ candles = slice_candles(candles, sequential) source = get_candle_source(candles, source_type=source_type) res = talib.HT_TRENDMODE(source) return res if sequential else res[-1]
def get_additional_factors(open, high, low, close, volume): # Overlap Studies Functions mat = get_all_factors(open, high, low, close, volume) mat = np.column_stack((mat, talib.HT_TRENDLINE(close))) ## close mat = np.column_stack((mat, talib.KAMA(close, timeperiod=30))) ##close #Momentum Indicator Functions mat = np.column_stack((mat, talib.ADX(high, low, close, timeperiod=14))) mat = np.column_stack((mat, talib.ADXR(high, low, close, timeperiod=14))) mat = np.column_stack( (mat, talib.APO(close, fastperiod=12, slowperiod=26, matype=0))) mat = np.column_stack((mat, talib.AROONOSC(high, low, timeperiod=14))) mat = np.column_stack((mat, talib.BOP(open, high, low, close))) mat = np.column_stack((mat, talib.MOM(close, timeperiod=10))) #Volume Indicator Functions mat = np.column_stack((mat, talib.AD(high, low, close, volume))) mat = np.column_stack( (mat, talib.ADOSC(high, low, close, volume, fastperiod=3, slowperiod=10))) mat = np.column_stack((mat, talib.OBV(close, volume))) #Volatility Indicator Functions mat = np.column_stack((mat, talib.NATR(high, low, close, timeperiod=14))) mat = np.column_stack((mat, talib.TRANGE(high, low, close))) #Price Transform Functions mat = np.column_stack((mat, talib.AVGPRICE(open, high, low, close))) mat = np.column_stack((mat, talib.MEDPRICE(high, low))) mat = np.column_stack((mat, talib.TYPPRICE(high, low, close))) mat = np.column_stack((mat, talib.WCLPRICE(high, low, close))) #Cycle Indicator Functions mat = np.column_stack((mat, talib.HT_DCPERIOD(close))) mat = np.column_stack((mat, talib.HT_DCPHASE(close))) mat = np.column_stack((mat, talib.HT_TRENDMODE(close))) # 20 return mat
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 get_technicals_of_series(self, indivations): result = indivations result = np.vstack((result, ta.SMA(indivations, timeperiod=5))) result = np.vstack((result, ta.SMA(indivations, timeperiod=14))) result = np.vstack((result, ta.BBANDS(indivations))) result = np.vstack((result, ta.MAMA(indivations))) result = np.vstack((result, ta.APO(indivations))) result = np.vstack((result, ta.CMO(indivations))) result = np.vstack((result, ta.MACD(indivations))) result = np.vstack((result, ta.MOM(indivations))) result = np.vstack((result, ta.ROC(indivations))) result = np.vstack((result, ta.RSI(indivations))) result = np.vstack((result, ta.HT_TRENDMODE(indivations))) result = np.vstack((result, ta.LINEARREG(indivations))) result = result[:, ~np.isnan(result).any(axis=0)] result = result.T print(np.shape(result)) return result
def ht_trendmode(client, symbol, timeframe="6m", col="close"): """This will return a dataframe of Hilbert Transform - Trend vs Cycle Mode for the given symbol across the given timeframe Args: client (pyEX.Client); Client symbol (string); Ticker timeframe (string); timeframe to use, for pyEX.chart col (string); column to use to calculate Returns: DataFrame: result """ df = client.chartDF(symbol, timeframe) x = t.HT_TRENDMODE(df[col].values) return pd.DataFrame({col: df[col].values, "ht_trendmode": x})
def test_HT_TRENDMODE(self): class MyHT_TRENDMODE(OperatorHT_TRENDMODE): def __init__(self, name, **kwargs): super(MyHT_TRENDMODE, self).__init__(100, name, **kwargs) self.env.add_operator('ht_trendmode', { 'operator': MyHT_TRENDMODE, }) string = 'ht_trendmode(open)' gene = self.env.parse_string(string) self.assertRaises(IndexError, gene.eval, self.env, self.dates[98], self.dates[-1]) ser = gene.eval(self.env, self.dates[99], self.dates[99]).iloc[0] data = self.env.get_data_value('open') res = [] for i, val in ser.iteritems(): res.append(talib.HT_TRENDMODE(data[i].values[:100])[-1] == val) self.assertTrue(all(res))
def get_cycle_indicators(df_price): df_local = df_price.copy() df_nonna_idxs = df_local[~df_local.Close.isna()].Close.index np_adj_close = df_local.Adj_Close.values np_close = df_local.Close.values np_open = df_local.Open.values np_high = df_local.High.values np_low = df_local.Low.values np_volume = df_local.Volume.values np_nan_indices = np.isnan(np_close) #HT_DCPERIOD-Hilbert Transform - Dominant Cycle Period HT_DCPERIOD = pd.Series(ta.HT_DCPERIOD(np_adj_close[~np_nan_indices]), index=df_nonna_idxs) df_local['HT_DCPERIOD'] = HT_DCPERIOD #HT_DCPHASE-Hilbert Transform - Dominant Cycle Phase HT_DCPHASE = pd.Series(ta.HT_DCPHASE(np_adj_close[~np_nan_indices]), index=df_nonna_idxs) df_local['HT_DCPHASE'] = HT_DCPHASE #HT_PHASOR-Hilbert Transform - Phasor Components HT_PHASOR = ta.HT_PHASOR(np_adj_close[~np_nan_indices]) df_local['HT_PHASOR_INPHASE'] = pd.Series(HT_PHASOR[0], index=df_nonna_idxs) df_local['HT_PHASOR_QUADRATURE'] = pd.Series(HT_PHASOR[1], index=df_nonna_idxs) #HT_SINE - Hilbert Transform - SineWave HT_SINE = ta.HT_SINE(np_adj_close[~np_nan_indices]) df_local['HT_SINE_SINE'] = pd.Series(HT_SINE[0], index=df_nonna_idxs) df_local['HT_SINE_LEADSINE'] = pd.Series(HT_SINE[1], index=df_nonna_idxs) #HT_TRENDMODE-Hilbert Transform - Trend vs Cycle Mode HT_TRENDMODE = pd.Series(ta.HT_TRENDMODE(np_adj_close[~np_nan_indices]), index=df_nonna_idxs) df_local['HT_TRENDMODE'] = HT_TRENDMODE return df_local
def handle_cycle_indicators(args, axes, i, klines_df, close_times, display_count): # talib if args.HT_DCPERIOD: name = 'HT_DCPERIOD' real = talib.HT_DCPERIOD(klines_df["close"]) i += 1 axes[i].set_ylabel(name) axes[i].grid(True) axes[i].plot(close_times, real[-display_count:], "y:", label=name) if args.HT_DCPHASE: name = 'HT_DCPHASE' real = talib.HT_DCPHASE(klines_df["close"]) i += 1 axes[i].set_ylabel(name) axes[i].grid(True) axes[i].plot(close_times, real[-display_count:], "y:", label=name) if args.HT_PHASOR: name = 'HT_PHASOR' real = talib.HT_PHASOR(klines_df["close"]) i += 1 axes[i].set_ylabel(name) axes[i].grid(True) axes[i].plot(close_times, real[-display_count:], "y:", label=name) if args.HT_SINE: name = 'HT_SINE' real = talib.HT_SINE(klines_df["close"]) i += 1 axes[i].set_ylabel(name) axes[i].grid(True) axes[i].plot(close_times, real[-display_count:], "y:", label=name) if args.HT_TRENDMODE: name = 'HT_TRENDMODE' real = talib.HT_TRENDMODE(klines_df["close"]) i += 1 axes[i].set_ylabel(name) axes[i].grid(True) axes[i].plot(close_times, real[-display_count:], "y:", label=name)
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 ht_trendmode(candles: np.ndarray, source_type: str = "close", sequential: bool = False) -> Union[float, np.ndarray]: """ HT_TRENDMODE - Hilbert Transform - Trend vs Cycle Mode :param candles: np.ndarray :param source_type: str - default: "close" :param sequential: bool - default=False :return: int | np.ndarray """ warmup_candles_num = get_config('env.data.warmup_candles_num', 240) if not sequential and len(candles) > warmup_candles_num: candles = candles[-warmup_candles_num:] source = get_candle_source(candles, source_type=source_type) res = talib.HT_TRENDMODE(source) return res if sequential else res[-1]
def get_df(filename): tech = pd.read_csv(filename,index_col=0) dclose = np.array(tech.close) volume = np.array(tech.volume) tech['RSI'] = ta.RSI(np.array(tech.close)) tech['OBV'] = ta.OBV(np.array(tech.close),np.array(tech.volume)) tech['NATR'] = ta.NATR(np.array(tech.high),np.array(tech.low),np.array(tech.close)) tech['upper'],tech['middle'],tech['lower'] = ta.BBANDS(np.array(tech.close), timeperiod=10, nbdevup=2, nbdevdn=2, matype=0) tech['DEMA'] = ta.DEMA(dclose, timeperiod=30) tech['EMA'] = ta.EMA(dclose, timeperiod=30) tech['HT_TRENDLINE'] = ta.HT_TRENDLINE(dclose) tech['KAMA'] = ta.KAMA(dclose, timeperiod=30) tech['MA'] = ta.MA(dclose, timeperiod=30, matype=0) # tech['mama'], tech['fama'] = ta.MAMA(dclose, fastlimit=0, slowlimit=0) tech['MIDPOINT'] = ta.MIDPOINT(dclose, timeperiod=14) tech['SMA'] = ta.SMA(dclose, timeperiod=30) tech['T3'] = ta.T3(dclose, timeperiod=5, vfactor=0) tech['TEMA'] = ta.TEMA(dclose, timeperiod=30) tech['TRIMA'] = ta.TRIMA(dclose, timeperiod=30) tech['WMA'] = ta.WMA(dclose, timeperiod=30) tech['APO'] = ta.APO(dclose, fastperiod=12, slowperiod=26, matype=0) tech['CMO'] = ta.CMO(dclose, timeperiod=14) tech['macd'], tech['macdsignal'], tech['macdhist'] = ta.MACD(dclose, fastperiod=12, slowperiod=26, signalperiod=9) tech['MOM'] = ta.MOM(dclose, timeperiod=10) tech['PPO'] = ta.PPO(dclose, fastperiod=12, slowperiod=26, matype=0) tech['ROC'] = ta.ROC(dclose, timeperiod=10) tech['ROCR'] = ta.ROCR(dclose, timeperiod=10) tech['ROCP'] = ta.ROCP(dclose, timeperiod=10) tech['ROCR100'] = ta.ROCR100(dclose, timeperiod=10) tech['RSI'] = ta.RSI(dclose, timeperiod=14) tech['fastk'], tech['fastd'] = ta.STOCHRSI(dclose, timeperiod=14, fastk_period=5, fastd_period=3, fastd_matype=0) tech['TRIX'] = ta.TRIX(dclose, timeperiod=30) tech['OBV'] = ta.OBV(dclose,volume) tech['HT_DCPHASE'] = ta.HT_DCPHASE(dclose) tech['inphase'], tech['quadrature'] = ta.HT_PHASOR(dclose) tech['sine'], tech['leadsine'] = ta.HT_SINE(dclose) tech['HT_TRENDMODE'] = ta.HT_TRENDMODE(dclose) df = tech.fillna(method='bfill') return df
def cycle_process(event): print(event.widget.get()) cycle = event.widget.get() upperband, middleband, lowerband = ta.BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0) fig, axes = plt.subplots(2, 1, sharex=True) ax1, ax2 = axes[0], axes[1] axes[0].plot(close, 'rd-', markersize=3) axes[0].plot(upperband, 'y-') axes[0].plot(middleband, 'b-') axes[0].plot(lowerband, 'y-') axes[0].set_title(cycle, fontproperties='SimHei') if momentum == '希尔伯特变换——主要的循环周期': real = ta.HT_DCPERIOD(close) axes[1].plot(real, 'r-') elif momentum == '希尔伯特变换,占主导地位的周期阶段': real = ta.HT_DCPHASE(close) axes[1].plot(real, 'r-') elif momentum == '希尔伯特变换——相量组件': inphase, quadrature = ta.HT_PHASOR(close) axes[1].plot(inphase, 'r-') axes[1].plot(quadrature, 'g-') elif momentum == '希尔伯特变换——正弦曲线': sine, leadsine = ta.HT_SINE(close) axes[1].plot(sine, 'r-') axes[1].plot(leadsine, 'g-') elif momentum == '希尔伯特变换——趋势和周期模式': integer = ta.HT_TRENDMODE(close) axes[1].plot(integer, 'r-') plt.show()
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 HT_TRENDMODE(Series): res = talib.HT_TRENDMODE(Series.values) return pd.Series(res, index=Series.index)
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 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
def TALIB_HT_TRENDMODE(close): '''00346,1,1''' return talib.HT_TRENDMODE(close)
def add_ta_features(df, ta_settings): """Add technial analysis features from typical financial dataset that typically include columns such as "open", "high", "low", "price" and "volume". http://mrjbq7.github.io/ta-lib/ Args: df(pandas.DataFrame): original DataFrame. ta_settings(dict): configuration. Returns: pandas.DataFrame: DataFrame with new features included. """ open = df['open'] high = df['high'] low = df['low'] close = df['price'] volume = df['volume'] if ta_settings['overlap']: df['ta_overlap_bbands_upper'], df['ta_overlap_bbands_middle'], df[ 'ta_overlap_bbands_lower'] = ta.BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0) df['ta_overlap_dema'] = ta.DEMA( close, timeperiod=15) # NOTE: Changed to avoid a lot of Nan values df['ta_overlap_ema'] = ta.EMA(close, timeperiod=30) df['ta_overlap_kama'] = ta.KAMA(close, timeperiod=30) df['ta_overlap_ma'] = ta.MA(close, timeperiod=30, matype=0) df['ta_overlap_mama_mama'], df['ta_overlap_mama_fama'] = ta.MAMA(close) period = np.random.randint(10, 20, size=len(close)).astype(float) df['ta_overlap_mavp'] = ta.MAVP(close, period, minperiod=2, maxperiod=30, matype=0) df['ta_overlap_midpoint'] = ta.MIDPOINT(close, timeperiod=14) df['ta_overlap_midprice'] = ta.MIDPRICE(high, low, timeperiod=14) df['ta_overlap_sar'] = ta.SAR(high, low, acceleration=0, maximum=0) df['ta_overlap_sarext'] = ta.SAREXT(high, low, startvalue=0, offsetonreverse=0, accelerationinitlong=0, accelerationlong=0, accelerationmaxlong=0, accelerationinitshort=0, accelerationshort=0, accelerationmaxshort=0) df['ta_overlap_sma'] = ta.SMA(close, timeperiod=30) df['ta_overlap_t3'] = ta.T3(close, timeperiod=5, vfactor=0) df['ta_overlap_tema'] = ta.TEMA( close, timeperiod=12) # NOTE: Changed to avoid a lot of Nan values df['ta_overlap_trima'] = ta.TRIMA(close, timeperiod=30) df['ta_overlap_wma'] = ta.WMA(close, timeperiod=30) # NOTE: Commented to avoid a lot of Nan values # df['ta_overlap_ht_trendline'] = ta.HT_TRENDLINE(close) if ta_settings['momentum']: df['ta_momentum_adx'] = ta.ADX(high, low, close, timeperiod=14) df['ta_momentum_adxr'] = ta.ADXR(high, low, close, timeperiod=14) df['ta_momentum_apo'] = ta.APO(close, fastperiod=12, slowperiod=26, matype=0) df['ta_momentum_aroondown'], df['ta_momentum_aroonup'] = ta.AROON( high, low, timeperiod=14) df['ta_momentum_aroonosc'] = ta.AROONOSC(high, low, timeperiod=14) df['ta_momentum_bop'] = ta.BOP(open, high, low, close) df['ta_momentum_cci'] = ta.CCI(high, low, close, timeperiod=14) df['ta_momentum_cmo'] = ta.CMO(close, timeperiod=14) df['ta_momentum_dx'] = ta.DX(high, low, close, timeperiod=14) df['ta_momentum_macd_macd'], df['ta_momentum_macd_signal'], df[ 'ta_momentum_macd_hist'] = ta.MACD(close, fastperiod=12, slowperiod=26, signalperiod=9) df['ta_momentum_macdext_macd'], df['ta_momentum_macdext_signal'], df[ 'ta_momentum_macdext_hist'] = ta.MACDEXT(close, fastperiod=12, fastmatype=0, slowperiod=26, slowmatype=0, signalperiod=9, signalmatype=0) df['ta_momentum_macdfix_macd'], df['ta_momentum_macdfix_signal'], df[ 'ta_momentum_macdfix_hist'] = ta.MACDFIX(close, signalperiod=9) df['ta_momentum_mfi'] = ta.MFI(high, low, close, volume, timeperiod=14) df['ta_momentum_minus_di'] = ta.MINUS_DI(high, low, close, timeperiod=14) df['ta_momentum_minus_dm'] = ta.MINUS_DM(high, low, timeperiod=14) df['ta_momentum_mom'] = ta.MOM(close, timeperiod=10) df['ta_momentum_plus_di'] = ta.PLUS_DI(high, low, close, timeperiod=14) df['ta_momentum_plus_dm'] = ta.PLUS_DM(high, low, timeperiod=14) df['ta_momentum_ppo'] = ta.PPO(close, fastperiod=12, slowperiod=26, matype=0) df['ta_momentum_roc'] = ta.ROC(close, timeperiod=10) df['ta_momentum_rocp'] = ta.ROCP(close, timeperiod=10) df['ta_momentum_rocr'] = ta.ROCR(close, timeperiod=10) df['ta_momentum_rocr100'] = ta.ROCR100(close, timeperiod=10) df['ta_momentum_rsi'] = ta.RSI(close, timeperiod=14) df['ta_momentum_slowk'], df['ta_momentum_slowd'] = ta.STOCH( high, low, close, fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0) df['ta_momentum_fastk'], df['ta_momentum_fastd'] = ta.STOCHF( high, low, close, fastk_period=5, fastd_period=3, fastd_matype=0) df['ta_momentum_fastk'], df['ta_momentum_fastd'] = ta.STOCHRSI( close, timeperiod=14, fastk_period=5, fastd_period=3, fastd_matype=0) df['ta_momentum_trix'] = ta.TRIX( close, timeperiod=12) # NOTE: Changed to avoid a lot of Nan values df['ta_momentum_ultosc'] = ta.ULTOSC(high, low, close, timeperiod1=7, timeperiod2=14, timeperiod3=28) df['ta_momentum_willr'] = ta.WILLR(high, low, close, timeperiod=14) if ta_settings['volume']: df['ta_volume_ad'] = ta.AD(high, low, close, volume) df['ta_volume_adosc'] = ta.ADOSC(high, low, close, volume, fastperiod=3, slowperiod=10) df['ta_volume_obv'] = ta.OBV(close, volume) if ta_settings['volatility']: df['ta_volatility_atr'] = ta.ATR(high, low, close, timeperiod=14) df['ta_volatility_natr'] = ta.NATR(high, low, close, timeperiod=14) df['ta_volatility_trange'] = ta.TRANGE(high, low, close) if ta_settings['price']: df['ta_price_avgprice'] = ta.AVGPRICE(open, high, low, close) df['ta_price_medprice'] = ta.MEDPRICE(high, low) df['ta_price_typprice'] = ta.TYPPRICE(high, low, close) df['ta_price_wclprice'] = ta.WCLPRICE(high, low, close) if ta_settings['cycle']: df['ta_cycle_ht_dcperiod'] = ta.HT_DCPERIOD(close) df['ta_cycle_ht_phasor_inphase'], df[ 'ta_cycle_ht_phasor_quadrature'] = ta.HT_PHASOR(close) df['ta_cycle_ht_trendmode'] = ta.HT_TRENDMODE(close) # NOTE: Commented to avoid a lot of Nan values # df['ta_cycle_ht_dcphase'] = ta.HT_DCPHASE(close) # df['ta_cycle_ht_sine_sine'], df['ta_cycle_ht_sine_leadsine'] = ta.HT_SINE(close) if ta_settings['pattern']: df['ta_pattern_cdl2crows'] = ta.CDL2CROWS(open, high, low, close) df['ta_pattern_cdl3blackrows'] = ta.CDL3BLACKCROWS( open, high, low, close) df['ta_pattern_cdl3inside'] = ta.CDL3INSIDE(open, high, low, close) df['ta_pattern_cdl3linestrike'] = ta.CDL3LINESTRIKE( open, high, low, close) df['ta_pattern_cdl3outside'] = ta.CDL3OUTSIDE(open, high, low, close) df['ta_pattern_cdl3starsinsouth'] = ta.CDL3STARSINSOUTH( open, high, low, close) df['ta_pattern_cdl3whitesoldiers'] = ta.CDL3WHITESOLDIERS( open, high, low, close) df['ta_pattern_cdlabandonedbaby'] = ta.CDLABANDONEDBABY(open, high, low, close, penetration=0) df['ta_pattern_cdladvanceblock'] = ta.CDLADVANCEBLOCK( open, high, low, close) df['ta_pattern_cdlbelthold'] = ta.CDLBELTHOLD(open, high, low, close) df['ta_pattern_cdlbreakaway'] = ta.CDLBREAKAWAY(open, high, low, close) df['ta_pattern_cdlclosingmarubozu'] = ta.CDLCLOSINGMARUBOZU( open, high, low, close) df['ta_pattern_cdlconcealbabyswall'] = ta.CDLCONCEALBABYSWALL( open, high, low, close) df['ta_pattern_cdlcounterattack'] = ta.CDLCOUNTERATTACK( open, high, low, close) df['ta_pattern_cdldarkcloudcover'] = ta.CDLDARKCLOUDCOVER( open, high, low, close, penetration=0) df['ta_pattern_cdldoji'] = ta.CDLDOJI(open, high, low, close) df['ta_pattern_cdldojistar'] = ta.CDLDOJISTAR(open, high, low, close) df['ta_pattern_cdldragonflydoji'] = ta.CDLDRAGONFLYDOJI( open, high, low, close) df['ta_pattern_cdlengulfing'] = ta.CDLENGULFING(open, high, low, close) df['ta_pattern_cdleveningdojistar'] = ta.CDLEVENINGDOJISTAR( open, high, low, close, penetration=0) df['ta_pattern_cdleveningstar'] = ta.CDLEVENINGSTAR(open, high, low, close, penetration=0) df['ta_pattern_cdlgapsidesidewhite'] = ta.CDLGAPSIDESIDEWHITE( open, high, low, close) df['ta_pattern_cdlgravestonedoji'] = ta.CDLGRAVESTONEDOJI( open, high, low, close) df['ta_pattern_cdlhammer'] = ta.CDLHAMMER(open, high, low, close) df['ta_pattern_cdlhangingman'] = ta.CDLHANGINGMAN( open, high, low, close) df['ta_pattern_cdlharami'] = ta.CDLHARAMI(open, high, low, close) df['ta_pattern_cdlharamicross'] = ta.CDLHARAMICROSS( open, high, low, close) df['ta_pattern_cdlhighwave'] = ta.CDLHIGHWAVE(open, high, low, close) df['ta_pattern_cdlhikkake'] = ta.CDLHIKKAKE(open, high, low, close) df['ta_pattern_cdlhikkakemod'] = ta.CDLHIKKAKEMOD( open, high, low, close) df['ta_pattern_cdlhomingpigeon'] = ta.CDLHOMINGPIGEON( open, high, low, close) df['ta_pattern_cdlidentical3crows'] = ta.CDLIDENTICAL3CROWS( open, high, low, close) df['ta_pattern_cdlinneck'] = ta.CDLINNECK(open, high, low, close) df['ta_pattern_cdlinvertedhammer'] = ta.CDLINVERTEDHAMMER( open, high, low, close) df['ta_pattern_cdlkicking'] = ta.CDLKICKING(open, high, low, close) df['ta_pattern_cdlkickingbylength'] = ta.CDLKICKINGBYLENGTH( open, high, low, close) df['ta_pattern_cdlladderbottom'] = ta.CDLLADDERBOTTOM( open, high, low, close) df['ta_pattern_cdllongleggeddoji'] = ta.CDLLONGLEGGEDDOJI( open, high, low, close) df['ta_pattern_cdllongline'] = ta.CDLLONGLINE(open, high, low, close) df['ta_pattern_cdlmarubozu'] = ta.CDLMARUBOZU(open, high, low, close) df['ta_pattern_cdlmatchinglow'] = ta.CDLMATCHINGLOW( open, high, low, close) df['ta_pattern_cdlmathold'] = ta.CDLMATHOLD(open, high, low, close, penetration=0) df['ta_pattern_cdlmorningdojistar'] = ta.CDLMORNINGDOJISTAR( open, high, low, close, penetration=0) df['ta_pattern_cdlmorningstar'] = ta.CDLMORNINGSTAR(open, high, low, close, penetration=0) df['ta_pattern_cdllonneck'] = ta.CDLONNECK(open, high, low, close) df['ta_pattern_cdlpiercing'] = ta.CDLPIERCING(open, high, low, close) df['ta_pattern_cdlrickshawman'] = ta.CDLRICKSHAWMAN( open, high, low, close) df['ta_pattern_cdlrisefall3methods'] = ta.CDLRISEFALL3METHODS( open, high, low, close) df['ta_pattern_cdlseparatinglines'] = ta.CDLSEPARATINGLINES( open, high, low, close) df['ta_pattern_cdlshootingstar'] = ta.CDLSHOOTINGSTAR( open, high, low, close) df['ta_pattern_cdlshortline'] = ta.CDLSHORTLINE(open, high, low, close) df['ta_pattern_cdlspinningtop'] = ta.CDLSPINNINGTOP( open, high, low, close) df['ta_pattern_cdlstalledpattern'] = ta.CDLSTALLEDPATTERN( open, high, low, close) df['ta_pattern_cdlsticksandwich'] = ta.CDLSTICKSANDWICH( open, high, low, close) df['ta_pattern_cdltakuri'] = ta.CDLTAKURI(open, high, low, close) df['ta_pattern_cdltasukigap'] = ta.CDLTASUKIGAP(open, high, low, close) df['ta_pattern_cdlthrusting'] = ta.CDLTHRUSTING(open, high, low, close) df['ta_pattern_cdltristar'] = ta.CDLTRISTAR(open, high, low, close) df['ta_pattern_cdlunique3river'] = ta.CDLUNIQUE3RIVER( open, high, low, close) df['ta_pattern_cdlupsidegap2crows'] = ta.CDLUPSIDEGAP2CROWS( open, high, low, close) df['ta_pattern_cdlxsidegap3methods'] = ta.CDLXSIDEGAP3METHODS( open, high, low, close) if ta_settings['statistic']: df['ta_statistic_beta'] = ta.BETA(high, low, timeperiod=5) df['ta_statistic_correl'] = ta.CORREL(high, low, timeperiod=30) df['ta_statistic_linearreg'] = ta.LINEARREG(close, timeperiod=14) df['ta_statistic_linearreg_angle'] = ta.LINEARREG_ANGLE(close, timeperiod=14) df['ta_statistic_linearreg_intercept'] = ta.LINEARREG_INTERCEPT( close, timeperiod=14) df['ta_statistic_linearreg_slope'] = ta.LINEARREG_SLOPE(close, timeperiod=14) df['ta_statistic_stddev'] = ta.STDDEV(close, timeperiod=5, nbdev=1) df['ta_statistic_tsf'] = ta.TSF(close, timeperiod=14) df['ta_statistic_var'] = ta.VAR(close, timeperiod=5, nbdev=1) if ta_settings['math_transforms']: df['ta_math_transforms_atan'] = ta.ATAN(close) df['ta_math_transforms_ceil'] = ta.CEIL(close) df['ta_math_transforms_cos'] = ta.COS(close) df['ta_math_transforms_floor'] = ta.FLOOR(close) df['ta_math_transforms_ln'] = ta.LN(close) df['ta_math_transforms_log10'] = ta.LOG10(close) df['ta_math_transforms_sin'] = ta.SIN(close) df['ta_math_transforms_sqrt'] = ta.SQRT(close) df['ta_math_transforms_tan'] = ta.TAN(close) if ta_settings['math_operators']: df['ta_math_operators_add'] = ta.ADD(high, low) df['ta_math_operators_div'] = ta.DIV(high, low) df['ta_math_operators_min'], df['ta_math_operators_max'] = ta.MINMAX( close, timeperiod=30) df['ta_math_operators_minidx'], df[ 'ta_math_operators_maxidx'] = ta.MINMAXINDEX(close, timeperiod=30) df['ta_math_operators_mult'] = ta.MULT(high, low) df['ta_math_operators_sub'] = ta.SUB(high, low) df['ta_math_operators_sum'] = ta.SUM(close, timeperiod=30) return df
def get_talib_stock_daily( stock_code, s, e, append_ori_close=False, norms=['volume', 'amount', 'ht_dcphase', 'obv', 'adosc', 'ad', 'cci']): """获取经过talib处理后的股票日线数据""" stock_data = QA.QA_fetch_stock_day_adv(stock_code, s, e) stock_df = stock_data.to_qfq().data if append_ori_close: stock_df['o_close'] = stock_data.data['close'] # stock_df['high_qfq'] = stock_data.to_qfq().data['high'] # stock_df['low_hfq'] = stock_data.to_hfq().data['low'] close = np.array(stock_df['close']) high = np.array(stock_df['high']) low = np.array(stock_df['low']) _open = np.array(stock_df['open']) _volume = np.array(stock_df['volume']) stock_df['dema'] = talib.DEMA(close) stock_df['ema'] = talib.EMA(close) stock_df['ht_tradeline'] = talib.HT_TRENDLINE(close) stock_df['kama'] = talib.KAMA(close) stock_df['ma'] = talib.MA(close) stock_df['mama'], stock_df['fama'] = talib.MAMA(close) # MAVP stock_df['midpoint'] = talib.MIDPOINT(close) stock_df['midprice'] = talib.MIDPRICE(high, low) stock_df['sar'] = talib.SAR(high, low) stock_df['sarext'] = talib.SAREXT(high, low) stock_df['sma'] = talib.SMA(close) stock_df['t3'] = talib.T3(close) stock_df['tema'] = talib.TEMA(close) stock_df['trima'] = talib.TRIMA(close) stock_df['wma'] = talib.WMA(close) stock_df['adx'] = talib.ADX(high, low, close) stock_df['adxr'] = talib.ADXR(high, low, close) stock_df['apo'] = talib.APO(close) stock_df['aroondown'], stock_df['aroonup'] = talib.AROON(high, low) stock_df['aroonosc'] = talib.AROONOSC(high, low) stock_df['bop'] = talib.BOP(_open, high, low, close) stock_df['cci'] = talib.CCI(high, low, close) stock_df['cmo'] = talib.CMO(close) stock_df['dx'] = talib.DX(high, low, close) # MACD stock_df['macd'], stock_df['macdsignal'], stock_df[ 'macdhist'] = talib.MACDEXT(close) # MACDFIX stock_df['mfi'] = talib.MFI(high, low, close, _volume) stock_df['minus_di'] = talib.MINUS_DI(high, low, close) stock_df['minus_dm'] = talib.MINUS_DM(high, low) stock_df['mom'] = talib.MOM(close) stock_df['plus_di'] = talib.PLUS_DI(high, low, close) stock_df['plus_dm'] = talib.PLUS_DM(high, low) stock_df['ppo'] = talib.PPO(close) stock_df['roc'] = talib.ROC(close) stock_df['rocp'] = talib.ROCP(close) stock_df['rocr'] = talib.ROCR(close) stock_df['rocr100'] = talib.ROCR100(close) stock_df['rsi'] = talib.RSI(close) stock_df['slowk'], stock_df['slowd'] = talib.STOCH(high, low, close) stock_df['fastk'], stock_df['fastd'] = talib.STOCHF(high, low, close) # STOCHRSI - Stochastic Relative Strength Index stock_df['trix'] = talib.TRIX(close) stock_df['ultosc'] = talib.ULTOSC(high, low, close) stock_df['willr'] = talib.WILLR(high, low, close) stock_df['ad'] = talib.AD(high, low, close, _volume) stock_df['adosc'] = talib.ADOSC(high, low, close, _volume) stock_df['obv'] = talib.OBV(close, _volume) stock_df['ht_dcperiod'] = talib.HT_DCPERIOD(close) stock_df['ht_dcphase'] = talib.HT_DCPHASE(close) stock_df['inphase'], stock_df['quadrature'] = talib.HT_PHASOR(close) stock_df['sine'], stock_df['leadsine'] = talib.HT_PHASOR(close) stock_df['ht_trendmode'] = talib.HT_TRENDMODE(close) stock_df['avgprice'] = talib.AVGPRICE(_open, high, low, close) stock_df['medprice'] = talib.MEDPRICE(high, low) stock_df['typprice'] = talib.TYPPRICE(high, low, close) stock_df['wclprice'] = talib.WCLPRICE(high, low, close) stock_df['atr'] = talib.ATR(high, low, close) stock_df['natr'] = talib.NATR(high, low, close) stock_df['trange'] = talib.TRANGE(high, low, close) stock_df['beta'] = talib.BETA(high, low) stock_df['correl'] = talib.CORREL(high, low) stock_df['linearreg'] = talib.LINEARREG(close) stock_df['linearreg_angle'] = talib.LINEARREG_ANGLE(close) stock_df['linearreg_intercept'] = talib.LINEARREG_INTERCEPT(close) stock_df['linearreg_slope'] = talib.LINEARREG_SLOPE(close) stock_df['stddev'] = talib.STDDEV(close) stock_df['tsf'] = talib.TSF(close) stock_df['var'] = talib.VAR(close) stock_df = stock_df.reset_index().set_index('date') if norms: x = stock_df[norms].values # returns a numpy array x_scaled = MinMaxScaler().fit_transform(x) stock_df = stock_df.drop(columns=norms).join( pd.DataFrame(x_scaled, columns=norms, index=stock_df.index)) # stock_df = stock_df.drop(columns=['code', 'open', 'high', 'low']) stock_df = stock_df.dropna() stock_df = stock_df.drop(columns=['code']) return stock_df
np.array(df['Adj Close'])) df['Upside_Gap_Two_Crows'] = ta.CDLUPSIDEGAP2CROWS(np.array(df['Open']), np.array(df['High']), np.array(df['Low']), np.array(df['Adj Close'])) df['Upside_Downside_Gap_Three_Methods'] = ta.CDLXSIDEGAP3METHODS( np.array(df['Open']), np.array(df['High']), np.array(df['Low']), np.array(df['Adj Close'])) # Cycle Indicator Functions df['HT_DCPERIOD'] = ta.HT_DCPERIOD(np.array(df['Adj Close'].shift(1))) df['HT_DCPHASE'] = ta.HT_DCPHASE(np.array(df['Adj Close'].shift(1))) df['inphase'], df['quadrature'] = ta.HT_PHASOR( np.array(df['Adj Close'].shift(1))) df['sine'], df['leadsine'] = ta.HT_SINE(np.array(df['Adj Close'].shift(1))) df['HT_TRENDMODE'] = ta.HT_TRENDMODE(np.array(df['Adj Close'].shift(1))) df['ATR1'] = abs(np.array(df['High'].shift(1)) - np.array(df['Low'].shift(1))) df['ATR2'] = abs( np.array(df['High'].shift(1)) - np.array(df['Adj Close'].shift(1))) df['ATR3'] = abs( np.array(df['Low'].shift(1)) - np.array(df['Adj Close'].shift(1))) df['AverageTrueRange'] = df[['ATR1', 'ATR2', 'ATR3']].max(axis=1) # df['EMA']=pd.Series(pd.ewma(df['Adj Close'], span = n, min_periods = n - 1)) # Statistic Functions df['Beta'] = ta.BETA(np.array(df['High'].shift(1)), np.array(df['Low'].shift(1)), timeperiod=n) df['CORREL'] = ta.CORREL(np.array(df['High'].shift(1)),
lbls_train = lbls.iloc[0:round(len(lbls) * 0.8), :] lbls_test = lbls.iloc[round(len(lbls) * 0.8):, :] cols = list(stock)[0:13] #Preprocess data stock = stock[cols].astype(str) for i in cols: for j in range(0, len(stock)): stock[i][j] = stock[i][j].replace(",", "") stock = stock.astype(float) periods = np.double(np.array(list(range(0, len(stock['Close']))))) HT = talib.HT_TRENDMODE(stock['Close']) rsi = talib.RSI(stock['Close'], timeperiod=5) wma = talib.WMA(stock['Close'], timeperiod=20) mavp = talib.MAVP(stock['Close'], periods, minperiod=2, maxperiod=30, matype=0) upperband, middleband, lowerband = talib.BBANDS(stock['Close'], timeperiod=10, nbdevup=2, nbdevdn=2, matype=0) Roc = talib.ROC(stock['Close'], timeperiod=5) Atr = talib.ATR(stock['High'], stock['Low'], stock['Close'], timeperiod=10) div = stock.Close - wma voldiff = stock.Volume.diff() VolROC = (stock.Volume - stock.Volume.shift(1)) / stock.Volume opendiff = stock.Open - stock.Open.shift(1)
def third_making_indicator_5min(dataframe): Open_lis = np.array(dataframe['open'], dtype='float') High_lis = np.array(dataframe['high'], dtype='float') Low_lis = np.array(dataframe['low'], dtype='float') Clz_lis = np.array(dataframe['weigted_price'], dtype='float') Vol_lis = np.array(dataframe['volume'], dtype='float') ##지표## SMA_3_C = ta.SMA(Clz_lis, timeperiod=3) SMA_5_H = ta.SMA(High_lis, timeperiod=5) SMA_5_L = ta.SMA(Low_lis, timeperiod=5) SMA_5_C = ta.SMA(Clz_lis, timeperiod=5) SMA_10_H = ta.SMA(High_lis, timeperiod=10) SMA_10_L = ta.SMA(Low_lis, timeperiod=10) SMA_10_C = ta.SMA(Clz_lis, timeperiod=10) RSI_2_C = ta.RSI(Clz_lis, timeperiod=2) RSI_3_C = ta.RSI(Clz_lis, timeperiod=3) RSI_5_C = ta.RSI(Clz_lis, timeperiod=5) RSI_7_H = ta.RSI(High_lis, timeperiod=7) RSI_7_L = ta.RSI(Low_lis, timeperiod=7) RSI_7_C = ta.RSI(Clz_lis, timeperiod=7) RSI_14_H = ta.RSI(High_lis, timeperiod=14) RSI_14_L = ta.RSI(Low_lis, timeperiod=14) RSI_14_C = ta.RSI(Clz_lis, timeperiod=14) ADX = ta.ADX(High_lis, Low_lis, Clz_lis, timeperiod=14) ADXR = ta.ADXR(High_lis, Low_lis, Clz_lis, timeperiod=14) Aroondown, Aroonup = ta.AROON(High_lis, Low_lis, timeperiod=14) Aroonosc = ta.AROONOSC(High_lis, Low_lis, timeperiod=14) BOP = ta.BOP(Open_lis, High_lis, Low_lis, Clz_lis) CMO = ta.CMO(Clz_lis, timeperiod=14) DX = ta.DX(High_lis, Low_lis, Clz_lis, timeperiod=14) MFI = ta.MFI(High_lis, Low_lis, Clz_lis, Vol_lis, timeperiod=14) MINUS_DI = ta.MINUS_DI(High_lis, Low_lis, Clz_lis, timeperiod=14) PLUSDI = ta.PLUS_DI(High_lis, Low_lis, Clz_lis, timeperiod=14) PPO = ta.PPO(Clz_lis, fastperiod=12, slowperiod=26, matype=0) ROC = ta.ROC(Clz_lis, timeperiod=10) ROCP = ta.ROCP(Clz_lis, timeperiod=10) ROCR = ta.ROCR(Clz_lis, timeperiod=10) ROCR100 = ta.ROCR100(Clz_lis, timeperiod=10) Slowk, Slowd = ta.STOCH(High_lis, Low_lis, Clz_lis, fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0) STOCHF_f, STOCHF_d = ta.STOCHF(High_lis, Low_lis, Clz_lis, fastk_period=5, fastd_period=3, fastd_matype=0) Fastk, Fastd = ta.STOCHRSI(Clz_lis, timeperiod=14, fastk_period=5, fastd_period=3, fastd_matype=0) TRIX = ta.TRIX(Clz_lis, timeperiod=30) ULTOSC = ta.ULTOSC(High_lis, Low_lis, Clz_lis, timeperiod1=7, timeperiod2=14, timeperiod3=28) WILLR = ta.WILLR(High_lis, Low_lis, Clz_lis, timeperiod=14) ADOSC = ta.ADOSC(High_lis, Low_lis, Clz_lis, Vol_lis, fastperiod=3, slowperiod=10) NATR = ta.NATR(High_lis, Low_lis, Clz_lis, timeperiod=14) HT_DCPERIOD = ta.HT_DCPERIOD(Clz_lis) sine, leadsine = ta.HT_SINE(Clz_lis) integer = ta.HT_TRENDMODE(Clz_lis) ######## #append dataframe['SMA_3_C'] = SMA_3_C dataframe['SMA_5_H'] = SMA_5_H dataframe['SMA_5_L'] = SMA_5_L dataframe['SMA_5_C'] = SMA_5_C dataframe['SMA_10_H'] = SMA_10_H dataframe['SMA_10_L'] = SMA_10_L dataframe['SMA_10_C'] = SMA_10_C dataframe['RSI_2_C'] = (RSI_2_C / 100.) * 2 - 1. dataframe['RSI_3_C'] = (RSI_3_C / 100.) * 2 - 1. dataframe['RSI_5_C'] = (RSI_5_C / 100.) * 2 - 1. dataframe['RSI_7_H'] = (RSI_7_H / 100.) * 2 - 1. dataframe['RSI_7_L'] = (RSI_7_L / 100.) * 2 - 1. dataframe['RSI_7_C'] = (RSI_7_C / 100.) * 2 - 1. dataframe['RSI_14_H'] = (RSI_14_H / 100.) * 2 - 1. dataframe['RSI_14_L'] = (RSI_14_L / 100.) * 2 - 1. dataframe['RSI_14_C'] = (RSI_14_C / 100.) * 2 - 1. dataframe['ADX'] = (ADX / 100.) * 2 - 1. dataframe['ADXR'] = (ADXR / 100.) * 2 - 1. dataframe['Aroondown'] = (Aroondown / 100.) * 2 - 1 dataframe['Aroonup'] = (Aroonup / 100.) * 2 - 1 dataframe['Aroonosc'] = Aroonosc / 100. dataframe['BOP'] = BOP dataframe['CMO'] = CMO / 100. dataframe['DX'] = (DX / 100.) * 2 - 1 dataframe['MFI'] = (MFI / 100.) * 2 - 1 dataframe['MINUS_DI'] = (MINUS_DI / 100.) * 2 - 1 dataframe['PLUSDI'] = (PLUSDI / 100.) * 2 - 1 dataframe['PPO'] = PPO / 10. dataframe['ROC'] = ROC / 10. dataframe['ROCP'] = ROCP * 10 dataframe['ROCR'] = (ROCR - 1.0) * 100. dataframe['ROCR100'] = ((ROCR100 / 100.) - 1.0) * 100. dataframe['Slowk'] = (Slowk / 100.) * 2 - 1 dataframe['Slowd'] = (Slowd / 100.) * 2 - 1 dataframe['STOCHF_f'] = (STOCHF_f / 100.) * 2 - 1 dataframe['STOCHF_d'] = (STOCHF_d / 100.) * 2 - 1 dataframe['Fastk'] = (Fastk / 100.) * 2 - 1 dataframe['Fastd'] = (Fastd / 100.) * 2 - 1 dataframe['TRIX'] = TRIX * 10. dataframe['ULTOSC'] = (ULTOSC / 100.) * 2 - 1 dataframe['WILLR'] = (WILLR / 100.) * 2 + 1 dataframe['ADOSC'] = ADOSC / 100. dataframe['NATR'] = NATR * 2 - 1 dataframe['HT_DCPERIOD'] = (HT_DCPERIOD / 100.) * 2 - 1 dataframe['sine'] = sine dataframe['leadsine'] = leadsine dataframe['integer'] = integer return dataframe
def HT_TRENDMODE(data, **kwargs): _check_talib_presence() prices = _extract_series(data) return talib.HT_TRENDMODE(prices, **kwargs)
def create_tas(bars, verbose=False, ohlcv_cols=['Adj_High', 'Adj_Low', 'Adj_Open', 'Adj_Close', 'Adj_Volume'], return_df=False, cl=True, tp=True): """ This is basically set up for daily stock data. Other time frames would need adapting probably. :param bars: resampled pandas dataframe with open, high, low, close, volume, and typical_price columns :param verbose: boolean, if true, prints more debug :param ohlcv_cols: list of strings; the column names for high, low, open, close, and volume :param cl: use the close price to make TAs :param tp: calcuclate typical price and use it for TAs :returns: pandas dataframe with TA signals calculated (modifies dataframe in place) """ h, l, o, c, v = ohlcv_cols if 'typical_price' not in bars.columns and tp: bars['typical_price'] = bars[[h, l, c]].mean(axis=1) # bollinger bands # strange bug, if values are small, need to multiply to larger value for some reason mult = 1 last_close = bars.iloc[0][c] lc_m = last_close * mult while lc_m < 1: mult *= 10 lc_m = last_close * mult if verbose: print('using multiplier of', mult) if tp: mult_tp = bars['typical_price'].values * mult mult_close = bars[c].values * mult mult_open = bars[o].values * mult mult_high = bars[h].values * mult mult_low = bars[l].values * mult # for IB data, the volume is integer, but needs to be float for talib volume = bars[v].astype('float').values # ADR - average daily range # http://forextraininggroup.com/using-adr-average-daily-range-find-short-term-trading-opportunities/ # TODO ### overlap studies # bollinger bands -- should probably put these into another indicator if cl: upper_cl, middle_cl, lower_cl = talib.BBANDS(mult_close, timeperiod=10, nbdevup=2, nbdevdn=2) bars['bband_u_cl'] = upper_cl / mult bars['bband_m_cl'] = middle_cl / mult bars['bband_l_cl'] = lower_cl / mult bars['bband_u_cl_diff'] = bars['bband_u_cl'] - bars[c] bars['bband_m_cl_diff'] = bars['bband_m_cl'] - bars[c] bars['bband_l_cl_diff'] = bars['bband_l_cl'] - bars[c] bars['bband_u_cl_diff_hi'] = bars['bband_u_cl'] - bars[h] bars['bband_l_cl_diff_lo'] = bars['bband_l_cl'] - bars[l] # bars['bband_u_cl'].fillna(method='bfill', inplace=True) # bars['bband_m_cl'].fillna(method='bfill', inplace=True) # bars['bband_l_cl'].fillna(method='bfill', inplace=True) if tp: upper_tp, middle_tp, lower_tp = talib.BBANDS(mult_tp, timeperiod=10, nbdevup=2, nbdevdn=2) bars['bband_u_tp'] = upper_tp / mult bars['bband_m_tp'] = middle_tp / mult bars['bband_l_tp'] = lower_tp / mult bars['bband_u_tp_diff'] = bars['bband_u_tp'] - bars['typical_price'] bars['bband_m_tp_diff'] = bars['bband_m_tp'] - bars['typical_price'] bars['bband_l_tp_diff'] = bars['bband_l_tp'] - bars['typical_price'] bars['bband_u_tp_diff_hi'] = bars['bband_u_tp'] - bars[h] bars['bband_l_tp_diff_lo'] = bars['bband_l_tp'] - bars[l] # think this is already taken care of at the end...check # bars['bband_u_tp'].fillna(method='bfill', inplace=True) # bars['bband_m_tp'].fillna(method='bfill', inplace=True) # bars['bband_l_tp'].fillna(method='bfill', inplace=True) # Double Exponential Moving Average if cl: bars['dema_cl'] = talib.DEMA(mult_close, timeperiod=30) / mult bars['dema_cl_diff'] = bars['dema_cl'] - bars[c] if tp: bars['dema_tp'] = talib.DEMA(mult_tp, timeperiod=30) / mult bars['dema_tp_diff'] = bars['dema_tp'] - bars['typical_price'] # exponential moving Average if cl: bars['ema_cl'] = talib.EMA(mult_close, timeperiod=30) / mult bars['ema_cl_diff'] = bars['ema_cl'] - bars[c] if tp: bars['ema_tp'] = talib.EMA(mult_tp, timeperiod=30) / mult bars['ema_tp_diff'] = bars['ema_tp'] - bars['typical_price'] # Hilbert Transform - Instantaneous Trendline - like a mva but a bit different, should probably take slope or # use in another indicator if cl: bars['ht_tl_cl'] = talib.HT_TRENDLINE(mult_close) / mult bars['ht_tl_cl_diff'] = bars['ht_tl_cl'] - bars[c] if tp: bars['ht_tl_tp'] = talib.HT_TRENDLINE(mult_tp) / mult bars['ht_tl_tp_diff'] = bars['ht_tl_tp'] - bars['typical_price'] # KAMA - Kaufman's Adaptative Moving Average -- need to take slope or something if cl: bars['kama_cl'] = talib.KAMA(mult_close, timeperiod=30) / mult bars['kama_cl_diff'] = bars['kama_cl'] - bars[c] if tp: bars['kama_tp'] = talib.KAMA(mult_tp, timeperiod=30) / mult bars['kama_tp_diff'] = bars['kama_tp'] - bars['typical_price'] # MESA Adaptive Moving Average -- getting TA_BAD_PARAM error # mama_cl, fama_cl = talib.MAMA(mult_close, fastlimit=100, slowlimit=100) / mult # mama_tp, fama_tp = talib.MAMA(mult_tp, fastlimit=100, slowlimit=100) / mult # mama_cl_osc = (mama_cl - fama_cl) / mama_cl # mama_tp_osc = (mama_tp - fama_tp) / mama_tp # bars['mama_cl'] = mama_cl # bars['mama_tp'] = mama_tp # bars['fama_cl'] = fama_cl # bars['fama_tp'] = fama_tp # bars['mama_cl_osc'] = mama_cl_osc # bars['mama_tp_osc'] = mama_tp_osc # Moving average with variable period if cl: bars['mavp_cl'] = talib.MAVP(mult_close, np.arange(mult_close.shape[0]).astype(np.float64), minperiod=2, maxperiod=30, matype=0) / mult bars['mavp_cl_diff'] = bars['mavp_cl'] - bars[c] if tp: bars['mavp_tp'] = talib.MAVP(mult_tp, np.arange(mult_tp.shape[0]).astype(np.float64), minperiod=2, maxperiod=30, matype=0) / mult bars['mavp_tp_diff'] = bars['mavp_tp'] - bars['typical_price'] # midpoint over period if cl: bars['midp_cl'] = talib.MIDPOINT(mult_close, timeperiod=14) / mult bars['midp_cl_diff'] = bars['midp_cl'] - bars[c] if tp: bars['midp_tp'] = talib.MIDPOINT(mult_tp, timeperiod=14) / mult bars['midp_tp_diff'] = bars['midp_tp'] - bars['typical_price'] # midpoint price over period bars['midpr'] = talib.MIDPRICE(mult_high, mult_low, timeperiod=14) / mult if cl: bars['midpr_diff_cl'] = bars['midpr'] - bars[c] if tp: bars['midpr_diff_tp'] = bars['midpr'] - bars['typical_price'] # parabolic sar bars['sar'] = talib.SAR(mult_high, mult_low, acceleration=0.02, maximum=0.2) / mult if cl: bars['sar_diff_cl'] = bars['sar'] - bars[c] if tp: bars['sar_diff_tp'] = bars['sar'] - bars['typical_price'] # need to make an oscillator for this # simple moving average # 10, 20, 30, 40 day if cl: bars['sma_10_cl'] = talib.SMA(mult_close, timeperiod=10) / mult bars['sma_20_cl'] = talib.SMA(mult_close, timeperiod=20) / mult bars['sma_30_cl'] = talib.SMA(mult_close, timeperiod=30) / mult bars['sma_40_cl'] = talib.SMA(mult_close, timeperiod=40) / mult if tp: bars['sma_10_tp'] = talib.SMA(mult_tp, timeperiod=10) / mult bars['sma_20_tp'] = talib.SMA(mult_tp, timeperiod=20) / mult bars['sma_30_tp'] = talib.SMA(mult_tp, timeperiod=30) / mult bars['sma_40_tp'] = talib.SMA(mult_tp, timeperiod=40) / mult # triple exponential moving average if cl: bars['tema_cl'] = talib.TEMA(mult_close, timeperiod=30) / mult bars['tema_cl_diff'] = bars['tema_cl'] - bars[c] if tp: bars['tema_tp'] = talib.TEMA(mult_tp, timeperiod=30) / mult bars['tema_tp_diff'] = bars['tema_tp'] - bars['typical_price'] # triangular ma if cl: bars['trima_cl'] = talib.TRIMA(mult_close, timeperiod=30) / mult bars['trima_cl_diff'] = bars['trima_cl'] - bars[c] if tp: bars['trima_tp'] = talib.TRIMA(mult_tp, timeperiod=30) / mult bars['trima_tp_diff'] = bars['trima_tp'] - bars['typical_price'] # weighted moving average if cl: bars['wma_cl'] = talib.WMA(mult_close, timeperiod=30) / mult bars['wma_cl_diff'] = bars['wma_cl'] - bars[c] if tp: bars['wma_tp'] = talib.WMA(mult_tp, timeperiod=30) / mult bars['wma_tp_diff'] = bars['wma_tp'] - bars['typical_price'] #### momentum indicators -- for now left out some of those with unstable periods (maybe update and included them, not sure) # Average Directional Movement Index - 0 to 100 I think bars['adx_14'] = talib.ADX(mult_high, mult_low, mult_close, timeperiod=14) bars['adx_5'] = talib.ADX(mult_high, mult_low, mult_close, timeperiod=5) # Average Directional Movement Index Rating bars['adxr'] = talib.ADXR(mult_high, mult_low, mult_close, timeperiod=14) # Absolute Price Oscillator # values around -100 to +100 if cl: bars['apo_cl'] = talib.APO(mult_close, fastperiod=12, slowperiod=26, matype=0) if tp: bars['apo_tp'] = talib.APO(mult_tp, fastperiod=12, slowperiod=26, matype=0) # Aroon and Aroon Oscillator 0-100, so don't need to renormalize arup, ardn = talib.AROON(mult_high, mult_low, timeperiod=14) bars['arup'] = arup bars['ardn'] = ardn # linearly related to aroon, just aroon up - aroon down bars['aroonosc'] = talib.AROONOSC(mult_high, mult_low, timeperiod=14) # balance of power - ratio of values so don't need to re-normalize bars['bop'] = talib.BOP(mult_open, mult_high, mult_low, mult_close) # Commodity Channel Index # around -100 to + 100 bars['cci'] = talib.CCI(mult_high, mult_low, mult_close, timeperiod=14) # Chande Momentum Oscillator if cl: bars['cmo_cl'] = talib.CMO(mult_close, timeperiod=14) if tp: bars['cmo_tp'] = talib.CMO(mult_tp, timeperiod=14) # dx - Directional Movement Index bars['dx'] = talib.DX(mult_high, mult_low, mult_close, timeperiod=14) # Moving Average Convergence/Divergence # https://www.quantopian.com/posts/how-does-the-talib-compute-macd-why-the-value-is-different # macd diff btw fast and slow EMA if cl: macd_cl, macdsignal_cl, macdhist_cl = talib.MACD(mult_close, fastperiod=12, slowperiod=26, signalperiod=9) bars['macd_cl'] = macd_cl / mult bars['macdsignal_cl'] = macdsignal_cl / mult bars['macdhist_cl'] = macdhist_cl / mult if tp: macd_tp, macdsignal_tp, macdhist_tp = talib.MACD(mult_tp, fastperiod=12, slowperiod=26, signalperiod=9) bars['macd_tp'] = macd_tp / mult bars['macdsignal_tp'] = macdsignal_tp / mult bars['macdhist_tp'] = macdhist_tp / mult # mfi - Money Flow Index bars['mfi'] = talib.MFI(mult_high, mult_low, mult_close, volume, timeperiod=14) # minus di - Minus Directional Indicator bars['mdi'] = talib.MINUS_DI(mult_high, mult_low, mult_close, timeperiod=14) # Minus Directional Movement bars['mdm'] = talib.MINUS_DM(mult_high, mult_low, timeperiod=14) # note: too small of a timeperiod will result in junk data...I think. or at least very discretized if cl: bars['mom_cl'] = talib.MOM(mult_close, timeperiod=14) / mult # bars['mom_cl'].fillna(method='bfill', inplace=True) if tp: bars['mom_tp'] = talib.MOM(mult_tp, timeperiod=14) / mult # bars['mom_tp'].fillna(method='bfill', inplace=True) # plus di - Plus Directional Indicator bars['pldi'] = talib.PLUS_DI(mult_high, mult_low, mult_close, timeperiod=14) # Plus Directional Movement bars['pldm'] = talib.PLUS_DM(mult_high, mult_low, timeperiod=14) # percentage price Oscillator # matype explanation: https://www.quantopian.com/posts/moving-averages if cl: bars['ppo_cl'] = talib.PPO(mult_close, fastperiod=12, slowperiod=26, matype=1) if bars['ppo_cl'].isnull().all(): bars['ppo_cl_signal'] = 0 else: bars['ppo_cl_signal'] = talib.EMA(bars['ppo_cl'].bfill().values, timeperiod=9) if tp: bars['ppo_tp'] = talib.PPO(mult_tp, fastperiod=12, slowperiod=26, matype=1) # rate of change -- really only need one # if cl: # bars['roc_cl'] = talib.ROC(mult_close, timeperiod=10) # # if tp: # bars['roc_tp'] = talib.ROC(mult_tp, timeperiod=10) # rocp - Rate of change Percentage: (price-prevPrice)/prevPrice if cl: bars['rocp_cl'] = talib.ROCP(mult_close, timeperiod=10) if tp: bars['rocp_tp'] = talib.ROCP(mult_tp, timeperiod=10) # rocr - Rate of change ratio: (price/prevPrice) # bars['rocr_cl'] = talib.ROCR(mult_close, timeperiod=10) # bars['rocr_tp'] = talib.ROCR(mult_tp, timeperiod=10) # # # Rate of change ratio 100 scale: (price/prevPrice)*100 # bars['rocr_cl_100'] = talib.ROCR100(mult_close, timeperiod=10) # bars['rocr_tp_100'] = talib.ROCR100(mult_tp, timeperiod=10) # Relative Strength Index if cl: bars['rsi_cl_14'] = talib.RSI(mult_close, timeperiod=14) bars['rsi_cl_5'] = talib.RSI(mult_close, timeperiod=5) if tp: bars['rsi_tp'] = talib.RSI(mult_tp, timeperiod=14) # stochastic oscillator - % of price diffs, so no need to rescale slowk, slowd = talib.STOCH(mult_high, mult_low, mult_close, fastk_period=5, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0) fastk, fastd = talib.STOCHF(mult_high, mult_low, mult_close, fastk_period=5, fastd_period=3, fastd_matype=0) bars['slowk'] = slowk bars['slowd'] = slowd bars['fastk'] = fastk bars['fastd'] = fastd # Stochastic Relative Strength Index if cl: fastk_cl, fastd_cl = talib.STOCHRSI(mult_close, timeperiod=14, fastk_period=5, fastd_period=3, fastd_matype=0) bars['strsi_cl_k'] = fastk_cl bars['strsi_cl_d'] = fastd_cl if tp: fastk_tp, fastd_tp = talib.STOCHRSI(mult_tp, timeperiod=14, fastk_period=5, fastd_period=3, fastd_matype=0) bars['strsi_tp_k'] = fastk_tp bars['strsi_tp_d'] = fastd_tp # trix - 1-day Rate-Of-Change (ROC) of a Triple Smooth EMA if cl: if bars.shape[0] > 90: bars['trix_cl_30'] = talib.TRIX(mult_close, timeperiod=30) bars['trix_cl_30_signal'] = talib.EMA(bars['trix_cl_30'].bfill().values, timeperiod=20) bars['trix_cl_14'] = talib.TRIX(mult_close, timeperiod=14) if bars['trix_cl_14'].isnull().all(): bars['trix_cl_14_signal'] = 0 else: bars['trix_cl_14_signal'] = talib.EMA(bars['trix_cl_14'].bfill().values, timeperiod=9) bars['trix_cl_12'] = talib.TRIX(mult_close, timeperiod=12) if bars['trix_cl_12'].isnull().all(): bars['trix_cl_12_signal'] = 0 else: bars['trix_cl_12_signal'] = talib.EMA(bars['trix_cl_12'].bfill().values, timeperiod=9) bars['trix_cl_5'] = talib.TRIX(mult_close, timeperiod=5) if bars['trix_cl_5'].isnull().all(): bars['trix_cl_5_signal'] = 0 else: bars['trix_cl_5_signal'] = talib.EMA(bars['trix_cl_5'].bfill().values, timeperiod=3) if tp: bars['trix_tp'] = talib.TRIX(mult_tp, timeperiod=30) # ultimate Oscillator - between 0 and 100 bars['ultosc'] = talib.ULTOSC(mult_high, mult_low, mult_close, timeperiod1=7, timeperiod2=14, timeperiod3=28) # williams % r -- 0 to 100 bars['willr'] = talib.WILLR(mult_high, mult_low, mult_close, timeperiod=14) ### volume indicators # Chaikin A/D Line bars['ad'] = talib.AD(mult_high, mult_low, mult_close, volume) # Chaikin A/D Oscillator bars['adosc'] = talib.ADOSC(mult_high, mult_low, mult_close, volume, fastperiod=3, slowperiod=10) # on balance volume if cl: bars['obv_cl'] = talib.OBV(mult_close, volume) if bars['obv_cl'].isnull().all(): bars['obv_cl_ema_14'] = 0 else: bars['obv_cl_ema_14'] = talib.EMA(bars['obv_cl'].values, timeperiod=14) if tp: bars['obv_tp'] = talib.OBV(mult_tp, volume) ### volatility indicators # average true range # Large or increasing ranges suggest traders prepared to continue to bid up or sell down a stock through the course of the day. Decreasing range suggests waning interest. # https://en.wikipedia.org/wiki/Average_true_range bars['atr_65'] = talib.ATR(mult_high, mult_low, mult_close, timeperiod=65) bars['atr_20'] = talib.ATR(mult_high, mult_low, mult_close, timeperiod=20) bars['atr_14'] = talib.ATR(mult_high, mult_low, mult_close, timeperiod=14) bars['atr_5'] = talib.ATR(mult_high, mult_low, mult_close, timeperiod=5) # Normalized Average True Range bars['natr_14'] = talib.NATR(mult_high, mult_low, mult_close, timeperiod=14) bars['natr_5'] = talib.NATR(mult_high, mult_low, mult_close, timeperiod=5) # true range bars['trange'] = talib.TRANGE(mult_high, mult_low, mult_close) / mult ### Cycle indicators # Hilbert Transform - Dominant Cycle Period if cl: bars['ht_dcp_cl'] = talib.HT_DCPERIOD(mult_close) if tp: bars['ht_dcp_tp'] = talib.HT_DCPERIOD(mult_tp) # Hilbert Transform - Dominant Cycle Phase if cl: bars['ht_dcph_cl'] = talib.HT_DCPHASE(mult_close) if tp: bars['ht_dcph_tp'] = talib.HT_DCPHASE(mult_tp) # Hilbert Transform - Phasor Components if cl: inphase_cl, quadrature_cl = talib.HT_PHASOR(mult_close) bars['ht_ph_cl'] = inphase_cl bars['ht_q_cl'] = quadrature_cl if tp: inphase_tp, quadrature_tp = talib.HT_PHASOR(mult_tp) bars['ht_ph_tp'] = inphase_tp bars['ht_q_tp'] = quadrature_tp # Hilbert Transform - SineWave if cl: sine_cl, leadsine_cl = talib.HT_SINE(mult_close) bars['ht_s_cl'] = sine_cl bars['ht_ls_cl'] = leadsine_cl if tp: sine_tp, leadsine_tp = talib.HT_SINE(mult_tp) bars['ht_s_tp'] = sine_tp bars['ht_ls_tp'] = leadsine_tp # Hilbert Transform - Trend vs Cycle Mode if cl: bars['ht_tr_cl'] = talib.HT_TRENDMODE(mult_close) if tp: bars['ht_tr_tp'] = talib.HT_TRENDMODE(mult_tp) bars.fillna(method='bfill', inplace=True) if return_df: return bars