def ta_only_forecastMomentum(price_data_csv): df = pandas.read_csv(filepath_or_buffer=price_data_csv.name, delimiter=',', header=0) df['time'] = pandas.to_datetime( df.time, unit='s') # gotta convert those dates to a usable format data_frame = pandas.DataFrame(df).set_index('time').sort_values( by='time', ascending=True) # Fast Stochastic Oscillator Check SMA_Period = 3 # typical SMA period for S.O. data_frame['Stoch_D'] = momentum.stoch_signal(high=data_frame['high'], low=data_frame['low'], close=data_frame['close'], n=15, d_n=SMA_Period, fillna=False) data_frame['Stoch_K'] = momentum.stoch(high=data_frame['high'], low=data_frame['low'], close=data_frame['close'], n=15, d_n=SMA_Period, fillna=False) data_frame['RSI'] = momentum.rsi(close=data_frame['close'], n=15) # predict based on signal signal = data_frame['Stoch_D'].array[-1] + data_frame['Stoch_K'].array[-1] RSI = data_frame['RSI'].array[-1] if signal > 160 and RSI > 70: # overbought assets print( f"\nSO signal: {signal}\nRSI: {RSI}\nCLOSE: {data_frame['close'].array[-1]}" ) return { 'signal': 2, 'RSI': RSI, 'SO': signal, 'PRICE': data_frame['close'].array[-1] } elif signal < 40 and RSI < 30: # oversold asset print( f"\nSO signal: {signal}\nRSI: {RSI}\nCLOSE: {data_frame['close'].array[-1]}" ) return { 'signal': 0, 'RSI': RSI, 'SO': signal, 'PRICE': data_frame['close'].array[-1] } else: # not overbought/sold, should hold the asset print( f"\nSO signal: {signal}\nRSI: {RSI}\nCLOSE: {data_frame['close'].array[-1]}" ) return { 'signal': 1, 'RSI': RSI, 'SO': signal, 'PRICE': data_frame['close'].array[-1] }
def processing(idv_df): idv_df.columns = map(str.lower, idv_df.columns) idv_df = idv_df[idv_df.close != 0] idv_df = idv_df[idv_df.volume != 0] rolling_mean = idv_df.close.rolling(window=3).mean() rolling_mean2 = idv_df.close.rolling(window=10).mean() rolling_mean3 = idv_df.close.rolling(window=70).mean() ma3 = pd.DataFrame(rolling_mean).rename(columns={"close":"MA3"}) ma10 = pd.DataFrame(rolling_mean2).rename(columns={"close":"MA10"}) ma70 = pd.DataFrame(rolling_mean3).rename(columns={"close":"MA70"}) ma_df = ma3.join(ma10).join(ma70) idv_df = idv_df.join(ma_df) #Create and add Stochastics idv_df['sto_%K'] = momentum.stoch(idv_df['high'], idv_df['low'], idv_df['close'], n=14, fillna=False) idv_df['sto_%D'] = momentum.stoch_signal(idv_df['high'], idv_df['low'], idv_df['close'], n=14, d_n=3, fillna=False) #Create and add vol mean average_vol = idv_df.volume.rolling(window=10).mean() avg_vol = pd.DataFrame(average_vol).rename(columns={"volume":"avg_vol"}) idv_df = idv_df.join(avg_vol) return idv_df
# robust to unimportant/irrelevant variables, because such variables that cannot # discriminate between events/non-events will not be selected as the splitting # variable and hence will be very low on the var importance graph as well. # Daily return features['f01'] = stock.close/stock.open-1 features['f010'] = features.groupby(level='symbol').f01.shift() # Open gap features['f02'] = stock.open/stock.groupby(level='symbol').close.shift(1)-1 # Put call ratio change features['f03'] = stock.put_call_ratio_volume.diff() features['f04'] = stock.volume.apply(np.log) features['f05'] = stock.groupby(level='symbol').close.apply(rsi) func_stoch = lambda x: stoch(high=x.high, low=x.low, close=x.close) features['f06'] = stock.groupby(level='symbol').apply(func_stoch).reset_index(drop=True,level=0) # func_wr = lambda x: wr(high=x.high,low=x.low, close=x.close) # features['f07'] = stock.groupby(level='symbol').apply(func_wr).reset_index(drop=True,level=0) # features['f08'] = stock.groupby(level='symbol').close.apply(macd) # func_ema_50 = lambda x: x.ewm(alpha=0.095).mean() # features['f09'] = stock.close/ stock.close.groupby(level='symbol').apply(func_ema_50)-1 # features['f10'] = stock.groupby(level='symbol').close.apply(roc) # Signing features['f11'] = features['f01'].apply(np.sign) # %% # XGBoost model
def engineer_data_over_single_interval(df: pd.DataFrame, indicators: list, ticker: str = "", rsi_n: int = 14, cmo_n: int = 7, macd_fast: int = 12, macd_slow: int = 26, macd_sign: int = 9, roc_n: int = 12, cci_n: int = 20, dpo_n: int = 20, cmf_n: int = 20, adx_n: int = 14, mass_index_low: int = 9, mass_index_high: int = 25, trix_n: int = 15, stochastic_oscillator_n: int = 14, stochastic_oscillator_sma_n: int = 3, ultimate_oscillator_short_n: int = 7, ultimate_oscillator_medium_n: int = 14, ultimate_oscillator_long_n: int = 28, ao_short_n: int = 5, ao_long_n: int = 34, kama_n: int = 10, tsi_high_n: int = 25, tsi_low_n: int = 13, eom_n: int = 14, force_index_n: int = 13, ichimoku_low_n: int = 9, ichimoku_medium_n: int = 26): from ta.momentum import rsi, wr, roc, ao, stoch, uo, kama, tsi from ta.trend import macd, macd_signal, cci, dpo, adx, mass_index, trix, ichimoku_a from ta.volume import chaikin_money_flow, acc_dist_index, ease_of_movement, force_index # Momentum Indicators if Indicators.RELATIVE_STOCK_INDEX in indicators: Logger.console_log(message="Calculating " + Indicators.RELATIVE_STOCK_INDEX.value + " for stock " + ticker, status=Logger.LogStatus.EMPHASIS) df[Indicators.RELATIVE_STOCK_INDEX.value] = rsi(close=df['close'], n=rsi_n) if Indicators.WILLIAMS_PERCENT_RANGE in indicators: Logger.console_log(message="Calculating " + Indicators.WILLIAMS_PERCENT_RANGE.value + " for stock " + ticker, status=Logger.LogStatus.EMPHASIS) df[Indicators.WILLIAMS_PERCENT_RANGE.value] = wr( df['high'], df['low'], df['close']) if Indicators.CHANDE_MOMENTUM_OSCILLATOR in indicators: Logger.console_log(message="Calculating " + Indicators.CHANDE_MOMENTUM_OSCILLATOR.value + " for stock " + ticker, status=Logger.LogStatus.EMPHASIS) df[Indicators.CHANDE_MOMENTUM_OSCILLATOR. value] = chande_momentum_oscillator(close_data=df['close'], period=cmo_n) if Indicators.RATE_OF_CHANGE in indicators: Logger.console_log(message="Calculating " + Indicators.RATE_OF_CHANGE.value + " for stock " + ticker, status=Logger.LogStatus.EMPHASIS) df[Indicators.RATE_OF_CHANGE.value] = roc(close=df['close'], n=roc_n) if Indicators.STOCHASTIC_OSCILLATOR in indicators: Logger.console_log(message="Calculating " + Indicators.STOCHASTIC_OSCILLATOR.value + " for stock " + ticker, status=Logger.LogStatus.EMPHASIS) df[Indicators.STOCHASTIC_OSCILLATOR.value] = stoch( high=df['high'], low=df['low'], close=df['close'], n=stochastic_oscillator_n, d_n=stochastic_oscillator_sma_n) if Indicators.ULTIMATE_OSCILLATOR in indicators: Logger.console_log(message="Calculating " + Indicators.ULTIMATE_OSCILLATOR.value + " for stock " + ticker, status=Logger.LogStatus.EMPHASIS) df[Indicators.ULTIMATE_OSCILLATOR.value] = uo( high=df['high'], low=df['low'], close=df['close'], s=ultimate_oscillator_short_n, m=ultimate_oscillator_medium_n, len=ultimate_oscillator_long_n) if Indicators.AWESOME_OSCILLATOR in indicators: Logger.console_log(message="Calculating " + Indicators.AWESOME_OSCILLATOR.value + " for stock " + ticker, status=Logger.LogStatus.EMPHASIS) df[Indicators.AWESOME_OSCILLATOR.value] = ao(high=df['high'], low=df['low'], s=ao_short_n, len=ao_long_n) if Indicators.KAUFMAN_ADAPTIVE_MOVING_AVERAGE in indicators: Logger.console_log(message="Calculating " + Indicators.KAUFMAN_ADAPTIVE_MOVING_AVERAGE.value + " for stock " + ticker, status=Logger.LogStatus.EMPHASIS) df[Indicators.KAUFMAN_ADAPTIVE_MOVING_AVERAGE.value] = kama( close=df['close'], n=kama_n) if Indicators.TRUE_STRENGTH_INDEX in indicators: Logger.console_log(message="Calculating " + Indicators.TRUE_STRENGTH_INDEX.value + " for stock " + ticker, status=Logger.LogStatus.EMPHASIS) df[Indicators.TRUE_STRENGTH_INDEX.value] = tsi(close=df['close'], r=tsi_high_n, s=tsi_low_n) # Trend Indicator if Indicators.MOVING_AVERAGE_CONVERGENCE_DIVERGENCE in indicators: Logger.console_log( message="Calculating " + Indicators.MOVING_AVERAGE_CONVERGENCE_DIVERGENCE.value + " for stock " + ticker, status=Logger.LogStatus.EMPHASIS) df[Indicators.MOVING_AVERAGE_CONVERGENCE_DIVERGENCE.value] = macd(close=df['close'], n_slow=macd_slow, n_fast=macd_fast) - \ macd_signal(close=df['close'], n_slow=macd_slow, n_fast=macd_fast, n_sign=macd_sign) if Indicators.COMMODITY_CHANNEL_INDEX in indicators: Logger.console_log(message="Calculating " + Indicators.COMMODITY_CHANNEL_INDEX.value + " for stock " + ticker, status=Logger.LogStatus.EMPHASIS) df[Indicators.COMMODITY_CHANNEL_INDEX.value] = cci(high=df['high'], low=df['low'], close=df['close'], n=cci_n) if Indicators.DETRENDED_PRICE_OSCILLATOR in indicators: Logger.console_log(message="Calculating " + Indicators.DETRENDED_PRICE_OSCILLATOR.value + " for stock " + ticker, status=Logger.LogStatus.EMPHASIS) df[Indicators.DETRENDED_PRICE_OSCILLATOR.value] = dpo( close=df['close'], n=dpo_n) if Indicators.AVERAGE_DIRECTIONAL_INDEX in indicators: Logger.console_log(message="Calculating " + Indicators.AVERAGE_DIRECTIONAL_INDEX.value + " for stock " + ticker, status=Logger.LogStatus.EMPHASIS) df[Indicators.AVERAGE_DIRECTIONAL_INDEX.value] = adx(high=df['high'], low=df['low'], close=df['close'], n=adx_n) if Indicators.MASS_INDEX in indicators: Logger.console_log(message="Calculating " + Indicators.MASS_INDEX.value + " for stock " + ticker, status=Logger.LogStatus.EMPHASIS) df[Indicators.MASS_INDEX.value] = mass_index(high=df['high'], low=df['low'], n=mass_index_low, n2=mass_index_high) if Indicators.TRIPLE_EXPONENTIALLY_SMOOTHED_MOVING_AVERAGE in indicators: Logger.console_log( message="Calculating " + Indicators.TRIPLE_EXPONENTIALLY_SMOOTHED_MOVING_AVERAGE.value + " for stock " + ticker, status=Logger.LogStatus.EMPHASIS) df[Indicators.TRIPLE_EXPONENTIALLY_SMOOTHED_MOVING_AVERAGE. value] = trix(close=df['close'], n=trix_n) if Indicators.ICHIMOKU_A in indicators: Logger.console_log(message="Calculating " + Indicators.ICHIMOKU_A.value + " for stock " + ticker, status=Logger.LogStatus.EMPHASIS) df[Indicators.ICHIMOKU_A.value] = ichimoku_a(high=df['high'], low=df['low'], n1=ichimoku_low_n, n2=ichimoku_medium_n) # Volume Indicator if Indicators.CHAIKIN_MONEY_FLOW in indicators: Logger.console_log(message="Calculating " + Indicators.CHAIKIN_MONEY_FLOW.value + " for stock " + ticker, status=Logger.LogStatus.EMPHASIS) df[Indicators.CHAIKIN_MONEY_FLOW.value] = chaikin_money_flow( high=df['high'], low=df['low'], close=df['close'], volume=df['volume'], n=cmf_n) if Indicators.ACCUMULATION_DISTRIBUTION_INDEX in indicators: Logger.console_log(message="Calculating " + Indicators.ACCUMULATION_DISTRIBUTION_INDEX.value + " for stock " + ticker, status=Logger.LogStatus.EMPHASIS) df[Indicators.ACCUMULATION_DISTRIBUTION_INDEX.value] = acc_dist_index( high=df['high'], low=df['low'], close=df['close'], volume=df['volume']) if Indicators.EASE_OF_MOVEMENT in indicators: Logger.console_log(message="Calculating " + Indicators.EASE_OF_MOVEMENT.value + " for stock " + ticker, status=Logger.LogStatus.EMPHASIS) df[Indicators.EASE_OF_MOVEMENT.value] = ease_of_movement( high=df['high'], low=df['low'], volume=df['volume'], n=eom_n) if Indicators.FORCE_INDEX in indicators: Logger.console_log(message="Calculating " + Indicators.FORCE_INDEX.value + " for stock " + ticker, status=Logger.LogStatus.EMPHASIS) df[Indicators.FORCE_INDEX.value] = force_index(close=df['close'], volume=df['volume'], n=force_index_n)
def __dataframe(self): """Create an comprehensive list of from data. Args: None Returns: result: dataframe for learning """ # Calculate the percentage and real differences between columns difference = math.Difference(self._ohlcv) num_difference = difference.actual() pct_difference = difference.relative() # Create result to return. result = pd.DataFrame() # Add current value columns result['open'] = self._ohlcv['open'] result['high'] = self._ohlcv['high'] result['low'] = self._ohlcv['low'] result['close'] = self._ohlcv['close'] result['volume'] = self._ohlcv['volume'] # Add columns of differences result['num_diff_open'] = num_difference['open'] result['num_diff_high'] = num_difference['high'] result['num_diff_low'] = num_difference['low'] result['num_diff_close'] = num_difference['close'] result['pct_diff_open'] = pct_difference['open'] result['pct_diff_high'] = pct_difference['high'] result['pct_diff_low'] = pct_difference['low'] result['pct_diff_close'] = pct_difference['close'] result['pct_diff_volume'] = pct_difference['volume'] # Add date related columns # result['day'] = self._dates.day result['weekday'] = self._dates.weekday # result['week'] = self._dates.week result['month'] = self._dates.month result['quarter'] = self._dates.quarter # result['dayofyear'] = self._dates.dayofyear # Moving averages result['ma_open'] = result['open'].rolling( self._globals['ma_window']).mean() result['ma_high'] = result['high'].rolling( self._globals['ma_window']).mean() result['ma_low'] = result['low'].rolling( self._globals['ma_window']).mean() result['ma_close'] = result['close'].rolling( self._globals['ma_window']).mean() result['ma_volume'] = result['volume'].rolling( self._globals['vma_window']).mean() result['ma_volume_long'] = result['volume'].rolling( self._globals['vma_window_long']).mean() result[ 'ma_volume_delta'] = result['ma_volume_long'] - result['ma_volume'] # Standard deviation related result['ma_std_close'] = result['close'].rolling( self._globals['ma_window']).std() result['std_pct_diff_close'] = result['pct_diff_close'].rolling( self._globals['ma_window']).std() result['bollinger_lband'] = volatility.bollinger_lband(result['close']) result['bollinger_hband'] = volatility.bollinger_lband(result['close']) result[ 'bollinger_lband_indicator'] = volatility.bollinger_lband_indicator( result['close']) result[ 'bollinger_hband_indicator'] = volatility.bollinger_hband_indicator( result['close']) # Rolling ranges result['amplitude'] = result['high'] - result['low'] _min = result['low'].rolling(self._globals['week']).min() _max = result['high'].rolling(self._globals['week']).max() result['amplitude_medium'] = abs(_min - _max) _min = result['low'].rolling(2 * self._globals['week']).min() _max = result['high'].rolling(2 * self._globals['week']).max() result['amplitude_long'] = abs(_min - _max) _min = result['volume'].rolling(self._globals['week']).min() _max = result['volume'].rolling(self._globals['week']).max() result['vol_amplitude'] = abs(_min - _max) _min = result['volume'].rolling(2 * self._globals['week']).min() _max = result['volume'].rolling(2 * self._globals['week']).max() result['vol_amplitude_long'] = abs(_min - _max) # Volume metrics result['force_index'] = volume.force_index(result['close'], result['volume']) result['negative_volume_index'] = volume.negative_volume_index( result['close'], result['volume']) result['ease_of_movement'] = volume.ease_of_movement( result['high'], result['low'], result['close'], result['volume']) result['acc_dist_index'] = volume.acc_dist_index( result['high'], result['low'], result['close'], result['volume']) result['on_balance_volume'] = volume.on_balance_volume( result['close'], result['volume']) result['on_balance_volume_mean'] = volume.on_balance_volume( result['close'], result['volume']) result['volume_price_trend'] = volume.volume_price_trend( result['close'], result['volume']) # Calculate the Stochastic values result['k'] = momentum.stoch(result['high'], result['low'], result['close'], n=self._globals['kwindow']) result['d'] = momentum.stoch_signal(result['high'], result['low'], result['close'], n=self._globals['kwindow'], d_n=self._globals['dwindow']) # Calculate the Miscellaneous values result['rsi'] = momentum.rsi(result['close'], n=self._globals['rsiwindow'], fillna=False) miscellaneous = math.Misc(self._ohlcv) result['proc'] = miscellaneous.proc(self._globals['proc_window']) # Calculate ADX result['adx'] = trend.adx(result['high'], result['low'], result['close'], n=self._globals['adx_window']) # Calculate MACD difference result['macd_diff'] = trend.macd_diff( result['close'], n_fast=self._globals['macd_sign'], n_slow=self._globals['macd_slow'], n_sign=self._globals['macd_sign']) # Create series for increasing / decreasing closes (Convert NaNs to 0) _result = np.nan_to_num(result['pct_diff_close'].values) _increasing = (_result >= 0).astype(int) * self._buy _decreasing = (_result < 0).astype(int) * self._sell result['increasing'] = _increasing + _decreasing # Stochastic subtraciton result['k_d'] = pd.Series(result['k'].values - result['d'].values) # Other indicators result['k_i'] = self._stochastic_indicator(result['k'], result['high'], result['low'], result['ma_close']) result['d_i'] = self._stochastic_indicator(result['d'], result['high'], result['low'], result['ma_close']) result['stoch_i'] = self._stochastic_indicator_2( result['k'], result['d'], result['high'], result['low'], result['ma_close']) result['rsi_i'] = self._rsi_indicator(result['rsi'], result['high'], result['low'], result['ma_close']) result['adx_i'] = self._adx_indicator(result['adx']) result['macd_diff_i'] = self._macd_diff_indicator(result['macd_diff']) result['volume_i'] = self._volume_indicator(result['ma_volume'], result['ma_volume_long']) # Create time shifted columns for step in range(1, self._ignore_row_count + 1): # result['t-{}'.format(step)] = result['close'].shift(step) result['tpd-{}'.format(step)] = result['close'].pct_change( periods=step) # result['tad-{}'.format(step)] = result[ # 'close'].diff(periods=step) # Mask increasing with result['increasing_masked'] = _mask(result['increasing'].to_frame(), result['stoch_i'], as_integer=True).values # Get class values for each vector classes = pd.DataFrame(columns=self._shift_steps) for step in self._shift_steps: # Shift each column by the value of its label classes[step] = result[self._label2predict].shift(-step) # Remove all undesirable columns from the dataframe undesired_columns = ['open', 'close', 'high', 'low', 'volume'] for column in undesired_columns: result = result.drop(column, axis=1) # Delete the firsts row of the dataframe as it has NaN values from the # .diff() and .pct_change() operations result = result.iloc[self._ignore_row_count:] classes = classes.iloc[self._ignore_row_count:] # Convert result to float32 to conserve memory result = result.astype(np.float32) # Return return result, classes
def test_so2(self): target = 'SO' result = stoch(**self._params) pd.testing.assert_series_equal(self._df[target].tail(), result.tail(), check_names=False)
from ta.momentum import rsi # Relative Strength Index from ta.momentum import stoch # Stochastic Oscilator from ta.momentum import uo # Ultimate Oscilator from ta.momentum import wr #William Percent Range from ta.trend import macd # Moving Average Convergence/Divergence # *************************** DATA PREPROCESSING ****************************** # Load Data df = pd.read_csv('^GSPC.csv') # Data Augmentation df['Relative_Strength_Index'] = rsi(df['Close']) df['Money_Flow_Index'] = money_flow_index(df['High'], df['Low'], df['Close'], df['Volume']) df['Stoch_Oscilator'] = stoch(df['High'], df['Low'], df['Close']) df['Ultimate_Oscilator'] = uo(df['High'], df['Low'], df['Close']) df['William_Percent'] = wr(df['High'], df['Low'], df['Close']) df['MACD'] = macd(df['Close']) # Some indicators require many days in advance before they produce any # values. So the begining rows of our df may have NaNs. Lets drop them: df = df.dropna() # Scaling Data from sklearn.preprocessing import MinMaxScalern sc = MinMaxScaler(feature_range=(0, 1)) scaled_df = sc.fit_transform(df.iloc[:, 1:].values) # Creating a data structure with 60 timesteps and 1 output X_train = np.array(
def __dataframe(self): """Create an comprehensive list of from data. Args: None Returns: result: dataframe for learning """ # Calculate the percentage and real differences between columns difference = math.Difference(self._ohlcv) num_difference = difference.actual() pct_difference = difference.relative() # Create result to return. result = pd.DataFrame() # Add current value columns # NOTE Close must be first for correct correlation column dropping result['close'] = self._ohlcv['close'] result['open'] = self._ohlcv['open'] result['high'] = self._ohlcv['high'] result['low'] = self._ohlcv['low'] result['volume'] = self._ohlcv['volume'] # Add columns of differences # NOTE Close must be first for correct correlation column dropping result['num_diff_close'] = num_difference['close'] result['pct_diff_close'] = pct_difference['close'] result['num_diff_open'] = num_difference['open'] result['pct_diff_open'] = pct_difference['open'] result['num_diff_high'] = num_difference['high'] result['pct_diff_high'] = pct_difference['high'] result['num_diff_low'] = num_difference['low'] result['pct_diff_low'] = pct_difference['low'] result['pct_diff_volume'] = pct_difference['volume'] # Add date related columns # result['day'] = self._dates.day result['weekday'] = self._dates.weekday # result['week'] = self._dates.week result['month'] = self._dates.month result['quarter'] = self._dates.quarter # result['dayofyear'] = self._dates.dayofyear # Moving averages result['ma_open'] = result['open'].rolling( self._globals['ma_window']).mean() result['ma_high'] = result['high'].rolling( self._globals['ma_window']).mean() result['ma_low'] = result['low'].rolling( self._globals['ma_window']).mean() result['ma_close'] = result['close'].rolling( self._globals['ma_window']).mean() result['ma_volume'] = result['volume'].rolling( self._globals['vma_window']).mean() result['ma_volume_long'] = result['volume'].rolling( self._globals['vma_window_long']).mean() result['ma_volume_delta'] = result[ 'ma_volume_long'] - result['ma_volume'] # Standard deviation related result['ma_std_close'] = result['close'].rolling( self._globals['ma_window']).std() result['std_pct_diff_close'] = result['pct_diff_close'].rolling( self._globals['ma_window']).std() result['bollinger_lband'] = volatility.bollinger_lband(result['close']) result['bollinger_hband'] = volatility.bollinger_lband(result['close']) result['bollinger_lband_indicator'] = volatility.bollinger_lband_indicator(result['close']) result['bollinger_hband_indicator'] = volatility.bollinger_hband_indicator(result['close']) # Rolling ranges result['amplitude'] = result['high'] - result['low'] _min = result['low'].rolling( self._globals['week']).min() _max = result['high'].rolling( self._globals['week']).max() result['amplitude_medium'] = abs(_min - _max) _min = result['low'].rolling( 2 * self._globals['week']).min() _max = result['high'].rolling( 2 * self._globals['week']).max() result['amplitude_long'] = abs(_min - _max) _min = result['volume'].rolling( self._globals['week']).min() _max = result['volume'].rolling( self._globals['week']).max() result['vol_amplitude'] = abs(_min - _max) _min = result['volume'].rolling( 2 * self._globals['week']).min() _max = result['volume'].rolling( 2 * self._globals['week']).max() result['vol_amplitude_long'] = abs(_min - _max) # Volume metrics result['force_index'] = volume.force_index( result['close'], result['volume']) result['negative_volume_index'] = volume.negative_volume_index( result['close'], result['volume']) result['ease_of_movement'] = volume.ease_of_movement( result['high'], result['low'], result['close'], result['volume']) result['acc_dist_index'] = volume.acc_dist_index( result['high'], result['low'], result['close'], result['volume']) result['on_balance_volume'] = volume.on_balance_volume( result['close'], result['volume']) result['on_balance_volume_mean'] = volume.on_balance_volume( result['close'], result['volume']) result['volume_price_trend'] = volume.volume_price_trend( result['close'], result['volume']) # Calculate the Stochastic values result['k'] = momentum.stoch( result['high'], result['low'], result['close'], n=self._globals['kwindow']) result['d'] = momentum.stoch_signal( result['high'], result['low'], result['close'], n=self._globals['kwindow'], d_n=self._globals['dwindow']) # Calculate the Miscellaneous values result['rsi'] = momentum.rsi( result['close'], n=self._globals['rsiwindow'], fillna=False) miscellaneous = math.Misc(self._ohlcv) result['proc'] = miscellaneous.proc(self._globals['proc_window']) # Calculate ADX result['adx'] = trend.adx( result['high'], result['low'], result['close'], n=self._globals['adx_window']) # Calculate MACD difference result['macd_diff'] = trend.macd_diff( result['close'], n_fast=self._globals['macd_sign'], n_slow=self._globals['macd_slow'], n_sign=self._globals['macd_sign']) # Create series for increasing / decreasing closes (Convert NaNs to 0) _result = np.nan_to_num(result['pct_diff_close'].values) _increasing = (_result >= 0).astype(int) * self._buy _decreasing = (_result < 0).astype(int) * self._sell result['increasing'] = _increasing + _decreasing # Stochastic subtraciton result['k_d'] = pd.Series(result['k'].values - result['d'].values) # Other indicators result['k_i'] = self._stochastic_indicator( result['k'], result['high'], result['low'], result['ma_close']) result['d_i'] = self._stochastic_indicator( result['d'], result['high'], result['low'], result['ma_close']) result['stoch_i'] = self._stochastic_indicator_2( result['k'], result['d'], result['high'], result['low'], result['ma_close']) result['rsi_i'] = self._rsi_indicator( result['rsi'], result['high'], result['low'], result['ma_close']) result['adx_i'] = self._adx_indicator(result['adx']) result['macd_diff_i'] = self._macd_diff_indicator(result['macd_diff']) result['volume_i'] = self._volume_indicator( result['ma_volume'], result['ma_volume_long']) # Create time shifted columns for step in range(1, self._ignore_row_count + 1): result['t-{}'.format(step)] = result['close'].shift(step) result['tpd-{}'.format(step)] = result[ 'close'].pct_change(periods=step) result['tad-{}'.format(step)] = result[ 'close'].diff(periods=step) # Mask increasing with result['increasing_masked'] = _mask( result['increasing'].to_frame(), result['stoch_i'], as_integer=True).values # Get class values for each vector classes = pd.DataFrame(columns=self._shift_steps) for step in self._shift_steps: # Shift each column by the value of its label if self._binary is True: # Classes need to be 0 or 1 (One hot encoding) classes[step] = ( result[self._label2predict].shift(-step) > 0).astype(int) else: classes[step] = result[self._label2predict].shift(-step) # classes[step] = result[self._label2predict].shift(-step) # Delete the firsts row of the dataframe as it has NaN values from the # .diff() and .pct_change() operations ignore = max(max(self._shift_steps), self._ignore_row_count) result = result.iloc[ignore:] classes = classes.iloc[ignore:] # Convert result to float32 to conserve memory result = result.astype(np.float32) # Return return result, classes
def calculate_Momentum_Indicators(): JSON_sent = request.get_json() df = pd.DataFrame(JSON_sent[0]) _, RSI, TSI, UO, STOCH, STOCH_SIGNAL, WR, AO, KAMA, ROC = JSON_sent indicator_RSI = RSIIndicator(close=df["close"], n=RSI['N']) df['rsi'] = indicator_RSI.rsi() if TSI['displayTSI']: indicator_TSI = TSIIndicator(close=df["close"], r=TSI['rTSI'], s=TSI['sTSI']) df['tsi'] = indicator_TSI.tsi() if UO['displayUO']: indicator_UO = uo(high=df['high'], low=df['low'], close=df['close'], s=UO['sForUO'], m=UO['mForUO'], len=UO['lenForUO'], ws=UO['wsForUO'], wm=UO['wmForUO'], wl=UO['wlForUO']) df['uo'] = indicator_UO if STOCH['displaySTOCH']: indicator_Stoch = stoch(high=df['high'], low=df['low'], close=df['close'], n=STOCH['nForSTOCH'], d_n=STOCH['dnForSTOCH']) df['stoch'] = indicator_Stoch if STOCH_SIGNAL['displayStochSignal']: indicator_StochSignal = stoch_signal( high=df['high'], low=df['low'], close=df['close'], n=STOCH_SIGNAL['nForStochSignal'], d_n=STOCH_SIGNAL['dnForStochSignal']) df['stoch_signal'] = indicator_StochSignal if WR['displayWR']: indicator_wr = wr(high=df['high'], low=df['low'], close=df['close'], lbp=WR['lbpForWR']) df['wr'] = indicator_wr if AO['displayAO']: indicator_ao = ao(high=df['high'], low=df['low'], s=AO['sForAO'], len=AO['lenForAO']) df['ao'] = indicator_ao if KAMA['displayKama']: indicator_kama = kama(close=df['close'], n=KAMA['nForKama'], pow1=KAMA['pow1ForKama'], pow2=KAMA['pow2ForKama']) df['kama'] = indicator_kama if ROC['displayROC']: indicator_roc = roc(close=df['close'], n=ROC['nForROC']) df['roc'] = indicator_roc df.fillna(0, inplace=True) export_df = df.drop(columns=['open', 'high', 'low', 'close', 'volume']) return (json.dumps(export_df.to_dict('records')))
def add_sto(df): df['sto_%K'] = momentum.stoch(df['high'], df['low'], df['close'], n=14, fillna=False) df['sto_%D'] = momentum.stoch_signal(df['high'], df['low'], df['close'], n=14, d_n=3, fillna=False) return df
on_squeeze = [] outof_squeeze = [] with open('ticker.csv') as f: lines = f.read().splitlines() for symbol in lines: print(symbol) data = yf.download(symbol, start="2020-01-01", end=datetime.today().strftime('%Y-%m-%d')) df = pd.DataFrame(data) RSI = RSIIndicator(close=df['Close'], n=7) df["RSI"] = RSI.rsi() Stochk = stoch(high=df["High"], low=df["Low"], close=df["Close"]).rolling(window=3).mean() df["Stochk"] = Stochk MACD = md(close=df['Close']) df["MACD_diff"] = MACD.macd_diff() AvgTru = atr(high=df['High'], low=df['Low'], close=df['Close'], n=7) df["ATR"] = AvgTru.average_true_range() df["Signal"] = "" df['20sma'] = df['Close'].rolling(window=20).mean() df['stddev'] = df['Close'].rolling(window=20).std() df['lower_band'] = df['20sma'] - (2 * df['stddev']) df['upper_band'] = df['20sma'] + (2 * df['stddev'])