¿Cómo trazar la media móvil ZLEMA con Python?

En este artículo vamos a explicar cómo calcular y trazar la media móvil ZLEMA (Zero Lag Exponential Moving Average), que es una variante de la media móvil exponencial diseñada para reducir el retraso. Este interesante indicador de análisis técnico presenta muchas de las ventajas de las medias móviles tradicionales, pero con mucho menos retraso en relación a la acción del precio. Es poco conocida y por eso no se encuentra en la mayoría de las plataformas de trading como Metatrader 4.
Básicamente, este código tiene las siguientes funciones:
- Implementa la fórmula del ZLEMA (Zero Lag Exponential Moving Average), que es una variante de la media móvil exponencial diseñada para reducir el retraso.
- Descarga datos históricos de Bitcoin usando la biblioteca yfinance.
- Calcula la media móvil ZLEMA para dos períodos diferentes (20 y 50 días)
- Crea un gráfico de precios con una visualización con:
- El precio de Bitcoin
- ZLEMA de 20 períodos
- ZLEMA de 50 períodos
Si tienen interés en obtener más información sobre la media móvil ZLEMA pueden consultar el siguiente artículo: La Media Móvil Exponencial de Retraso Cero (ZLEMA)
Código de la media móvil ZLEMA para Python
Como veremos el código es bastante simple y puede ser usado a conveniencia del lector sin ninguna restricción.
import pandas as pd import numpy as np import yfinance as yf import matplotlib.pyplot as plt def calculate_zlema(data, period): """ Calcula el Zero Lag Exponential Moving Average (ZLEMA) Parameters: data (pandas.Series): Serie de precios period (int): Período para el cálculo del ZLEMA Returns: pandas.Series: Serie con los valores del ZLEMA """ lag = (period - 1) // 2 ema_data = 2 * data - data.shift(lag) zlema = ema_data.ewm(span=period, adjust=False).mean() return zlema # Descargar datos de Bitcoin btc = yf.download('BTC-USD', start='2023-01-01', end='2024-01-12') # Calcular ZLEMA para diferentes períodos zlema_20 = calculate_zlema(btc['Close'], 20) zlema_50 = calculate_zlema(btc['Close'], 50) # Crear el gráfico plt.figure(figsize=(12, 6)) plt.plot(btc.index, btc['Close'], label='Precio BTC', alpha=0.7) plt.plot(btc.index, zlema_20, label='ZLEMA 20', linewidth=2) plt.plot(btc.index, zlema_50, label='ZLEMA 50', linewidth=2) plt.title('Bitcoin - Precio y ZLEMA') plt.xlabel('Fecha') plt.ylabel('Precio (USD)') plt.legend() plt.grid(True) plt.tight_layout() # Mostrar el gráfico plt.show()
El código usa 4 librerías bastante conocidas y utilizadas en la comunidad de Python:
- pandas: Es una librería diseñada para el manejo y ordenamiento de grandes cantidades de datos, como por ejemplo los datos de precios usados en los cálculos.
- numpy: Es una librería que usa pandas como apoyo para el manejo de datos.
- yfinance: Esta librería obtiene los datos de precios de los activos del mercado que queremos analizar usando los datos del mercado de Yahoo Finance.
- matplotlib: Esta librería permite trazar gráficos y otros tipos de visualizaciones usando los datos de precios y de los indicadores calculados a partir de estos.
Una vez que corremos el indicador aparece el siguiente gráfico con el precio de Bitcoin y las dos ZLEMA:
A continuación vamos a explicar el código:
La función calculate_zlema (la más importante del código) implementa el indicador ZLEMA que reduce el retraso típico de las medias móviles exponenciales. Lo hace así:
- Calcula el retraso como (periodo – 1) // 2
- Aplica la fórmula: 2 * precio_actual – precio_retrasado
- Calcula la media exponencial sobre esos datos
El resto del código:
- Descarga datos de Bitcoin usando yfinance
- Calcula ZLEMA para períodos de 20 y 50 días
- Crea un gráfico con 3 líneas: precio de Bitcoin y las dos ZLEMA
La ventaja del ZLEMA es que reacciona más rápido a los cambios de precio que un EMA tradicional, lo que puede ser útil para detectar cambios de tendencia.
Recomendaciones
- No debe usarse la ZLEMA como indicador único para la toma de decisiones. Debe combinarse con otros indicadores e incorporarse a un sistema de trading bien desarrollado.
- Puede combinarse con indicadores como el RSI o el MACD que pueden usarse para confirmar sus señales. En los siguientes artículos se explica como calcular estos indicadores en Python:
- Puede usarse el indicador ZLEMA para desarrollar estrategias de cruces de medias móviles. En el siguiente artículo mostramos cómo detectar cruces de medias móviles usando Python: ¿Cómo detectar cruces de medias móviles con Python?