¿Cómo calcular y trazar el oscilador MACD con Python?

1
64
Indicador MACD de MSFT (Microsoft) en Python

Junto con el RSI, el MACD es uno de los indicadores de tipo oscilador más utilizados en el análisis técnico de los mercados. Se usa para medir el impulso de la acción del precio y forma parte de múltiples estrategias de trading. En este artículo vamos a explicar como calcular y trazar el oscilador MACD en un gráfico de precios mediante Python.

Para esto vamos a usar como base el código que mostramos en el artículo: Creación de Bandas de Bollinger con Python

Pero antes de mostrar y explicar el código propiamente dicho vamos a explicar en qué consiste el MACD y cuáles son sus señales.

¿Qué es el indicador MACD?

La Convergencia y Divergencia de Medias Móviles (MACD, por sus siglas en inglés) es un indicador ampliamente utilizado en el trading algorítmico y el análisis técnico. Consta de tres componentes principales:

  • Línea MACD: es la diferencia entre dos medias móviles exponenciales (EMAs) del precio de un valor, típicamente las EMAs de 12 días y 26 días.
  • Línea de Señal: es una EMA de la línea MACD, generalmente con un período de 9 días.
  • Histograma del MACD: representa la diferencia entre la línea MACD y la línea de señal.
macd indicador

Señales del indicador MACD

Una señal de trading común ocurre cuando la línea MACD cruza por encima o por debajo de la línea de señal. Un cruce por encima de la línea de señal se considera alcista, mientras que un cruce por debajo se considera bajista.

Ejemplo sistema de trading con MACD

Cuando la línea MACD diverge del precio del valor, sugiere una posible reversión. Por ejemplo, si el precio está alcanzando nuevos máximos, pero la MACD no lo hace, podría indicar un debilitamiento del impulso.

El cruce de la línea MACD por encima o por debajo del nivel cero también es una señal. Permanecer por encima de cero durante un período prolongado sugiere una tendencia alcista, mientras que estar por debajo de cero indica una tendencia bajista.

Al igual que todos los indicadores, el MACD no es infalible. Es un indicador rezagado, lo que significa que se basa en precios pasados y no siempre puede predecir con precisión los movimientos futuros de los precios. También puede generar señales falsas en un mercado lateral o en rango.

Código de Python del MACD

Ahora vamos a explicar el código de Python que vamos a usar para calcular el indicador.  Primero que todo, vamos a utilizar la biblioteca yfinance para recopilar los datos de precios del activo que vamos a analizar. 

Antes de iniciar, es necesario instalar las bibliotecas necesarias para la ejecución del código del programa.

#Bibliotecas para el cálculo del indicador MACD
import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt

Obtención de datos de precios

Como ya indicamos, el paso inicial es obtener los datos de precios del mercado del instrumento que queremos analizar. Para este fin se usa la biblioteca yfinance que permite recolectar los datos de precios necesarios desde Yahoo Finance, tal como se muestra a continuación:

#Obtención de datos de precios del mercado desde Yahoo Finance
simbolo = ticker
fecha_inicio = '2022-01-01'
fecha_final = '2023-12-31'
data = yf.download(simbolo, start=fecha_inicio, end=fecha_final)

Aquí le indicamos al programa que queremos obtener los datos de precios de un activo para el periodo desde el primero de enero del 2022 hasta el 31 de diciembre del 2023.

Estos son los datos brutos que se van a usar para calcular los componentes del MACD.

Cálculo de los componentes del MACD

Después de obtener datos de precios, ahora es necesario calcular los valores de las líneas que forman el MACD mediante la librería conocida como Pandas. El código es bastante sencillo y consta de unas cuantas líneas.

#Calcular el MACD y la señal
periodo_menor = ema_menor
periodo_mayor = ema_mayor
periodo_signal = signal
data['EMAcorta'] = data['Close'].ewm(span=periodo_menor, adjust=False).mean()
data['EMAlarga'] = data['Close'].ewm(span=periodo_mayor, adjust=False).mean()
data['MACD'] = data['EMAcorta'] - data['EMAlarga']
data['Lineaseñal'] = data['MACD'].ewm(span=periodo_signal, adjust=False).mean()
# Calcular el histograma del MACD
data['Histograma'] = data['MACD'] - data['Lineaseñal']

Pandas es una biblioteca especializada en el manejo de grandes cantidades de datos. Además, cuenta con funciones para el cálculo de distintos indicadores como medias móviles y desviaciones estándar.

En este caso, con los datos de precios obtenidos mediante yfinance se calculan los valores de la línea MACD, la línea de señal y el histograma del MACD mediante Pandas obteniéndose 3 arrays de valores que se usarán para el trazado final del MACD en un gráfico de precios. 

Es posible calcular las líneas que forman el MACD de forma directa sin el uso de bibliotecas como Pandas, pero es un poco más complejo y se requieren más líneas de cálculo, aunque tampoco es tan difícil. Mostraremos como hacer esto posteriormente en un artículo donde explicaremos cómo calcular medias móviles, el MACD y otros indicadores sin tantas librerías que pueden hacer el código más lento.

