Detección de Soportes y Resistencias en el Precio con Python y K-Means

0
673
SOPORTE Y RESISTENCIA

El trading algorítmico es un campo fascinante del trading y la estadística, y una de las técnicas de trading más útiles que los traders cuantitativos suelen querer automatizar es la acción del precio, que es el análisis de los movimientos de precios sin utilizar indicadores derivados, como osciladores o medias móviles.

En este artículo, cubriremos un algoritmo para detectar automáticamente dos herramientas importantes de la acción del precio, que son los soportes y las resistencias.

¿Qué es un soporte?

 En una tendencia bajista, los precios caen porque hay un exceso de oferta sobre la demanda. Cuanto más bajan los precios, más atractivos se vuelven para aquellos que esperan al margen para comprar las acciones. En algún nivel, la demanda que habría estado aumentando lentamente se elevará al nivel donde coincide con la oferta. En este punto, los precios dejarán de caer. Esto es el soporte.

El soporte puede ser un nivel de precio en el gráfico o una zona de precios. En cualquier caso, el soporte es un área en un gráfico de precios que muestra la disposición de los compradores a comprar. Es en este nivel donde la demanda generalmente superará a la oferta, haciendo que la caída del precio se detenga y se revierta.

¿Qué es una resistencia?

 La resistencia es lo opuesto al soporte. Los precios suben porque hay más demanda que oferta. A medida que los precios suben, llegará un punto en el que las ventas superarán el deseo de comprar. Esto sucede por una variedad de razones. Podría ser que los traders hayan determinado que los precios son demasiado altos o hayan alcanzado su objetivo. Podría ser la reticencia de los compradores a iniciar nuevas posiciones a valoraciones tan altas. Podría ser por cualquier otro número de razones. Pero un técnico verá claramente en un gráfico de precios un nivel en el que la oferta comienza a superar la demanda. Esto es la resistencia. Al igual que el soporte, puede ser un nivel o una zona.

Una vez que se ha identificado un área o “zona” de soporte o resistencia, esos niveles de precios pueden servir como puntos potenciales de entrada o salida porque, cuando el precio alcanza un punto de soporte o resistencia previo, hará una de dos cosas: rebotar alejándose del nivel de soporte o resistencia, o romper el nivel de precio y continuar en su dirección anterior, hasta que alcance el siguiente nivel de soporte o resistencia.

Pueden obtener más información sobre estas zonas de precios en:  Los Soportes y Resistencias

Descripción del código para trazar niveles de soporte y resistencia en Python

Seguidamente vamos a explicar un ejemplo de código para detectar soportes y resistencias usando Ethereum (ETHUSD) por medio de clustering con KMeans, y trazar todas las resistencias junto con los precios de cierre en un gráfico único.

Instalación de Bibliotecas

Asegúrate de tener instaladas las bibliotecas necesarias:

pip install pandas numpy matplotlib sklearn yfinance

Una vez que hemos instalado las bibliotecas necesarias, escribimos el siguiente código:

#Importación de bibliotecas necesarias para la ejecución del código
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import yfinance as yf 
from sklearn.cluster import KMeans

#Cargar y preparar los datos de Ethereum
"""
Usaremos la biblioteca yfinance para obtener los datos históricos de Ethereum.
Importación de bibliotecas usadas en para extraer datos de precios y calcular niveles de soporte/resistencia
"""
# Descarga de los datos históricos de Ethereum
activo="ETH-USD"
inicio="2022-01-01"
final="2023-12-30"
df = yf.download(activo, start=inicio, end=final)

# Código de visualización de datos – Puede excluirse si el trader así lo quiere
df['Close'].plot(figsize=(14, 7))
plt.title('Precio de cierre de Ethereum')
plt.xlabel('Fecha')
plt.ylabel('Precio')
plt.show()
 
#Función para detectar soportes y resistencias
#La siguiente función sirve para detectar picos (máximos y mínimos locales):

def detect_picos(data, window=5):
    """
    Detecta máximos y mínimos locales en los datos de precios.

    Parámetros:
        data (pd.Series): Serie de precios.
        window (int): Número de periodos para considerar en la ventana de detección.

    Retorna:
        (pd.DataFrame): DataFrame con los máximos y mínimos locales.
    """
    picos = pd.DataFrame(index=data.index)
    picos['price'] = data
    picos['max'] = data[(data.shift(window) < data) & (data.shift(-window) < data)] picos['min'] = data[(data.shift(window) > data) & (data.shift(-window) > data)]
    return picos

