The aim is to produce a plot like this. The orange line is your data, the green line is the upper "bollinger" band, the blue line is the lower "bollinger" band. The red dots indicate where your data is either above or below the bands.
Copy-paste this code:
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
N = 100
XMAX = 5
WINMA = 10
ALPHA = 2
def get_bollinger(data, winma=10, alpha=2):
ser = pd.Series(data)
ma = ser.rolling(winma).mean()
std = ser.rolling(winma).std()
lower = pd.Series(ma - alpha*std).fillna(method='bfill').values
upper = pd.Series(ma + alpha*std).fillna(method='bfill').values
return lower, upper
def get_alerts(data, lower, upper):
low = np.argwhere(data < lower)
high = np.argwhere(data > upper)
return low, high
if __name__=='__main__':
X = np.linspace(0.0, XMAX, num=N)
data = np.sin(X) + np.random.random(N)
lower, upper = get_bollinger(data, winma=WINMA, alpha=ALPHA)
low, high = get_alerts(data, lower, upper)
for i in low:
plt.plot(X[i], data[i], 'ro')
for i in high:
plt.plot(X[i], data[i], 'ro')
plt.plot(X, lower)
plt.plot(X, data)
plt.plot(X, upper)
plt.show()