¿Como calcular y trazar patrones fractales con Python?

0
31
Patrones fractales en Python

En este artículo mostramos un código simple que está diseñado para obtener datos de precios de cualquier instrumento financiero y trazar los patrones fractales de Bill Williams en un gráfico de precios. Es un script sencillo y fácil de entender que puede mejorarse e integrarse en programas de análisis del mercado más complejo, como veremos en la sección de recomendaciones. Además, utiliza bibliotecas de Python populares y que son actualizadas con frecuencia.

Para comenzar, vamos a explicar brevemente que son los patrones fractales, a continuación, vamos a mostrar el código y explicarlo en detalle y luego vamos a recomendar una serie de mejoras.

¿Que son los patrones fractales de Williams?

Los fractales son una herramienta de análisis técnico desarrollada por Bill Williams, un reconocido trader y autor. Se utilizan en el ámbito del trading algorítmico para identificar posibles puntos de reversión en el mercado, resaltando los máximos y mínimos locales en los movimientos del precio. Este conjunto de herramientas resulta fundamental para los traders que buscan predecir los cambios del mercado con mayor precisión, permitiéndoles tomar decisiones de trading informadas.

Los Fractales de Williams funcionan identificando “fractales”, que son básicamente patrones que indican los puntos de giro del movimiento del precio dentro de un período específico. Un fractal está compuesto por un mínimo de cinco barras (velas), donde la barra central se posiciona más alta o más baja que las dos barras a cada lado.

  • Fractal Alcista (Bullish Fractal): Se forma cuando hay una serie de cinco o más barras en la que el máximo más alto se encuentra en el centro y está precedido por dos máximos más bajos y seguido por dos máximos también más bajos.

  • Fractal Bajista (Bearish Fractal): Se forma cuando hay una serie de cinco o más barras en la que el mínimo más bajo se encuentra en el centro y está precedido por dos mínimos más altos y seguido por dos mínimos también más altos.

ejemplos fractales

 

Pueden obtener más información sobre este indicador en: Patrones fractales de Bill Williams

Código del script de patrones fractales en Python

Cuando corremos el script el programa obtiene los datos de precios del activo de interés de Yahoo Finance, convierte estos datos en un dataframe y los utiliza para trazar un gráfico de precios lineal con los patrones fractal como muestra la siguiente imagen:

Patrones fractales en Python

Ahora vamos a mostrar el código y posteriormente vamos a explicarlo en detalle.

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

# Obtener datos históricos de Bitcoin desde yfinance
btc_data = yf.download('ETH-USD', start='2024-01-01', end='2025-10-31')

# Función para calcular fractales alcistas y bajistas
def calculate_fractals(df):
    df['FractalUp'] = df['Close'][(df['Close'].shift(2) < df['Close'].shift(0)) & 
                                  (df['Close'].shift(1) < df['Close'].shift(0)) & 
                                  (df['Close'].shift(-1) < df['Close'].shift(0)) & 
                                  (df['Close'].shift(-2) < df['Close'].shift(0))] df['FractalDown'] = df['Close'][(df['Close'].shift(2) > df['Close'].shift(0)) & 
                                    (df['Close'].shift(1) > df['Close'].shift(0)) & 
                                    (df['Close'].shift(-1) > df['Close'].shift(0)) & 
                                    (df['Close'].shift(-2) > df['Close'].shift(0))]

    return df

# Calcular fractales
btc_data = calculate_fractals(btc_data)

# Graficar los precios y los fractales
plt.figure(figsize=(12, 6))
plt.plot(btc_data['Close'], label='Precio de cierre', color='blue')
plt.scatter(btc_data.index, btc_data['FractalUp'], label='Up Fractal', marker='^', color='blue')
plt.scatter(btc_data.index, btc_data['FractalDown'], label='Down Fractal', marker='v', color='red')
plt.title('Fractales de Bill Williams en ETH/USD')
plt.xlabel('Fecha')
plt.ylabel('Precio')
plt.legend()
plt.show()

Importación de Bibliotecas y Obtención de Datos

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

btc_data = yf.download('ETH-USD', start='2024-01-01', end='2025-10-31')

