¿Cómo detectar cruces de medias móviles con Python?

Detección de cruces de medias móviles en Bitcoin con Python
En este artículo vamos a mostrar de forma simple cómo detectar cruces de medias móviles simples y exponenciales (SMA y EMA) mediante Python usando datos de precios reales de Bitcoin como ejemplo.
La estrategia de cruces de medias móviles es una técnica popular de análisis técnico que utiliza medias móviles simples y exponenciales de diferentes períodos para generar señales de compra y venta. Cuando una SMA de período más corto cruza por encima de una SMA de período más largo, indica una posible señal de compra, mientras que un cruce en la dirección opuesta sugiere una señal de venta. Esta estrategia ayuda a los traders a identificar tendencias y tomar decisiones informadas basadas en el impulso de los precios de los activos.
La estrategia de cruces de medias móviles se basa en el principio de que una media móvil de período más corto responde más rápidamente a los cambios recientes en el precio en comparación con una media móvil de período más largo. Cuando la media móvil de período más corto cruza por encima de la media móvil de período más largo, indica que el precio del activo está ganando impulso alcista, lo que señala una posible oportunidad de compra. Por el contrario, cuando la media móvil de período más corto cruza por debajo de la media móvil de período más largo, sugiere que el precio del activo está perdiendo impulso, señalando una posible oportunidad de venta.
En el momento en que la SMA de menor período cruza hacia arriba a la SMA de mayor período, obtenemos una señal de compra. De manera similar, cuando la SMA cruza hacia abajo, obtenemos la señal de venta, como se puede observar en la imagen anterior. Ahora, veamos cómo implementar este concepto en Python utilizando la biblioteca Pandas.
Nota: No debe usarse este código como estrategia para abrir y cerrar posiciones en el mercado. Los cruces de medias móviles no deben usarse como criterio único para operar ya que no todos los cruces llevan a operaciones exitosas. Este código es solo un ejemplo, pero puede usarse como un código más extenso para implementar una estrategia de trading más completa y desarrollada.
Código para la detección de cruces de medias móviles en Python
Detectar cruces de medias móviles en Python es una tarea relativamente sencilla usando bibliotecas como pandas para manipular datos y yfinance para obtener datos históricos del mercado. A continuación, mostramos un ejemplo de código para detectar cruces de medias móviles usando datos de Bitcoin:
import yfinance as yf import pandas as pd import numpy as np import matplotlib.pyplot as plt # Función para detectar cruces de medias móviles def detectar_cruces(data, short_window, long_window): signals = pd.DataFrame(index=data.index) signals['precio'] = data['Adj Close'] # Calcular medias móviles signals['media_corta'] = data['Adj Close'].rolling(window=short_window, min_periods=1).mean() signals['media_larga'] = data['Adj Close'].rolling(window=long_window, min_periods=1).mean() # Generar señales de compra (1) y venta (-1) signals['señal'] = 0.0 signals['señal'][short_window:] = np.where(signals['media_corta'][short_window:] > signals['media_larga'][short_window:], 1.0, 0.0) signals['cruce'] = signals['señal'].diff() return signals # Obtener datos históricos de Bitcoin btc_data = yf.download('BTC-USD', start='2023-01-01', end='2024-12-31') # Definir ventanas de medias móviles short_window = 50 long_window = 200 # Detectar cruces de medias móviles señales = detectar_cruces(btc_data, short_window, long_window) # Mostrar las señales de cruce más recientes print(señales.tail()) # Verificar si hay un cruce en el periodo actual ultimo_cruce = señales['cruce'][-1] if ultimo_cruce == 1.0: print("Se está produciendo un cruce alcista en el periodo actual.") elif ultimo_cruce == -1.0: print("Se está produciendo un cruce bajista en el periodo actual.") else: print("No se está produciendo ningún cruce en el periodo actual.") # Trazar los datos y cruces plt.figure(figsize=(14, 7)) # Trazar el precio ajustado plt.plot(señales['precio'], label='Precio de Bitcoin (Adj Close)', color='gray') # Trazar medias móviles plt.plot(señales['media_corta'], label='Media Corta (50)', color='blue') plt.plot(señales['media_larga'], label='Media Larga (200)', color='red') # Trazar cruces alcistas y bajistas plt.plot(señales[señales['cruce'] == 1.0].index, señales['media_corta'][señales['cruce'] == 1.0], '^', markersize=10, color='green', label='Cruce Alcista') plt.plot(señales[señales['cruce'] == -1.0].index, señales['media_corta'][señales['cruce'] == -1.0], 'v', markersize=10, color='red', label='Cruce Bajista') # Configurar título y etiquetas plt.title('Cruces de Medias Móviles en Bitcoin') plt.xlabel('Fecha') plt.ylabel('Precio (USD)') plt.legend() plt.grid() plt.show()
Una vez que se ejecuta el código aparece el siguiente gráfico con las señales:

Detección de cruces de medias móviles en Bitcoin con Python
Descripción del código
Importación de Bibliotecas: Primero se realiza la importación de las librerías usadas para la obtención y manejo de datos y para trazar el gráfico de precios. Las bibliotecas son las siguientes:
- yfinance: Para obtener datos históricos de precios.
- pandas y numpy: Para manipulación de datos y cálculos.
- matplotlib.pyplot: Para graficar los datos.
Función detectar_cruces: Esta es la función que sirve para detectar los cruces de medias móviles. Cumple con las siguientes tareas.
- Calcula las medias móviles de corto y largo plazo.
- Genera señales de cruce (1 para cruce alcista, -1 para cruce bajista).
Descarga de Datos Históricos: La descarga de datos históricos se realiza mediante la biblioteca yfinance.
- El código utiliza yfinance para descargar datos históricos de Bitcoin (BTC-USD, en notación de Yahoo Finance).
Detección de Cruces: Después de descargar los datos, el código aplica la función detectar_cruces para calcular y detectar cruces de medias móviles y mostrarlos en un gráfico.
Verificación de Cruces Actuales: la siguiente parte del código tiene la función de verificar el último valor en la columna cruce para determinar si hay un cruce alcista o bajista de las medias móviles en el periodo actual.
Trazado de los datos de precios y cruces de medias móviles: La última parte del código cumple las siguientes funciones:
- Utiliza la librería matplotlib para graficar los precios de precios del activo analizado, las medias móviles y los puntos de cruces de medias móviles.
- Agrega etiquetas y un título al gráfico.
Conclusiones
El código presentado en este artículo está diseñado para descargar datos de precios de un activo como Bitcoin, calcular dos medias móviles de distinto periodo y mostrar cruces de medias móviles pasados y actuales. Además, muestra los gráficos en un gráfico de precios. Como tal, puede usarse como parte de una estrategia de trading general en Python que entre sus señales incluyan cruces de medias móviles.
Como ya indicamos, este código y los cruces de medias móviles que detecta no debe usarse como criterio único para operar en los mercados.
Pueden obtener más acceso a más códigos gratuitos de Python en: Scripts de trading en Python