Código SuperTrend usando pandas python

Estoy tratando de codificar el siguiente algoritmo para el indicador SuperTrend en python usando pandas.

BASIC UPPERBAND = (HIGH + LOW) / 2 + Multiplier * ATR BASIC LOWERBAND = (HIGH + LOW) / 2 - Multiplier * ATR FINAL UPPERBAND = IF( (Current BASICUPPERBAND  Previous FINAL UPPERBAND)) THEN (Current BASIC UPPERBAND) ELSE Previous FINALUPPERBAND) FINAL LOWERBAND = IF( (Current BASIC LOWERBAND > Previous FINAL LOWERBAND) or (Previous Close < Previous FINAL LOWERBAND)) THEN (Current BASIC LOWERBAND) ELSE Previous FINAL LOWERBAND) SUPERTREND = IF((Previous SUPERTREND = Previous FINAL UPPERBAND) and (Current Close  Current FINAL UPPERBAND)) THEN Current FINAL LOWERBAND ELSE IF((Previous SUPERTREND = Previous FINAL LOWERBAND) and (Current Close >= Current FINAL LOWERBAND)) THEN Current FINAL LOWERBAND ELSE IF((Previous SUPERTREND = Previous FINAL LOWERBAND) and (Current Close < Current FINAL LOWERBAND)) THEN Current FINAL UPPERBAND 

Aquí está el código que escribí y probé:

 # Compute basic upper and lower bands df['basic_ub'] = (df['high'] + df['low']) / 2 + multiplier * df[atr] df['basic_lb'] = (df['high'] + df['low']) / 2 - multiplier * df[atr] # Compute final upper and lower bands for i in range(0, len(df)): if i < period: df.set_value(i, 'basic_ub', 0.00) df.set_value(i, 'basic_lb', 0.00) df.set_value(i, 'final_ub', 0.00) df.set_value(i, 'final_lb', 0.00) else: df.set_value(i, 'final_ub', (df.get_value(i, 'basic_ub') if df.get_value(i, 'basic_ub')  df.get_value(i-1, 'final_ub') else df.get_value(i-1, 'final_ub'))) df.set_value(i, 'final_lb', (df.get_value(i, 'basic_lb') if df.get_value(i, 'basic_lb') > df.get_value(i-1, 'final_lb') or df.get_value(i-1, 'close') < df.get_value(i-1, 'final_lb') else df.get_value(i-1, 'final_lb'))) # Set the Supertrend value for i in range(0, len(df)): if i < period: df.set_value(i, st, 0.00) else: df.set_value(i, 'st', (df.get_value(i, 'final_ub') if ((df.get_value(i-1, 'st') == df.get_value(i-1, 'final_ub')) and (df.get_value(i, 'close')  df.get_value(i, 'final_ub'))) else (df.get_value(i, 'final_lb') if ((df.get_value(i-1, 'st') == df.get_value(i-1, 'final_lb')) and (df.get_value(i, 'close') >= df.get_value(i, 'final_lb'))) else (df.get_value(i, 'final_ub') if((df.get_value(i-1, 'st') == df.get_value(i-1, 'final_lb')) and (df.get_value(i, 'close')  0.00), np.where((df['close'] < df['st']), 'down', 'up'), np.NaN) 

Yo trabajo, pero no estoy contento con el bucle for. ¿Alguien puede ayudar a optimizarlo?

Puedes encontrar el código publicado en Github !