El código utiliza yfinance para descargar datos históricos de Ethereum desde Yahoo Finance. Aunque la variable se llama btc_data, realmente está descargando datos de ETH-USD (Ethereum contra dólar). Los datos incluyen precios de apertura, cierre, máximos, mínimos y volumen para el período especificado.

La Función de Cálculo de Fractales

La función calculate_fractals() implementa la lógica central del indicador:

Fractales Alcistas (FractalUp)

df['FractalUp'] = df['Close'][(df['Close'].shift(2) < df['Close'].shift(0)) & 
                              (df['Close'].shift(1) < df['Close'].shift(0)) & 
                              (df['Close'].shift(-1) < df['Close'].shift(0)) & 
                              (df['Close'].shift(-2) < df['Close'].shift(0))]

Un fractal alcista se identifica cuando un precio de cierre es mayor que los dos precios anteriores y los dos precios posteriores. Esto representa un máximo local en el gráfico, señalando un posible punto de resistencia o momento de reversión bajista.

La función shift() desplaza los datos:

  • shift(2) y shift(1): dos y un período hacia atrás
  • shift(0): el período actual
  • shift(-1) y shift(-2): uno y dos períodos hacia adelante

Fractales Bajistas (FractalDown)

df['FractalDown'] = df['Close'][(df['Close'].shift(2) > df['Close'].shift(0)) & 
                                (df['Close'].shift(1) > df['Close'].shift(0)) & 
                                (df['Close'].shift(-1) > df['Close'].shift(0)) & 
                                (df['Close'].shift(-2) > df['Close'].shift(0))]

Un fractal bajista ocurre cuando un precio es menor que los dos precios anteriores y posteriores, identificando un mínimo local que puede indicar soporte o un posible punto de reversión alcista.

Visualización de Resultados

plt.figure(figsize=(12, 6))
plt.plot(btc_data['Close'], label='Precio de cierre', color='blue')
plt.scatter(btc_data.index, btc_data['FractalUp'], label='Up Fractal', marker='^', color='blue')
plt.scatter(btc_data.index, btc_data['FractalDown'], label='Down Fractal', marker='v', color='red')

El código genera un gráfico que muestra:

  • La línea continua azul representa el precio de cierre
  • Triángulos azules apuntando hacia arriba marcan los fractales alcistas (máximos locales)
  • Triángulos rojos apuntando hacia abajo marcan los fractales bajistas (mínimos locales)

Aplicación práctica del script

Este código podemos usarlo con otros scripts de Python para:

  • Identificar niveles clave de soporte y resistencia
  • Detectar posibles puntos de reversión de tendencia
  • Establecer órdenes de stop-loss o take-profit
  • Confirmar señales junto con otros indicadores técnicos

Básicamente, nos puede ayudar a filtrar el ruido del mercado y enfocarse en puntos estructuralmente significativos del movimiento del precio.

Recomendaciones y mejoras

Como vimos, este código puede parecer demasiado sencillo y talvez para un trader resulte más adecuado implementar una serie de mejoras como las siguientes:

  • Agregar velas japonesas en lugar del gráfico lineal para mejorar la lectura de los patrones.
  • Agregar parámetros configurables que permitan, entre otras cosas, ajustar el periodo de análisis.
  • Agregar manejo de excepciones en caso de que por algún motivo el script no pudo descargar los datos de precios
  • Guardar los resultados en un archivo .csv o de otro tipo para tener un registro y no tener que descargar los datos de precios y calcular los indicadores cada vez que necesitemos usarlos en una estrategia. Esto reduce las peticiones a Yahoo Finance a través de yfinance.
  • Agregar estadísticas útiles como cantidad de fractales alcistas/bajistas detectados.
  • Agregar osciladores como el RSI para comprobar si un patrón fractal coincide con una condición de sobrecompra/sobreventa en el indicador.
  • Mejorar la visualización del gráfico para que sea más amigable con el usuario.

Más adelante vamos a implementar estas mejoras y las vamos a colocar en este artículo.

Pueden usar este código sin costo alguno. Cualquier duda, comentario o sugerencia pueden dejarla en la sección de comentarios.


 

TagsPython
Raul Canessa

Leave a reply