# Detección de máximos y mínimos locales
picos = detect_picos(df['Close'])

# Preparación de datos para clustering 
picos_precios = picos.dropna(subset=['max', 'min']) 
X = picos_precios[['price']].values 
# Aplicar KMeans con 2 clusters
kmeans = KMeans(n_clusters=2, random_state=0).fit(X) 
picos_precios['Cluster'] = kmeans.labels_

# Identificar los clusters de soportes y resistencias 
resistancia_cluster = kmeans.cluster_centers_.argmax() 
soporte_cluster = kmeans.cluster_centers_.argmin()

# Filtrar las resistencias y soportes
resistencias = picos_precios[peak_prices['Cluster'] == resistencia_cluster] 
soportes = picos_precios[peak_prices['Cluster'] == soporte_cluster] 

# Visualizar soportes y resistencias junto con precios de cierre 
plt.figure(figsize=(14, 7))
plt.plot(df['Close'], label='Precio de cierre') 
plt.scatter(resistances.index, resistances['price'], color='red', label='Resistencia', alpha=0.6) 
plt.scatter(supports.index, supports['price'], color='green', label='Soporte', alpha=0.6) 
plt.title('Soportes y Resistencias detectados en Ethereum') 
plt.xlabel('Fecha') 
plt.ylabel('Precio') 
plt.legend() 
plt.show()

Aquí está el código original modificado para incluir tanto soportes como resistencias utilizando KMeans y trazando ambas en un gráfico junto con los precios de cierre de Ethereum.

Si aplicamos este indicador obtenemos los siguientes resultados:

Precio de cierre de ETHUSDExplicación del Código

  1. Descargar Datos Históricos:
    • Utilizamos yfinance para descargar datos históricos de Ethereum (ETH-USD) desde el 1 de enero de 2022 hasta el 31 de diciembre de 2023.
  2. Detección de Picos:
    • La función detectar_picos detecta los máximos y mínimos locales en los datos de precios de cierre.
  3. Preparar Datos para Clustering:
    • Filtramos los picos detectados para eliminar los valores nulos.
    • Preparamos los datos de precios para el clustering con KMeans.
  4. Aplicar KMeans:
    • Aplicamos el algoritmo KMeans con 2 clusters a los datos de picos.
    • Asignamos las etiquetas de clusters a los picos detectados.
  5. Filtrar Soportes y Resistencias:
    • Identificamos el cluster con el centroide de mayor valor como el cluster de resistencias.
    • Identificamos el cluster con el centroide de menor valor como el cluster de soportes.
    • Filtramos los picos para obtener las resistencias y soportes.
  6. Visualización:
    • Graficamos los precios de cierre junto con las resistencias (en rojo) y los soportes (en verde).

Este código te permitirá detectar y visualizar los niveles de soporte y resistencia en los datos históricos de Ethereum (u otro activo), proporcionando una herramienta visual útil para el análisis técnico.

¿Qué otros enfoques podrían usarse en un código similar?

Existen varios enfoques alternativos y complementarios que podemos usar para mejorar la detección de soportes y resistencias en el análisis técnico. A continuación, presentamos algunos de ellos:

  • Retrocesos de Fibonacci: Los niveles de retroceso de Fibonacci se utilizan para identificar posibles niveles de soporte y resistencia basados en la secuencia de Fibonacci.
  • Indicadores Técnicos: Incorporar indicadores técnicos como medias móviles (SMA, EMA) y Bandas de Bollinger puede ayudar a identificar niveles clave de soporte y resistencia.
  • Análisis de Volumen: El volumen puede proporcionar una confirmación adicional para los niveles de soporte y resistencia.
  • Machine Learning para Predicción: Utilizar modelos de machine learning para predecir precios futuros y detectar niveles clave.
  • Clustering Avanzado: También podemos usar técnicas de clustering más avanzadas como DBSCAN para detectar niveles de soporte y resistencia.

Estos enfoques adicionales proporcionan una mayor robustez y precisión en el análisis técnico de los mercados financieros. Puedes combinar múltiples métodos para obtener una visión más completa y confiable de los niveles de soporte y resistencia en los datos de precios.

Resumen

Este código descarga los datos históricos de Ethereum o de cualquier otro instrumento que desee el trader, detecta los niveles de soporte y resistencia, aplica clustering con KMeans y grafica las resistencias detectadas junto con los precios de cierre. Esto te permite analizar visualmente las resistencias y entender mejor la dinámica de precios en los mercados.


 

Raul Canessa

Leave a reply