Trazado de las líneas del MACD en el gráfico de precios

Después de obtener los datos de precios y usarlos para calcular las líneas del MACD, vamos a trazar este indicador en un gráfico de precios usando la biblioteca Matplotlib. El uso de esta biblioteca no es demasiado complicado, pero si se necesita que el programador aprenda a usar su notación para el trazado de títulos, ejes y los datos graficados.

#Crear subgráficos
fig, (ax1, ax2) = plt.subplots(2, sharex=True, figsize=(12, 8))

#Subgráfico 1: Gráfico de precios del activo
ax1.plot(data.index, data['Close'], label='Precio de cierre', color='green', linewidth=2)
ax1.set_title(f'{simbolo} - Gráfico de precios')
ax1.set_ylabel('Precio')
ax1.legend()

#Graficar el MACD y el histograma
ax2.plot(data.index, data['MACD'], label='MACD', color='blue', linewidth=2)
ax2.plot(data.index, data['Lineaseñal'], label='Linea de señal', color='red', linewidth=2)
ax2.bar(data.index, data['Histograma'], label='Histograma', color='gray', alpha=0.5)
ax2.set_title('Oscilador MACD')
ax2.set_xlabel('Fecha')
ax2.set_ylabel('Valor de MACD')
ax2.legend()

plt.show()

Con esto ya tenemos el código completo que puede integrarse en una función que se puede llamar desde otro programa, por ejemplo.

Vemos el código completo a continuación:

import yfinance as yf
import pandas as pd
import matplotlib.pyplot as plt

def calcular_macd(ticker,ema_menor,ema_mayor,signal):
# Obtener datos de acciones de Apple (AAPL) desde Yahoo Finance
     simbolo = ticker
     fecha_inicio = '2022-01-01'
     fecha_final = '2023-12-31'
     data = yf.download(simbolo, start=fecha_inicio, end=fecha_final)

# Calcular el MACD y la señal
     periodo_menor = ema_menor
     periodo_mayor = ema_mayor
     periodo_signal = signal

     data['EMAcorta'] = data['Close'].ewm(span=periodo_menor, adjust=False).mean()
     data['EMAlarga'] = data['Close'].ewm(span=periodo_mayor, adjust=False).mean()
     data['MACD'] = data['EMAcorta'] - data['EMAlarga']
     data['Lineaseñal'] = data['MACD'].ewm(span=periodo_signal, adjust=False).mean()

# Calcular el histograma del MACD
     data['Histograma'] = data['MACD'] - data['Lineaseñal']

# Crear subgráficos
     fig, (ax1, ax2) = plt.subplots(2, sharex=True, figsize=(12, 8))

# Subgráfico 1: Gráfico de precios del activo
     ax1.plot(data.index, data['Close'], label='Precio de cierre', color='green', linewidth=2)
     ax1.set_title(f'{simbolo} - Gráfico de precios')
     ax1.set_ylabel('Precio')
     ax1.legend()

# Graficar el MACD y el histograma
     ax2.plot(data.index, data['MACD'], label='MACD', color='blue', linewidth=2)
     ax2.plot(data.index, data['Lineaseñal'], label='Linea de señal', color='red', linewidth=2)
     ax2.bar(data.index, data['Histograma'], label='Histograma', color='gray', alpha=0.5)

     ax2.set_title('Oscilador MACD')
     ax2.set_xlabel('Fecha')
     ax2.set_ylabel('Valor de MACD')
     ax2.legend()
     plt.show()

Ejemplo del MACD

Si ejecutamos este código usando el ticker de Microsoft (MSFT) y valores de 12, 26 y 9 periodos para los parámetros del MACD, obtenemos el siguiente gráfico:

Indicador MACD de MSFT (Microsoft) en Python

Indicador MACD de MSFT (Microsoft) en Python

La imagen anterior muestra un gráfico de precios de la acción de Microsoft con valores de precios de cierre tomados desde el primero de enero de 2022 y el 31 de diciembre del 2023. Estos datos de precios fueron tomados de Yahoo Finance por medio de la librería yfinance. Los valores de las líneas del indicador MACD se calculan mediante la biblioteca Pandas y la creación del gráfico se realiza mediante mathplotlib. 

Como ya vimos, el código es relativamente simple y puede integrarse con otros códigos que sirven para calcular otros indicadores como bandas de Bollinger o el RSI.

Con las capacidades de Python para implementar estrategias complejas o análisis mediante machine learning y redes neuronales, códigos de este tipo pueden usarse para codificar y optimizar estrategias de trading mucho más desarrolladas.

Pueden obtener información sobre las principales librerías de Python para finanzas en: Las mejores librerías para finanzas de Python


 

Raul Canessa

1 comment

  1. Melisa Fernández 21 enero, 2024 at 08:50 Responder

    Hola, muchas gracias por tu aporte. Estoy aprendiendo y tu página me ayuda un montón. Te quería consultar cómo hago el cálculo de ema_menor y ema_mayor para #Calcular el MACD y la señal
    periodo_menor = ema_menor
    periodo_mayor = ema_mayor

Leave a reply