Source code for babao.utils.indicators
"""
Various indicators which can be added to any serie
//www.quantinsti.com/blog/build-technical-indicators-in-python
"""
import sys
[docs]def sma(serie, look_back_delay):
"""Simple Moving Average"""
return serie.rolling(
window=int(look_back_delay),
center=False
).mean()
[docs]def ewma(serie, look_back_delay):
"""Exponentially-weighted Moving Average"""
return serie.ewm(
span=int(look_back_delay),
min_periods=int(look_back_delay) - 1,
adjust=True,
ignore_na=False
).mean()
[docs]def macd(serie, fast_delay, slow_delay, signal_delay, full=False):
"""Moving Average Convergence/Divergence Oscillator"""
macd_line = ewma(serie, fast_delay) - ewma(serie, slow_delay)
signal_line = ewma(macd_line, signal_delay)
if full:
return macd_line, signal_line, macd_line - signal_line
return macd_line - signal_line
[docs]def ppo(serie, fast_delay, slow_delay, signal_delay, full=False):
"""
Percentage Price Oscillator
Same as macd, but we do (a-b)/b instead of a-b,
so the final value does not depend on input scale (it's a percentage!)
"""
lag_line = ewma(serie, slow_delay)
ppo_line = (ewma(serie, fast_delay) - lag_line) / lag_line
signal_line = ewma(ppo_line, signal_delay)
if full:
return ppo_line, signal_line, ppo_line - signal_line
return ppo_line - signal_line
[docs]def get(df, columns):
"""
Add indicators specified by columns to the given df
Expected ´columns´ format: ["sma_vwap_42", "ewma_volume_12"]
"""
for indic_col in columns:
a = indic_col.split("_")
fun, args = a[0], (df[a[1]], *tuple(a[2:]))
df[indic_col] = getattr(sys.modules[__name__], fun)(*args)
return df