def create_trade_sign(self, stock_price: pd.DataFrame) -> pd.DataFrame: stock_price = stock_price.sort_values("date") kd = StochasticOscillator( high=stock_price["max"], low=stock_price["min"], close=stock_price["close"], n=self.kdays, ) rsv_ = kd.stoch().fillna(50) _k = np.zeros(stock_price.shape[0]) _d = np.zeros(stock_price.shape[0]) for i, r in enumerate(rsv_): if i == 0: _k[i] = 50 _d[i] = 50 else: _k[i] = _k[i - 1] * 2 / 3 + r / 3 _d[i] = _d[i - 1] * 2 / 3 + _k[i] / 3 stock_price["K"] = _k stock_price["D"] = _d stock_price.index = range(len(stock_price)) stock_price["signal"] = 0 stock_price.loc[stock_price["K"] <= self.kd_lower, "signal"] = 1 stock_price.loc[stock_price["K"] >= self.kd_upper, "signal"] = -1 return stock_price
def create_trade_sign(self, stock_price: pd.DataFrame) -> pd.DataFrame: stock_price = stock_price.sort_values("date") kd = StochasticOscillator( high=stock_price["max"], low=stock_price["min"], close=stock_price["close"], n=self.k_days, ) rsv_ = kd.stoch().fillna(50) _k = np.zeros(stock_price.shape[0]) _d = np.zeros(stock_price.shape[0]) for i, r in enumerate(rsv_): if i == 0: _k[i] = 50 _d[i] = 50 else: _k[i] = _k[i - 1] * 2 / 3 + r / 3 _d[i] = _d[i - 1] * 2 / 3 + _k[i] / 3 stock_price["K"] = _k stock_price["D"] = _d stock_price.index = range(len(stock_price)) stock_price["diff"] = stock_price["K"] - stock_price["D"] stock_price.loc[(stock_price.index < self.k_days), "diff"] = np.nan stock_price["diff_sign"] = stock_price["diff"].map( lambda x: 1 if x >= 0 else (-1 if x < 0 else 0)) stock_price["diff_sign_yesterday"] = ( stock_price["diff_sign"].shift(1).fillna(0).astype(int)) stock_price["signal"] = 0 stock_price.loc[((stock_price["diff_sign"] > 0) & (stock_price["diff_sign_yesterday"] < 0)), "signal", ] = 1 stock_price.loc[((stock_price["diff_sign"] < 0) & (stock_price["diff_sign_yesterday"] > 0)), "signal", ] = -1 return stock_price
def init(self, base_data): base_data = base_data.sort_values("date") kd = StochasticOscillator( high=base_data["max"], low=base_data["min"], close=base_data["close"], n=self.kdays, ) rsv_ = kd.stoch().fillna(50) _k = np.zeros(base_data.shape[0]) _d = np.zeros(base_data.shape[0]) for i, r in enumerate(rsv_): if i == 0: _k[i] = 50 _d[i] = 50 else: _k[i] = _k[i - 1] * 2 / 3 + r / 3 _d[i] = _d[i - 1] * 2 / 3 + _k[i] / 3 base_data["K"] = _k base_data["D"] = _d base_data.index = range(len(base_data)) base_data["signal"] = 0 base_data.loc[base_data["K"] <= self.kd_lower, "signal"] = 1 base_data.loc[base_data["K"] >= self.kd_upper, "signal"] = -1 return base_data
def calc(self, dataframe): stoch = StochasticOscillator(close=dataframe.close, low=dataframe.low, high=dataframe.high, n=self.params.get("period"), d_n=self.params.get("d_period")) dataframe["{}_k".format(self.col_name())] = stoch.stoch() return dataframe
def create_trade_sign(self, stock_price: pd.DataFrame) -> pd.DataFrame: stock_price = stock_price.sort_values("date") kd = StochasticOscillator( high=stock_price["max"], low=stock_price["min"], close=stock_price["close"], n=self.kdays, d_n=self.ddays, ) stock_price["K"] = kd.stoch() stock_price["D"] = kd.stoch_signal() stock_price.index = range(len(stock_price)) stock_price["signal"] = 0 stock_price.loc[stock_price["K"] <= self.kd_lower, "signal"] = 1 stock_price.loc[stock_price["K"] >= self.kd_upper, "signal"] = -1 return stock_price
def analyze(self): stochastic_df = StochasticOscillator(self.df.high, self.df.low, self.df.close, n=5) self.df["stoch_k"] = stochastic_df.stoch() self.df["stoch_d"] = stochastic_df.stoch_signal() self.df["high_close"] = ((self.df.high - self.df.close) / (self.df.high + self.df.close / 2) * 100) self.df["buy_signal"] = ( ((self.df['stoch_k'] > self.df['stoch_d']) & (self.df['stoch_k'].shift(1) < self.df['stoch_d'].shift(1))) & (self.df['stoch_d'] < 26)) self.df["stoch_buy_signal_early"] = ( (self.df['stoch_k'] < self.df['stoch_d']) & ((self.df["stoch_d"]) - self.df["stoch_k"] < 3) & (self.df['stoch_d'] < 26))
def init(self, base_data): base_data = base_data.sort_values("date") kd = StochasticOscillator( high=base_data["max"], low=base_data["min"], close=base_data["close"], n=self.kdays, d_n=self.ddays, ) base_data["K"] = kd.stoch() base_data["D"] = kd.stoch_signal() base_data.index = range(len(base_data)) base_data["signal"] = 0 base_data.loc[base_data["K"] <= self.kd_lower, "signal"] = 1 base_data.loc[base_data["K"] >= self.kd_upper, "signal"] = -1 return base_data
def init(self, base_data): base_data = base_data.sort_values("date") kd = StochasticOscillator( high=base_data["max"], low=base_data["min"], close=base_data["close"], n=self.kdays, ) rsv_ = kd.stoch().fillna(50) _k = np.zeros(base_data.shape[0]) _d = np.zeros(base_data.shape[0]) for i, r in enumerate(rsv_): if i == 0: _k[i] = 50 _d[i] = 50 else: _k[i] = _k[i - 1] * 2 / 3 + r / 3 _d[i] = _d[i - 1] * 2 / 3 + _k[i] / 3 base_data["K"] = _k base_data["D"] = _d base_data.index = range(len(base_data)) base_data["diff"] = base_data["K"] - base_data["D"] base_data.loc[(base_data.index < self.kdays), "diff"] = np.nan base_data["bool_diff"] = base_data["diff"].map( lambda x: 1 if x >= 0 else (-1 if x < 0 else 0)) base_data["bool_diff_shift1"] = ( base_data["bool_diff"].shift(1).fillna(0).astype(int)) base_data["signal"] = 0 base_data.loc[((base_data["bool_diff"] > 0) & (base_data["bool_diff_shift1"] < 0)), "signal", ] = 1 base_data.loc[((base_data["bool_diff"] < 0) & (base_data["bool_diff_shift1"] > 0)), "signal", ] = -1 return base_data
def add_momentum_indicators(data: pd.DataFrame) -> pd.DataFrame: """Adds the momentum indicators. Parameters ---------- data : pd.DataFrame A dataframe with daily stock values. Must include: open, high, low, close and volume. It should also be sorted in a descending manner. Returns ------- pd.DataFrame The input dataframe with the indicators added. """ rsi = RSIIndicator(data['close']) stoch_osc = StochasticOscillator(data['high'], data['low'], data['close']) data.loc[:, 'rsi'] = rsi.rsi() data.loc[:, 'stoch_osc'] = stoch_osc.stoch() data.loc[:, 'stoch_osc_signal'] = stoch_osc.stoch_signal() return data
class TestStochasticOscillator(unittest.TestCase): """ https://school.stockcharts.com/doku.php?id=technical_indicators:stochastic_oscillator_fast_slow_and_full """ _filename = 'ta/tests/data/cs-soo.csv' def setUp(self): self._df = pd.read_csv(self._filename, sep=',') self._indicator = StochasticOscillator( high=self._df['High'], low=self._df['Low'], close=self._df['Close'], n=14, d_n=3, fillna=False) def tearDown(self): del(self._df) def test_so(self): target = 'SO' result = self._indicator.stoch() pd.testing.assert_series_equal(self._df[target].tail(), result.tail(), check_names=False) def test_so_signal(self): target = 'SO_SIG' result = self._indicator.stoch_signal() pd.testing.assert_series_equal(self._df[target].tail(), result.tail(), check_names=False)
def STOCHASTIC(self, df): df_STOCH = df.copy() stoch = StochasticOscillator(df['High'], df['Low'], df['Close']) df['%K'] = stoch.stoch() df['%D'] = stoch.stoch_signal() return df
iloc is primarily integer position based (from 0 to length-1 of the axis), but may also be used with a boolean array. ''' period = 30 df['SMA_Close'] = talib.SMA(df["Close"], timeperiod=period) print('Time #1 batch TI: ' + str(time.time() - start_time) + ' seconds') start_time = time.time() # Stochastic Oscillator (SO) period = 14 sma_period = 3 StochasticOscillator = ta.momentum.StochasticOscillator(high=df["High"], low=df["Low"], close=df["Close"], n=period, d_n=sma_period, fillna=False) df['SO'] = StochasticOscillator.stoch() # Momentum (M) period = 3 df['Momentum'] = talib.MOM(df["Close"], timeperiod=period) # Price Rate Of Change (ROC) ''' Description: is a pure momentum oscillator that measures the percent change in price from one period to the next The ROC calculation compares the current price with the price “n” periods ago ''' period = 12 RateOfChange = ta.momentum.ROCIndicator(close=df["Close"], n=period, fillna=False)
def add_momentum_ta( df: pd.DataFrame, high: str, low: str, close: str, volume: str, fillna: bool = False, colprefix: str = "", vectorized: bool = False, ) -> pd.DataFrame: """Add trend technical analysis features to dataframe. Args: df (pandas.core.frame.DataFrame): Dataframe base. high (str): Name of 'high' column. low (str): Name of 'low' column. close (str): Name of 'close' column. volume (str): Name of 'volume' column. fillna(bool): if True, fill nan values. colprefix(str): Prefix column names inserted vectorized(bool): if True, use only vectorized functions indicators Returns: pandas.core.frame.DataFrame: Dataframe with new features. """ # Relative Strength Index (RSI) df[f"{colprefix}momentum_rsi"] = RSIIndicator(close=df[close], window=14, fillna=fillna).rsi() # Stoch RSI (StochRSI) indicator_srsi = StochRSIIndicator(close=df[close], window=14, smooth1=3, smooth2=3, fillna=fillna) df[f"{colprefix}momentum_stoch_rsi"] = indicator_srsi.stochrsi() df[f"{colprefix}momentum_stoch_rsi_k"] = indicator_srsi.stochrsi_k() df[f"{colprefix}momentum_stoch_rsi_d"] = indicator_srsi.stochrsi_d() # TSI Indicator df[f"{colprefix}momentum_tsi"] = TSIIndicator(close=df[close], window_slow=25, window_fast=13, fillna=fillna).tsi() # Ultimate Oscillator df[f"{colprefix}momentum_uo"] = UltimateOscillator( high=df[high], low=df[low], close=df[close], window1=7, window2=14, window3=28, weight1=4.0, weight2=2.0, weight3=1.0, fillna=fillna, ).ultimate_oscillator() # Stoch Indicator indicator_so = StochasticOscillator( high=df[high], low=df[low], close=df[close], window=14, smooth_window=3, fillna=fillna, ) df[f"{colprefix}momentum_stoch"] = indicator_so.stoch() df[f"{colprefix}momentum_stoch_signal"] = indicator_so.stoch_signal() # Williams R Indicator df[f"{colprefix}momentum_wr"] = WilliamsRIndicator( high=df[high], low=df[low], close=df[close], lbp=14, fillna=fillna).williams_r() # Awesome Oscillator df[f"{colprefix}momentum_ao"] = AwesomeOscillatorIndicator( high=df[high], low=df[low], window1=5, window2=34, fillna=fillna).awesome_oscillator() # Rate Of Change df[f"{colprefix}momentum_roc"] = ROCIndicator(close=df[close], window=12, fillna=fillna).roc() # Percentage Price Oscillator indicator_ppo = PercentagePriceOscillator(close=df[close], window_slow=26, window_fast=12, window_sign=9, fillna=fillna) df[f"{colprefix}momentum_ppo"] = indicator_ppo.ppo() df[f"{colprefix}momentum_ppo_signal"] = indicator_ppo.ppo_signal() df[f"{colprefix}momentum_ppo_hist"] = indicator_ppo.ppo_hist() # Percentage Volume Oscillator indicator_pvo = PercentageVolumeOscillator(volume=df[volume], window_slow=26, window_fast=12, window_sign=9, fillna=fillna) df[f"{colprefix}momentum_pvo"] = indicator_pvo.pvo() df[f"{colprefix}momentum_pvo_signal"] = indicator_pvo.pvo_signal() df[f"{colprefix}momentum_pvo_hist"] = indicator_pvo.pvo_hist() if not vectorized: # KAMA df[f"{colprefix}momentum_kama"] = KAMAIndicator(close=df[close], window=10, pow1=2, pow2=30, fillna=fillna).kama() return df
def applyIndicator(self, full_company_price): self.data = full_company_price high = self.data['high'] low = self.data['low'] close = self.data['close'] volume = self.data['volume'] EMA12 = EMAIndicator(close, 12, fillna=False) EMA30 = EMAIndicator(close, 20, fillna=False) EMA60 = EMAIndicator(close, 60, fillna=False) MACD1226 = MACD(close, 26, 12, 9, fillna=False) MACD2452 = MACD(close, 52, 24, 18, fillna=False) ROC12 = ROCIndicator(close, 12, fillna=False) ROC30 = ROCIndicator(close, 30, fillna=False) ROC60 = ROCIndicator(close, 60, fillna=False) RSI14 = RSIIndicator(close, 14, fillna=False) RSI28 = RSIIndicator(close, 28, fillna=False) RSI60 = RSIIndicator(close, 60, fillna=False) AROON25 = AroonIndicator(close, 25, fillna=False) AROON50 = AroonIndicator(close, 50, fillna=False) AROON80 = AroonIndicator(close, 80, fillna=False) MFI14 = MFIIndicator(high, low, close, volume, 14, fillna=False) MFI28 = MFIIndicator(high, low, close, volume, 28, fillna=False) MFI80 = MFIIndicator(high, low, close, volume, 80, fillna=False) CCI20 = CCIIndicator(high, low, close, 20, 0.015, fillna=False) CCI40 = CCIIndicator(high, low, close, 40, 0.015, fillna=False) CCI100 = CCIIndicator(high, low, close, 100, 0.015, fillna=False) WILLR14 = WilliamsRIndicator(high, low, close, 14, fillna=False) WILLR28 = WilliamsRIndicator(high, low, close, 28, fillna=False) WILLR60 = WilliamsRIndicator(high, low, close, 60, fillna=False) BBANDS20 = BollingerBands(close, 20, 2, fillna=False) KC20 = KeltnerChannel(high, low, close, 20, 10, fillna=False) STOCH14 = StochasticOscillator(high, low, close, 14, 3, fillna=False) STOCH28 = StochasticOscillator(high, low, close, 28, 6, fillna=False) STOCH60 = StochasticOscillator(high, low, close, 60, 12, fillna=False) CMI20 = ChaikinMoneyFlowIndicator(high, low, close, volume, 20, fillna=False) CMI40 = ChaikinMoneyFlowIndicator(high, low, close, volume, 40, fillna=False) CMI100 = ChaikinMoneyFlowIndicator(high, low, close, volume, 100, fillna=False) self.data['ema12'] = (close - EMA12.ema_indicator()) / close self.data['ema30'] = (close - EMA30.ema_indicator()) / close self.data['ema60'] = (close - EMA60.ema_indicator()) / close self.data['macd1226'] = MACD1226.macd() - MACD1226.macd_signal() self.data['macd2452'] = MACD2452.macd() - MACD2452.macd_signal() self.data['roc12'] = ROC12.roc() self.data['roc30'] = ROC30.roc() self.data['roc60'] = ROC60.roc() self.data['rsi14'] = RSI14.rsi() self.data['rsi28'] = RSI28.rsi() self.data['rsi60'] = RSI60.rsi() self.data['aroon25'] = AROON25.aroon_indicator() self.data['aroon50'] = AROON50.aroon_indicator() self.data['aroon80'] = AROON80.aroon_indicator() self.data['mfi14'] = MFI14.money_flow_index() self.data['mfi28'] = MFI28.money_flow_index() self.data['mfi80'] = MFI80.money_flow_index() self.data['cci20'] = CCI20.cci() self.data['cci40'] = CCI40.cci() self.data['cci100'] = CCI100.cci() self.data['willr14'] = WILLR14.wr() self.data['willr28'] = WILLR28.wr() self.data['willr60'] = WILLR60.wr() self.data['bband20up'] = (BBANDS20.bollinger_hband() - close) / close self.data['bband20down'] = (close - BBANDS20.bollinger_lband()) / close self.data['stoch14'] = STOCH14.stoch() self.data['stoch28'] = STOCH28.stoch() self.data['stoch60'] = STOCH60.stoch() self.data['cmi20'] = CMI20.chaikin_money_flow() self.data['cmi40'] = CMI40.chaikin_money_flow() self.data['cmi100'] = CMI100.chaikin_money_flow() self.data['kc20up'] = (KC20.keltner_channel_hband() - close) / close self.data['kc20down'] = (close - KC20.keltner_channel_lband()) / close return self.data
def add_momentum_ta(df: pd.DataFrame, high: str, low: str, close: str, volume: str, fillna: bool = False, colprefix: str = "") -> pd.DataFrame: """Add trend technical analysis features to dataframe. Args: df (pandas.core.frame.DataFrame): Dataframe base. high (str): Name of 'high' column. low (str): Name of 'low' column. close (str): Name of 'close' column. fillna(bool): if True, fill nan values. colprefix(str): Prefix column names inserted Returns: pandas.core.frame.DataFrame: Dataframe with new features. """ # Relative Strength Index (RSI) df[f'{colprefix}momentum_rsi'] = RSIIndicator(close=df[close], n=14, fillna=fillna).rsi() # TSI Indicator df[f'{colprefix}momentum_tsi'] = TSIIndicator(close=df[close], r=25, s=13, fillna=fillna).tsi() # Ultimate Oscillator df[f'{colprefix}momentum_uo'] = UltimateOscillator(high=df[high], low=df[low], close=df[close], s=7, m=14, len=28, ws=4.0, wm=2.0, wl=1.0, fillna=fillna).uo() # Stoch Indicator indicator = StochasticOscillator(high=df[high], low=df[low], close=df[close], n=14, d_n=3, fillna=fillna) df[f'{colprefix}momentum_stoch'] = indicator.stoch() df[f'{colprefix}momentum_stoch_signal'] = indicator.stoch_signal() # Williams R Indicator df[f'{colprefix}momentum_wr'] = WilliamsRIndicator(high=df[high], low=df[low], close=df[close], lbp=14, fillna=fillna).wr() # Awesome Oscillator df[f'{colprefix}momentum_ao'] = AwesomeOscillatorIndicator( high=df[high], low=df[low], s=5, len=34, fillna=fillna).ao() # KAMA df[f'{colprefix}momentum_kama'] = KAMAIndicator(close=df[close], n=10, pow1=2, pow2=30, fillna=fillna).kama() # Rate Of Change df[f'{colprefix}momentum_roc'] = ROCIndicator(close=df[close], n=12, fillna=fillna).roc() return df