11 votos

Calculando correctamente la banda de Bollinger

Mi banda de bollinger sale como la de abajo, lo que no parece correcto. ¿Alguna idea de lo que está mal con mi código para calcular las bandas de bollinger superiores e inferiores?

Obtuve mis datos de aquí

start, end = dt.datetime(1976, 1, 1), dt.datetime(2013, 12, 31)
sp = web.DataReader('^GSPC','yahoo', start, end) 
here are my bollinger calculations

cálculo para la banda de bollinger

ave = pd.stats.moments.rolling_mean(self[name], window) 
std = pd.stats.moments.rolling_std(self[name], window)
self['upper'] = ave + (2 * std)
self['lower'] = ave - (2 * std)

enter image description here

0 votos

No estoy en python pero parece que tu serie temporal promedio (ave) no se ve bien en relación a "SP", al menos ave no converge con "SP".

0 votos

Tal vez trate de trazar ave para ver dónde está, y tal vez en una parcela diferente de la ventana std para ver su tamaño. Proporcionar un código completo también podría ser útil.

2 votos

@Bach Secundo la recomendación de aportar más código (o quizás una versión simplificada que pueda reproducir la trama desde cero).

17voto

En Pandas 0.19.2++:

def Bolinger_Bands(stock_price, window_size, num_of_std):

    rolling_mean = stock_price.rolling(window=window_size).mean()
    rolling_std  = stock_price.rolling(window=window_size).std()
    upper_band = rolling_mean + (rolling_std*num_of_std)
    lower_band = rolling_mean - (rolling_std*num_of_std)

    return rolling_mean, upper_band, lower_band

def main():

     price_series = get_data(ticker, dates) # it is a Pandas series...

     rolling_avg_price, upper_band, lower_band = Bolinger_Bands(price_series, 20, 2)

     do_other_processing(rolling_avg_price, upper_band, lower_band)
     ...

0 votos

el nombre correcto es Bollinger

11voto

Eric Puntos 130
def bbands(price, length=30, numsd=2):
    """ returns average, upper band, and lower band"""
    ave = pd.stats.moments.rolling_mean(price,length)
    sd = pd.stats.moments.rolling_std(price,length)
    upband = ave + (sd*numsd)
    dnband = ave - (sd*numsd)
    return np.round(ave,3), np.round(upband,3), np.round(dnband,3)

sp['ave'], sp['upper'], sp['lower'] = bbands(sp.Close, length=30, numsd=1)
sp= sp[-200:]
sp.plot()

enter image description here

3 votos

Estadísticas de pandas obsoletas. He utilizado ave = price.rolling(window=20, center=False).mean() y sd = price.rolling(window=20,center=False).std()

10voto

exclucid Puntos 1

Creo que las respuestas dadas aquí son incorrectas ya que devuelven la desviación estándar de la muestra mientras que la medida de la población es el cálculo correcto para las bandas de Bollinger. Las bandas utilizando el cálculo de la muestra serán demasiado anchas. Pandas no parece permitir una elección entre los cálculos de la muestra y de la población para ninguna de las soluciones presentadas aquí.

sd = pd.stats.moments.rolling_std(price,length)
rolling_std  = stock_price.rolling(window=window_size).std()

Numpy sí permite una elección, por lo que debería usarse hasta que se presente una solución adecuada de pandas.

a = np.array([1,2,3,4,5])
print np.std(a, ddof=1) # sample
print np.std(a, ddof=0) # population
>>> 
1.58113883008
1.41421356237
>>> 

https://docs.scipy.org/doc/numpy/reference/generated/numpy.std.html

John Bollinger, CFA, CMT

Bueno, parece que los pandas me han alcanzado. Esto funciona correctamente ahora.

b = pd.DataFrame([1,2,3,4,5])
print b.rolling(window=5).std() # sample
print b.rolling(window=5).std(ddof=0) # population

0 votos

Esto es correcto. Debería basarse en la población. Estaba tratando de averiguar por qué mi cálculo no coincidiría con tradingview, y esto era por qué.

2voto

Tony Lee Puntos 3388

Trate de trazar la media móvil contra sus comillas para SP y ver si tiene sentido. Aunque tu línea de código para calcular la media móvil es correcta, puede que haya algo mal en los datos que pasas como entrada.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X