def add_volatility_indicators(data: pd.DataFrame) -> pd.DataFrame: """Adds the volatility 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. """ bb = BollingerBands(data['close']) data.loc[:, 'bollinger_hband'] = bb.bollinger_hband() data.loc[:, 'bollinger_hband_indicator'] = bb.bollinger_hband_indicator() data.loc[:, 'bollinger_lband'] = bb.bollinger_lband() data.loc[:, 'bollinger_lband_indicator'] = bb.bollinger_lband_indicator() data.loc[:, 'bollinger_mavg'] = bb.bollinger_mavg() data.loc[:, 'bollinger_pband'] = bb.bollinger_pband() data.loc[:, 'bollinger_wband'] = bb.bollinger_wband() return data
def get_signal(self, input_df, ticker, run_id): df = input_df.copy() indicator_bb = BollingerBands( close=df["Close"], window=self.indicator["window"], window_dev=self.indicator["window_dev"], fillna=self.indicator["fillna"], ) # Add Bollinger Bands features df["bb_bbm"] = indicator_bb.bollinger_mavg() df["bb_bbh"] = indicator_bb.bollinger_hband() df["bb_bbl"] = indicator_bb.bollinger_lband() df["bb_bbhi"] = indicator_bb.bollinger_hband_indicator() df["bb_bbli"] = indicator_bb.bollinger_lband_indicator() df["bb_bbp"] = indicator_bb.bollinger_pband() row = df.iloc[-1] if row.bb_bbhi.item(): sell_signal = { "ticker": ticker, "datetime": row.Date, "indicator": self.name, "param": self.param, "reason": "High BollingerBand percentage - currently at {}%".format( int(row.bb_bbp.item() * 100.0)), "image": self.draw_image(df, ticker, run_id), } else: sell_signal = None if row.bb_bbli.item(): buy_signal = { "ticker": ticker, "datetime": row.Date, "indicator": self.name, "param": self.param, "reason": "Low BollingerBand percentage - currently at {}%".format( int(row.bb_bbp.item() * 100.0)), "image": self.draw_image(df, ticker, run_id), } else: buy_signal = None return buy_signal, sell_signal
def AddIndicators(df): # Add Simple Moving Average (SMA) indicators df["sma7"] = SMAIndicator(close=df["Close"], window=7, fillna=True).sma_indicator() df["sma25"] = SMAIndicator(close=df["Close"], window=25, fillna=True).sma_indicator() df["sma99"] = SMAIndicator(close=df["Close"], window=99, fillna=True).sma_indicator() # Add Bollinger Bands indicator indicator_bb = BollingerBands(close=df["Close"], window=20, window_dev=2) df['bb_bbm'] = indicator_bb.bollinger_mavg() df['bb_bbh'] = indicator_bb.bollinger_hband() df['bb_bbl'] = indicator_bb.bollinger_lband() # Add Parabolic Stop and Reverse (Parabolic SAR) indicator indicator_psar = PSARIndicator(high=df["High"], low=df["Low"], close=df["Close"], step=0.02, max_step=2, fillna=True) df['psar'] = indicator_psar.psar() # Add Moving Average Convergence Divergence (MACD) indicator df["MACD"] = macd(close=df["Close"], window_slow=26, window_fast=12, fillna=True) # mazas # Add Relative Strength Index (RSI) indicator df["RSI"] = rsi(close=df["Close"], window=14, fillna=True) # mazas return df
def add_volatility_ta(df: pd.DataFrame, high: str, low: str, close: str, fillna: bool = False, colprefix: str = "") -> pd.DataFrame: """Add volatility 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. """ # Average True Range df[f'{colprefix}volatility_atr'] = AverageTrueRange( close=df[close], high=df[high], low=df[low], n=10, fillna=fillna).average_true_range() # Bollinger Bands indicator_bb = BollingerBands(close=df[close], n=20, ndev=2, fillna=fillna) df[f'{colprefix}volatility_bbm'] = indicator_bb.bollinger_mavg() df[f'{colprefix}volatility_bbh'] = indicator_bb.bollinger_hband() df[f'{colprefix}volatility_bbl'] = indicator_bb.bollinger_lband() df[f'{colprefix}volatility_bbw'] = indicator_bb.bollinger_wband() df[f'{colprefix}volatility_bbhi'] = indicator_bb.bollinger_hband_indicator( ) df[f'{colprefix}volatility_bbli'] = indicator_bb.bollinger_lband_indicator( ) # Keltner Channel indicator_kc = KeltnerChannel(close=df[close], high=df[high], low=df[low], n=10, fillna=fillna) df[f'{colprefix}volatility_kcc'] = indicator_kc.keltner_channel_central() df[f'{colprefix}volatility_kch'] = indicator_kc.keltner_channel_hband() df[f'{colprefix}volatility_kcl'] = indicator_kc.keltner_channel_lband() df[f'{colprefix}volatility_kchi'] = indicator_kc.keltner_channel_hband_indicator( ) df[f'{colprefix}volatility_kcli'] = indicator_kc.keltner_channel_lband_indicator( ) # Donchian Channel indicator_dc = DonchianChannel(close=df[close], n=20, fillna=fillna) df[f'{colprefix}volatility_dcl'] = indicator_dc.donchian_channel_lband() df[f'{colprefix}volatility_dch'] = indicator_dc.donchian_channel_hband() df[f'{colprefix}volatility_dchi'] = indicator_dc.donchian_channel_hband_indicator( ) df[f'{colprefix}volatility_dcli'] = indicator_dc.donchian_channel_lband_indicator( ) return df
def AddIndicators(df): # Add Bollinger Bands indicator indicator_bb = BollingerBands(close=df["Close"], window=20, window_dev=2) df['bb_bbm'] = indicator_bb.bollinger_mavg() df['bb_bbh'] = indicator_bb.bollinger_hband() df['bb_bbl'] = indicator_bb.bollinger_lband() return df
class TestBollingerBands(unittest.TestCase): """ https://school.stockcharts.com/doku.php?id=technical_indicators:bollinger_bands """ _filename = 'ta/tests/data/cs-bbands.csv' def setUp(self): self._df = pd.read_csv(self._filename, sep=',') self._indicator = BollingerBands(close=self._df['Close'], n=20, ndev=2, fillna=False) def tearDown(self): del (self._df) def test_mavg(self): target = 'MiddleBand' result = self._indicator.bollinger_mavg() pd.testing.assert_series_equal(self._df[target].tail(), result.tail(), check_names=False) def test_hband(self): target = 'HighBand' result = self._indicator.bollinger_hband() pd.testing.assert_series_equal(self._df[target].tail(), result.tail(), check_names=False) def test_lband(self): target = 'LowBand' result = self._indicator.bollinger_lband() pd.testing.assert_series_equal(self._df[target].tail(), result.tail(), check_names=False) def test_wband(self): target = 'WidthBand' result = self._indicator.bollinger_wband() pd.testing.assert_series_equal(self._df[target].tail(), result.tail(), check_names=False) def test_hband_indicator(self): target = 'CrossUp' result = self._indicator.bollinger_hband_indicator() pd.testing.assert_series_equal(self._df[target].tail(), result.tail(), check_names=False) def test_lband_indicator(self): target = 'CrossDown' result = self._indicator.bollinger_lband_indicator() pd.testing.assert_series_equal(self._df[target].tail(), result.tail(), check_names=False)
def bollinger_bands(df): indicator_bb = BollingerBands(close=df["Close"]) df['bb_bbh'] = indicator_bb.bollinger_hband() df['bb_bbl'] = indicator_bb.bollinger_lband() df['bb_avg'] = indicator_bb.bollinger_mavg() df['bb_bbh_ind'] = indicator_bb.bollinger_hband_indicator() df['bb_bbl_ind'] = indicator_bb.bollinger_lband_indicator() df['bb_pband'] = indicator_bb.bollinger_pband() df['bb_wband'] = indicator_bb.bollinger_wband()
def bollinger_bands(data, days=20, std=2, price="Close"): df = data # Initialize Bollinger Bands Indicator indicator_bb = BollingerBands(close=df[price], window=days, window_dev=std) # Add Bollinger Bands features df["bb_ma"] = indicator_bb.bollinger_mavg() df["bb_high"] = indicator_bb.bollinger_hband() df["bb_low"] = indicator_bb.bollinger_lband() # Add Bollinger Band high indicator df["bb_bbhi"] = indicator_bb.bollinger_hband_indicator() # Add Bollinger Band low indicator df["bb_bbli"] = indicator_bb.bollinger_lband_indicator() return df
def analysis(df, ma_f, ma_s, period): df["ema_f"] = ta.ema(high=df.high, low=df.low, close=df.close, length=ma_f) df["ema_s"] = ta.ema(high=df.high, low=df.low, close=df.close, length=ma_s) df.fillna(0, inplace=True) df['s'] = (df['ema_s'] - df['ema_s'].shift(1)) >= 0 df['f'] = (df['ema_f'] - df['ema_f'].shift(1)) >= 0 df['buy_ema'] = df['ema_f'] > df['ema_s'] df['sell_ema'] = df['ema_f'] <= df['ema_s'] df['buy_change'] = (df['buy_ema'] != df['buy_ema'].shift(1)) & df['buy_ema'] df['sell_change'] = (df['sell_ema'] != df['sell_ema'].shift(1)) & df['sell_ema'] # df["RSI"] = ta.rsi(high=df.high, low=df.low, close=df.close, length=period) # df['RSIs'] = (df['RSI'] - df['RSI'].shift(1)) >= 0 # df['RSI_ups'] = df.groupby( # (df['RSIs'] != df['RSIs'].shift(1)).cumsum()).cumcount() + 1 # df['adx'] = ta.adx(high=df.high, low=df.low, close=df.close, length=period)['ADX_%s' % period] # df['adx_s'] = (df['adx'] - df['adx'].shift(1)) >= 0 # df['adx_ups'] = df.groupby( # (df['adx_s'] != df['adx_s'].shift(1)).cumsum()).cumcount() + 1 # df['ATR'] = df.ta.atr() indicator_bb = BollingerBands(close=df.close, window=10, window_dev=1.8) df['bb_bbm'] = indicator_bb.bollinger_mavg() df['b_m'] = (df['bb_bbm'] - df['bb_bbm'].shift(1)) >= 0 df['bb_bbh'] = indicator_bb.bollinger_hband() df['bb_bbl'] = indicator_bb.bollinger_lband() df['bb_bbhi'] = indicator_bb.bollinger_hband_indicator() df['bb_bbli'] = indicator_bb.bollinger_lband_indicator() df['pvt'] = ta.pvt(close=df.close, volume=df.volume) df['pvt_t'] = (df['pvt'] - df['pvt'].shift(1)) >= 0 df['close_variation'] = df['close'] - df['close'].shift(1) # # df = ema(df, ma_f, ma_s) df = rsi(df, period) df = momentum(df) df['trend'] = df['momentum_s'] & df['RSIs'] return df
def transform_one(self, entity_id, df: pd.DataFrame) -> pd.DataFrame: indicator_bb = BollingerBands(close=df["close"], window=20, window_dev=2) # Add Bollinger Bands features df["bb_bbm"] = indicator_bb.bollinger_mavg() df["bb_bbh"] = indicator_bb.bollinger_hband() df["bb_bbl"] = indicator_bb.bollinger_lband() # Add Bollinger Band high indicator df["bb_bbhi"] = indicator_bb.bollinger_hband_indicator() # Add Bollinger Band low indicator df["bb_bbli"] = indicator_bb.bollinger_lband_indicator() # Add Width Size Bollinger Bands df["bb_bbw"] = indicator_bb.bollinger_wband() # Add Percentage Bollinger Bands df["bb_bbp"] = indicator_bb.bollinger_pband() return df
def get_bollinger_bands(config, crypto): close_prices = crypto.prices dataframe = crypto.technical_indicators window = 20 indicator_bb = BollingerBands(close=close_prices, window=window, window_dev=2) dataframe['Bollinger_Bands_Middle'] = indicator_bb.bollinger_mavg() dataframe['Bollinger_Bands_Upper'] = indicator_bb.bollinger_hband() dataframe['Bollinger_Bands_Lower'] = indicator_bb.bollinger_lband() generate_buy_sell_signals( lambda x, signal: signal['Close'].values[x] < signal[ 'Bollinger_Bands_Lower'].values[x], lambda x, signal: signal[ 'Close'].values[x] > signal['Bollinger_Bands_Upper'].values[x], dataframe, 'Bollinger_Bands') return dataframe
def GetPriceDataFromExchangeFinnHub(event, context): retVal = {} retVal["data"] = [] # For debugging the input, write the EVENT to CloudWatch logs print(json.dumps(event)) # Data is sent to Lambda via a HTTPS POST call. We want to get to the payload send by Snowflake event_body = event["body"] payload = json.loads(event_body) for row in payload["data"]: sflkRowRef = row[ 0] # This is how Snowflake keeps track of data as it gets returned symbol = row[ 1] # The data passed in from Snowflake that the input row contains. fromDate = row[2] toDate = row[3] # Will return URL without token to Snowflake for tracking URL = f'https://finnhub.io/api/v1/stock/candle?symbol={symbol}&resolution=D&from={fromDate}&to={toDate}' # Add our FinnHubAPI Key to the end of the URL. # This is in a new variable which will not be returned to Snowflake URLWithToken = f'{URL}&token={FinnHubAPI.TOKEN}' # GET data from the API httpData = requests.get(url=URLWithToken).json() # Convert to Pandas DataFrame df = pd.DataFrame(httpData) # Add the column names print("Adding column names") df.columns = [ "Close", "High", "Low", "Open", "Status", "OpenTime", "Volume" ] # Set DateTime columns to correct type df['OpenTime'] = pd.to_datetime(df['OpenTime'], unit='ms') df['Open'] = df['Open'].astype(float) df['High'] = df['High'].astype(float) df['Low'] = df['Low'].astype(float) df['Close'] = df['Close'].astype(float) df['Volume'] = df['Volume'].astype(float) # Clean NaN values print("Cleaning NA values") df = dropna(df) # Calculate the Bollinger Bands indicator indicator_bb = BollingerBands(close=df["Close"], n=20, ndev=2) df['bb_bbm'] = indicator_bb.bollinger_mavg() df['bb_bbh'] = indicator_bb.bollinger_hband() df['bb_bbl'] = indicator_bb.bollinger_lband() df['bb_bbhi'] = indicator_bb.bollinger_hband_indicator() df['bb_bbli'] = indicator_bb.bollinger_lband_indicator() df['bb_bbw'] = indicator_bb.bollinger_wband() df['bb_bbp'] = indicator_bb.bollinger_pband() print("converting OHLC pandas to JSON. This does it as a string") buffer = df.to_json(orient="records") print("Interpret the JSON string into a dictionary for output") jsonResponse = json.loads(buffer) # Prepare the output response response = {} response["url"] = URL response["response"] = jsonResponse retVal["data"].append([sflkRowRef, response]) # For debugging the output, write the RETurn VALue to CloudWatch logs # print(json.dumps(retVal)) return retVal
def handle(self, *args, **options): # import pdb # pdb.set_trace() if not options['update']: NSETechnical.objects.all().delete() symbols = Symbol.objects.all() for symbol in symbols: nse_history_data = NSEHistoricalData.objects.filter( symbol__symbol_name=symbol).order_by('timestamp') if not nse_history_data: continue nse_technical = pd.DataFrame( list( nse_history_data.values('timestamp', 'open', 'high', 'low', 'close', 'total_traded_quantity'))) ''' Moving average convergence divergence ''' indicator_macd = MACD(close=nse_technical['close'], window_slow=26, window_fast=12, window_sign=9, fillna=False) nse_technical["trend_macd"] = indicator_macd.macd() nse_technical["trend_macd_signal"] = indicator_macd.macd_signal() nse_technical["trend_macd_diff"] = indicator_macd.macd_diff() ''' Simple Moving Average ''' nse_technical["trend_sma_fast"] = SMAIndicator( close=nse_technical['close'], window=12, fillna=False).sma_indicator() nse_technical["trend_sma_slow"] = SMAIndicator( close=nse_technical['close'], window=26, fillna=False).sma_indicator() ''' Exponential Moving Average ''' nse_technical["trend_ema_fast"] = EMAIndicator( close=nse_technical['close'], window=12, fillna=False).ema_indicator() nse_technical["trend_ema_slow"] = EMAIndicator( close=nse_technical['close'], window=26, fillna=False).ema_indicator() ''' Ichimoku Indicator ''' indicator_ichi = IchimokuIndicator( high=nse_technical['high'], low=nse_technical['low'], window1=9, window2=26, window3=52, visual=False, fillna=False, ) nse_technical[ "trend_ichimoku_conv"] = indicator_ichi.ichimoku_conversion_line( ) nse_technical[ "trend_ichimoku_base"] = indicator_ichi.ichimoku_base_line() nse_technical["trend_ichimoku_a"] = indicator_ichi.ichimoku_a() nse_technical["trend_ichimoku_b"] = indicator_ichi.ichimoku_b() indicator_ichi_visual = IchimokuIndicator( high=nse_technical['high'], low=nse_technical['low'], window1=9, window2=26, window3=52, visual=True, fillna=False, ) nse_technical[ "trend_visual_ichimoku_a"] = indicator_ichi_visual.ichimoku_a( ) nse_technical[ "trend_visual_ichimoku_b"] = indicator_ichi_visual.ichimoku_b( ) ''' Bollinger Band ''' indicator_bb = BollingerBands(close=nse_technical['close'], window=20, window_dev=2, fillna=False) nse_technical["volatility_bbm"] = indicator_bb.bollinger_mavg() nse_technical["volatility_bbh"] = indicator_bb.bollinger_hband() nse_technical["volatility_bbl"] = indicator_bb.bollinger_lband() nse_technical["volatility_bbw"] = indicator_bb.bollinger_wband() nse_technical["volatility_bbp"] = indicator_bb.bollinger_pband() nse_technical[ "volatility_bbhi"] = indicator_bb.bollinger_hband_indicator() nse_technical[ "volatility_bbli"] = indicator_bb.bollinger_lband_indicator() ''' Accumulation Distribution Index ''' nse_technical["volume_adi"] = AccDistIndexIndicator( high=nse_technical['high'], low=nse_technical['low'], close=nse_technical['close'], volume=nse_technical['total_traded_quantity'], fillna=False).acc_dist_index() ''' Money Flow Index ''' nse_technical["volume_mfi"] = MFIIndicator( high=nse_technical['high'], low=nse_technical['low'], close=nse_technical['close'], volume=nse_technical['total_traded_quantity'], window=14, fillna=False, ).money_flow_index() ''' Relative Strength Index (RSI) ''' nse_technical["momentum_rsi"] = RSIIndicator( close=nse_technical['close'], window=14, fillna=False).rsi() ''' Stoch RSI (StochRSI) ''' indicator_srsi = StochRSIIndicator(close=nse_technical['close'], window=14, smooth1=3, smooth2=3, fillna=False) nse_technical["momentum_stoch_rsi"] = indicator_srsi.stochrsi() nse_technical["momentum_stoch_rsi_k"] = indicator_srsi.stochrsi_k() nse_technical["momentum_stoch_rsi_d"] = indicator_srsi.stochrsi_d() nse_technical.replace({np.nan: None}, inplace=True) nse_technical.replace([np.inf, -np.inf], None, inplace=True) list_to_create = [] list_to_update = [] for index in range(len(nse_history_data) - 1, -1, -1): data = nse_history_data[index] if data.technicals: break technical = NSETechnical( nse_historical_data=data, trend_macd=nse_technical['trend_macd'][index], trend_macd_signal=nse_technical['trend_macd_signal'] [index], trend_macd_diff=nse_technical['trend_macd_diff'][index], trend_sma_fast=nse_technical['trend_sma_fast'][index], trend_sma_slow=nse_technical['trend_sma_slow'][index], trend_ema_fast=nse_technical['trend_ema_fast'][index], trend_ema_slow=nse_technical['trend_ema_slow'][index], trend_ichimoku_conv=nse_technical['trend_ichimoku_conv'] [index], trend_ichimoku_base=nse_technical['trend_ichimoku_base'] [index], trend_ichimoku_a=nse_technical['trend_ichimoku_a'][index], trend_ichimoku_b=nse_technical['trend_ichimoku_b'][index], trend_visual_ichimoku_a=nse_technical[ 'trend_visual_ichimoku_a'][index], trend_visual_ichimoku_b=nse_technical[ 'trend_visual_ichimoku_b'][index], volatility_bbm=nse_technical['volatility_bbm'][index], volatility_bbh=nse_technical['volatility_bbh'][index], volatility_bbl=nse_technical['volatility_bbl'][index], volatility_bbw=nse_technical['volatility_bbw'][index], volatility_bbp=nse_technical['volatility_bbp'][index], volatility_bbhi=nse_technical['volatility_bbhi'][index], volatility_bbli=nse_technical['volatility_bbli'][index], volume_adi=nse_technical['volume_adi'][index], volume_mfi=nse_technical['volume_mfi'][index], momentum_rsi=nse_technical['momentum_rsi'][index], momentum_stoch_rsi=nse_technical['momentum_stoch_rsi'] [index], momentum_stoch_rsi_k=nse_technical['momentum_stoch_rsi_k'] [index], momentum_stoch_rsi_d=nse_technical['momentum_stoch_rsi_d'] [index]) data.technicals = True list_to_update.append(data) list_to_create.append(technical) NSETechnical.objects.bulk_create(list_to_create) NSEHistoricalData.objects.bulk_update(list_to_update, ['technicals']) print(f"Technicals updated for {symbol}")
def _bollinger_bands(self, df, close): bb = BollingerBands(close=close) df['bb_bbm'] = bb.bollinger_mavg() df['bb_bbh'] = bb.bollinger_hband() df['bb_bbl'] = bb.bollinger_lband()
features_considered = [ 'Close', 'Volume', 'MA_short', 'MA_long', 'Wilders_EMA', 'bb_bbm', 'bb_bbh', 'bb_bbl', 'bb_bbhi', 'bb_bbli' ] # features_considered = ['Close', 'MA_short', 'MA_long', 'Wilders_EMA'] # Initialize Bollinger Bands Indicator e = EquityData('data/SPY.csv', 'SPY') indicator_bb = BollingerBands(close=e.close(), n=20, ndev=2) e.data['MA_short'] = moving_average(e, window=history_size) e.data['MA_long'] = moving_average(e, window=5) e.data['Wilders_EMA'] = e.close().ewm(alpha=1 / history_size, adjust=False).mean() # Add Bollinger Bands features e.data['bb_bbm'] = indicator_bb.bollinger_mavg() e.data['bb_bbh'] = indicator_bb.bollinger_hband() e.data['bb_bbl'] = indicator_bb.bollinger_lband() # Add Bollinger Band high indicator e.data['bb_bbhi'] = indicator_bb.bollinger_hband_indicator() # Add Bollinger Band low indicator e.data['bb_bbli'] = indicator_bb.bollinger_lband_indicator() e.data = e.data[21:] EVALUATION_INTERVAL = int(e.data.shape[0] / BATCH_SIZE) * 2 features = e.data[features_considered] assert (list(features)[0] == 'Close') features.index = e.date() # features.plot(subplots=True) # plt.show()
def add_volatility_ta( df: pd.DataFrame, high: str, low: str, close: str, fillna: bool = False, colprefix: str = "", vectorized: bool = False, ) -> pd.DataFrame: """Add volatility 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 vectorized(bool): if True, use only vectorized functions indicators Returns: pandas.core.frame.DataFrame: Dataframe with new features. """ # Bollinger Bands indicator_bb = BollingerBands(close=df[close], window=20, window_dev=2, fillna=fillna) df[f"{colprefix}volatility_bbm"] = indicator_bb.bollinger_mavg() df[f"{colprefix}volatility_bbh"] = indicator_bb.bollinger_hband() df[f"{colprefix}volatility_bbl"] = indicator_bb.bollinger_lband() df[f"{colprefix}volatility_bbw"] = indicator_bb.bollinger_wband() df[f"{colprefix}volatility_bbp"] = indicator_bb.bollinger_pband() df[f"{colprefix}volatility_bbhi"] = indicator_bb.bollinger_hband_indicator( ) df[f"{colprefix}volatility_bbli"] = indicator_bb.bollinger_lband_indicator( ) # Keltner Channel indicator_kc = KeltnerChannel(close=df[close], high=df[high], low=df[low], window=10, fillna=fillna) df[f"{colprefix}volatility_kcc"] = indicator_kc.keltner_channel_mband() df[f"{colprefix}volatility_kch"] = indicator_kc.keltner_channel_hband() df[f"{colprefix}volatility_kcl"] = indicator_kc.keltner_channel_lband() df[f"{colprefix}volatility_kcw"] = indicator_kc.keltner_channel_wband() df[f"{colprefix}volatility_kcp"] = indicator_kc.keltner_channel_pband() df[f"{colprefix}volatility_kchi"] = indicator_kc.keltner_channel_hband_indicator( ) df[f"{colprefix}volatility_kcli"] = indicator_kc.keltner_channel_lband_indicator( ) # Donchian Channel indicator_dc = DonchianChannel(high=df[high], low=df[low], close=df[close], window=20, offset=0, fillna=fillna) df[f"{colprefix}volatility_dcl"] = indicator_dc.donchian_channel_lband() df[f"{colprefix}volatility_dch"] = indicator_dc.donchian_channel_hband() df[f"{colprefix}volatility_dcm"] = indicator_dc.donchian_channel_mband() df[f"{colprefix}volatility_dcw"] = indicator_dc.donchian_channel_wband() df[f"{colprefix}volatility_dcp"] = indicator_dc.donchian_channel_pband() if not vectorized: # Average True Range df[f"{colprefix}volatility_atr"] = AverageTrueRange( close=df[close], high=df[high], low=df[low], window=10, fillna=fillna).average_true_range() # Ulcer Index df[f"{colprefix}volatility_ui"] = UlcerIndex( close=df[close], window=14, fillna=fillna).ulcer_index() return df
from keras.layers import Conv1D, MaxPool1D, Bidirectional, LSTM, Dropout, TimeDistributed from keras.layers import Dense, GlobalAveragePooling2D from ta.trend import IchimokuIndicator from sklearn.linear_model import LinearRegression from ta import add_all_ta_features from ta.utils import dropna import matplotlib.pyplot as plt filename = 'AAPL' stock = pd.read_csv('Data/' + filename + '.csv') indicator_bb = BollingerBands(close=stock["Close"], n=20, ndev=2) macd = MACD(close=stock["Close"]) rsi = RSIIndicator(close=stock["Close"]) ichi = IchimokuIndicator(high=stock["High"], low=stock["Low"]) stock['macd'] = macd.macd() stock['rsi'] = rsi.rsi() stock['bb_bbm'] = indicator_bb.bollinger_mavg() stock['bb_bbh'] = indicator_bb.bollinger_hband() stock['bb_bbl'] = indicator_bb.bollinger_lband() stock['ichi_a'] = ichi.ichimoku_a() stock['ichi_b'] = ichi.ichimoku_b() stock['ichi_base'] = ichi.ichimoku_base_line() stock['ichi_conv'] = ichi.ichimoku_conversion_line() stock = stock.fillna(0) print(stock) scaler = preprocessing.MinMaxScaler() scaled_values = scaler.fit_transform(stock.iloc[:, 1:4]) stock.iloc[:, 1:4] = scaled_values y_scaler = preprocessing.MinMaxScaler() scaled_values = y_scaler.fit_transform( np.array(stock.iloc[:, 4]).reshape(-1, 1))
df['ppo'] = ppo_indicator.ppo() roc_indicator = ROCIndicator(close = df["Close"], window = 12, fillna = False) df['roc'] = roc_indicator.roc() macd_indicator = MACD(close = df["Close"], window_slow = 20, window_fast = 12, window_sign = 9, fillna = False) df['macd'] = macd_indicator.macd() rsi_indicator = RSIIndicator(close = df["Close"], window = 14, fillna = False) df['rsi'] = rsi_indicator.rsi() aroon_indicator = AroonIndicator(close = df["Close"], window = 20, fillna = False) df['aroon'] = aroon_indicator.aroon_indicator() boll_indicator = BollingerBands(close = df["Close"], window = 20, window_dev = 2, fillna = False) df['boll_mavg'] = boll_indicator.bollinger_mavg() df.rename(columns = {"Close": "price"}, inplace=True) prices = df['price'].to_numpy() df['day_of_month'] = df.index.day df['day_of_week'] = df.index.dayofweek df['month'] = df.index.month df.dropna(inplace=True) df = df.drop(df.columns[[0, 1, 2, 4, 5]], axis=1) X_columns = ['price', 'kama', 'ppo', 'roc', 'macd', 'rsi', 'aroon', 'boll_mavg', 'day_of_month', 'day_of_week', 'month'] X_data = df.filter(X_columns)
figure, axis = plt.subplots(4, 3) row = 0 column = 0 # Loop over the tickers for ticker in stock_data_biotech.columns: # Initalise the DataFrame data_plot = pd.DataFrame(stock_data_biotech[ticker]) # Initialize Bollinger Bands Indicator indicator_bb = BollingerBands(close=stock_data_biotech[ticker], window=20, window_dev=2) # Add Bollinger Bands features data_plot['bb_bbm'] = indicator_bb.bollinger_mavg() data_plot['bb_bbh'] = indicator_bb.bollinger_hband() data_plot['bb_bbl'] = indicator_bb.bollinger_lband() # Create the plot axis[row, column].plot(data_plot) axis[row, column].set_title(health_etfs_in_biotech[ticker]['long_name'], fontsize=6) axis[row, column].set_xticks([]) axis[row, column].set_yticks([]) # Count a column further column += 1 # If the column reaches the max, add another row if column == 3: