Las medias móviles son indicadores de impulso utilizados en una variedad de campos, desde las ciencias naturales hasta el comercio en el mercado de valores. Estos cálculos miden el impulso en los valores observados durante un período de tiempo. Por ejemplo, la media móvil simple puede ayudar a señalar las inversiones de tendencia en el mercado de valores.
Introducción
Antes de adentrarnos en cómo calcular las medias móviles en Python, primero discutamos qué son. Las medias móviles son medidas de impulso a lo largo de una serie de valores observados. Estas medidas se realizan comúnmente en un subconjunto de valores dentro de un conjunto más grande. Este subconjunto, conocido como el período de retroceso, ofrece diferentes perspectivas funcionales según su valor.
Existen varios indicadores de medias móviles comunes, cada uno de los cuales tiene variaciones que utilizan varios períodos de retroceso. Los más comunes en el comercio de acciones son:
- Media Móvil Simple (SMA): Representa el valor promedio a lo largo de un período de n observaciones anteriores. Los períodos de retroceso comunes incluyen valores de 50, 100 y 200.
- Media Móvil Ponderada (WMA): Representa un promedio ponderado a lo largo de un período de n observaciones anteriores, donde cada observación recibe un peso diferente. Se utiliza como base para varias otras medias móviles.
- Media Móvil Exponencial (EMA): Representa un promedio ponderado a lo largo de un período de n observaciones anteriores, donde los valores más cercanos al más reciente reciben una consideración exponencialmente mayor.
Las medias móviles no solo vienen en una variedad de variaciones de ventana de retroceso, sino que también se pueden utilizar en conjunto con otros métodos estadísticos. Por ejemplo, los analistas técnicos utilizan las Bandas de Bollinger, que incorporan una media móvil simple que integra un período de ventana de retroceso de 9 a 21 días. Para obtener más información sobre las medias móviles, consulte nuestro artículo sobre el tema.
Cálculo de Medias Móviles en Python
Python se ha convertido en el lenguaje de programación líder para todo lo relacionado con datos. Esto incluye el aprendizaje automático, la estadística y el comercio algorítmico. Al igual que con cualquier lenguaje, Python puede utilizar la sintaxis nativa para calcular medias móviles.
Estas implementaciones pueden ser tediosas, no optimizadas y difíciles de escalar en grandes conjuntos de datos. Afortunadamente, bibliotecas como Pandas facilitan la implementación de indicadores técnicos. Veamos dos enfoques, ambos utilizando Pandas:
Método 1: DataFrames y Funciones Nativas de Pandas
Pandas es una biblioteca de computación potente. Viene con muchas funciones optimizadas para procesar datos. Aunque no ofrece soporte explícito para algunos indicadores más complejos, las medias móviles están dentro de su capacidad. Consideremos el siguiente enfoque para calcular la media móvil simple utilizando Pandas:
# importar yfinance para obtener datos de precios
import yfinance as yf
# Obtener historial de precios de 1 año para $NVDA
nvda = yf.Ticker('NVDA')
df = nvda.history(period='1y')[['Open', 'High', 'Low', 'Close', 'Volume']] # devuelve un objeto DataFrame de Pandas
# Resultado
print(df.head())
En la primera línea de código, especificamos el promedio de los 10 períodos anteriores de los valores de la columna "Close" (incluido el actual) que se utilizarán para calcular una media móvil en movimiento. Esto utiliza el método rolling
del DataFrame de Pandas. Observa el valor NaN en las primeras 9 filas de la nueva columna SMA_10. Esto se debe a que no había suficientes datos anteriores para realizar el cálculo.
Método 2: Usando la biblioteca pandas_ta
Pandas es una bestia cuando se trata de cálculos científicos. Ofrece una amplia gama de funciones estadísticas y matemáticas que se pueden utilizar para calcular casi cualquier cosa de manera eficiente. Sin embargo, Pandas no está diseñado para calcular indicadores técnicos y la sintaxis puede resultar incómoda para los operadores algorítmicos. Afortunadamente, la biblioteca pandas_ta se integra nativamente con los DataFrames y facilita la adición de indicadores técnicos. Consideremos el siguiente código que agrega las medias móviles simples de 5, 10 y 20 períodos calculadas a partir del precio de cierre diario:
# importar biblioteca requerida
import pandas_ta as ta
# Agregar indicadores utilizando datos anteriores
df.ta.sma(close='Close', length=5, append=True)
df.ta.sma(close='Close', length=10, append=True)
df.ta.sma(close='Close', length=20, append=True)
# Ver resultado
print(df.head())
Aquí hemos utilizado la integración nativa de pandas_ta con los DataFrames de Pandas a través del método DataFrame.ta
. Esto nos permite agregar fácilmente las medias móviles simples utilizando la función sma
de pandas_ta. Presta atención a nuestro uso del argumento append=True
. Sin esto, nuestro indicador recién calculado no se agregaría a nuestro DataFrame existente y se devolvería como un objeto Pandas.core.Series. Esto es bastante conveniente, pero se convierte en una pesadilla sintáctica al agregar muchos indicadores. Afortunadamente, pandas_ta tiene una clase Strategy para ayudar a facilitar un código más modular.
Conclusiones
Las medias móviles son excelentes herramientas para predecir cambios de impulso en los valores observados durante un período de tiempo. Hemos visto cómo Python puede facilitar el cálculo y la visualización de estos indicadores técnicos de manera que proporcionen información valiosa (y accionable). Por sí solas, las medias móviles suavizan la volatilidad para reflejar las tendencias de impulso.
Cuando se utilizan en conjunto o combinadas con otros métodos estadísticos, pueden convertirse en herramientas aún más poderosas para pronosticar y predecir resultados futuros. Por ejemplo, incorporar medias móviles como características en modelos de regresión lineal puede proporcionar una capacidad predictiva más sólida. Una vez que se comienza a diseñar características compuestas con múltiples medias móviles, el cielo puede ser el límite para mejorar la precisión predictiva.