Estoy tratando de usar Python (con Pandas) para calcular los promedios móviles exponenciales (EMA) de 20 días de datos de acciones diarias para Intel (INTC). Pandas tiene varias formas de hacer esto, y también probé stockstats, que se ejecuta en Pandas, pero nunca devuelven la misma EMA que obtengo de los sitios web de acciones/finanzas.
Revisé dos veces los precios de cierre y coinciden, pero la EMA siempre sale "incorrecta".
Este es el CSV que estoy usando: INTC Stock Data
Contiene la fecha diaria, el nombre del mes, la apertura, el máximo, el mínimo, el cierre, el promedio diario y el volumen de las acciones de Intel (Ticker: INTC) del 20/04/2016 al 01/02/2018.
Cuando miro a los sitios web de acciones más grandes como MarketWatch o Fidelity , sus números no coinciden con los míos. Ellos coinciden entre sí , pero no conmigo.
Por ejemplo...
df2['Close'].ewm(span=20,min_periods=0,adjust=False,ignore_na=False).mean()o...
df2['Close'].ewm(span=20, min_periods=20, adjust=True).mean()o...
df2["Close"].shift().fillna(df["Close"]).ewm(com=1, adjust=False).mean()Dame EMA para el 1/2/2018 como $ 44.71, $ 47.65, $ 46.15, etc. cuando el EMA real de 20 días en cualquier sitio de finanzas es $ 45.65. Y obtengo los números incorrectos sin importar la fecha para la que intente calcular la EMA. Incluso está mal cuando solo trato de EMA de 5 días.
He leído, visto y seguido tutoriales sobre el tema, pero sus resultados tampoco coinciden con los EMA aceptados/publicados que encontraría en cualquier sitio de finanzas. Las personas que crean los tutoriales y los videos simplemente nunca los comparan entre sí después de que Panda calcula los números. Y necesito que mis números coincidan.
¿Cómo llego a las mismas cifras que todos los demás sitios de finanzas en Internet obtienen para los EMA? No creo que esto tenga nada que ver con los precios de cierre ajustados porque estoy usando datos antiguos/establecidos y mis precios y fechas de cierre son los mismos que los de ellos.
Ordene el DataFrame para que las fechas estén en orden creciente. Dado que sus datos están en orden decreciente por fecha, si no ordena las fechas primero, su cálculo de ewm pondera exponencialmente las fechas más tempranas , en lugar de la fecha más reciente (como debería ser).
import pandas as pd df = pd.read_csv('intc_data.txt', parse_dates=['Date'], index_col=['Date']) df['backward_ewm'] = df['Close'].ewm(span=20,min_periods=0,adjust=False,ignore_na=False).mean() df = df.sort_index() df['ewm'] = df['Close'].ewm(span=20,min_periods=0,adjust=False,ignore_na=False).mean() print(df[['ewm', 'backward_ewm']].tail())rendimientos
ewm backward_ewm Date 2018-01-26 45.370936 48.205638 2018-01-29 45.809895 48.008337 2018-01-30 46.093714 47.800794 2018-01-31 46.288599 47.696667 2018-02-01 46.418256 47.650000Esto está de acuerdo con Marketwatch , que dice que el EWMA (20) el 2018-02-01 fue 46.42.
Sugiero usar Pandas TA para calcular indicadores técnicos en python. Lo encuentro más preciso y tiene muchos más indicadores que los que vienen con pandas.
Usando Pandas TA, el promedio móvil exponencial de 20 períodos se calcula como:
import pandas_ta as ta data["EMA20"] = ta.ema(df2["Close"], length=20)