Ir al contenido principal

Encontremos al diferente... (Detectando Anomalias).

Encontremos al diferente... (Detectando Anomalías) Encontremos al diferente... (Detectando Anomalías) Introducción ¡Saludos! Te doy la bienvenida a una nueva entrega del viejo Quant. En estos días, me encuentro en el proceso de renovar el bot de señales de nuestro grupo en Telegram. Este proceso me ha llevado a profundizar en un tema ampliamente utilizado en el campo de la ciencia de datos: la detección de anomalías. Considerando su relevancia, he decidido dedicar este artículo para explorar y desglosar este concepto desde mi perspectiva. En las siguientes líneas, compartiré contigo lo que comprendo como anomalías, cómo podemos identificarlas y su crucial importancia tanto en el ámbito del trading como en la resolución de problemáticas relacionadas con la ciencia de datos. ¿Qué son las Anomalías? En el campo de la ciencia de datos, una ...

Clasificando Velas Japonesas con KMeans

Título del Artículo

Clasificando Velas Japonesas con KMeans

¿Cuantos tipos de velas existen?

Introducción

Durante muchos años las velas japonesas han sido usadas para representar los precios de los activos financieros, y tradicionalmente, la identificación de patrones en estas velas ha sido una labor mas artística y de experiencia individual a lo largo de los años. Sin embargo, ahora en este artículo vamos a revolucionar este enfoque con el uso de k-means, como ya vimos en el articulo de kmeans su implementación en un dataset muy comun en el argot de la ciencia de datos, un algoritmo que sirve para agrupar observaciones por sus caracteristicas similares.

Ingeniería de Características (Feature Engineering)

En el ámbito del aprendizaje automático, es fundamental prestar atención a la normalización y estandarización de los datos antes de sumergirse en los análisis respectivos. Esto es especialmente cierto cuando se trabaja con el algoritmo de k-means en el contexto de las criptomonedas, donde la amplia disparidad en las escalas de precios puede introducir ruido significativo y resultar en clusters definidos principalmente por diferencias en los rangos de precio más que en los patrones intrínsecos de las velas.

Para evitar este inconveniente, nos enfocamos en una estrategia de ingeniería de características que preserva la esencia de las fluctuaciones del mercado sin caer en la trampa de las disparidades de precios. Hemos identificado tres índices clave que facilitan una representación más auténtica y significativa de los datos:

  • H/O (High/Open): Este índice, calculado como la relación entre el precio más alto de la sesión y el precio de apertura, sirve como un termómetro para medir la presión compradora en un periodo determinado. Un valor elevado en este índice puede señalar una sesión dominada por los compradores.
  • L/O (Low/Open): Representa la relación entre el precio más bajo de la sesión y el precio de apertura. Un valor notablemente inferior a uno señala una considerable presión vendedora durante el período analizado.
  • C/O (Close/Open): Este índice refleja el comportamiento del activo al cierre en relación con su apertura. Un valor superior a uno indica un cierre positivo, señalando un mercado alcista, mientras que un valor inferior a uno puede interpretarse como un indicativo de una jornada bajista.

Al hacer uso de estos indicadores estratégicamente seleccionados, estamos equipados para llevar a cabo una clasificación de velas japonesas más precisa y ajustada a las verdaderas dinámicas del mercado.

Pero... ¿Cuántos tipos de velas hay?

Aunque el algoritmo k-means opera de manera no supervisada, es decir, sin necesidad de etiquetas previas en los datos, requiere que se especifique de antemano el número de clusters en los que deseamos agrupar nuestras observaciones. Esto nos plantea una pregunta fundamental: ¿en cuántos grupos deberíamos dividir las velas japonesas para lograr un análisis significativo?

La respuesta no es directa debido a la naturaleza variada y, a veces, sutil de los patrones de velas. Sin embargo, no estamos sin recursos. Podemos recurrir al conocido método del codo, una técnica que nos permite encontrar el número óptimo de clusters evaluando la varianza explicada en función del número de clusters. Aplicando este método, podemos determinar el punto en el que agregar más clusters resulta en mejoras marginales, ayudándonos a evitar tanto el sobreajuste como el subajuste en nuestro modelo.

De esta manera, respaldados por una metodología sólida, podemos proceder con nuestro análisis con una mayor confianza en la robustez de los insights derivados de nuestra clasificación de velas japonesas.

Sin más... comencemos a resolver nuestro problema.

En primer lugar comencemos importando las librerias que usaremos y nuestros datos, yo estoy usando datos diarios de bitcoin en el periodo 2020-09-18/2023-06-14 para llevar a cabo este analisis.

    
    import pandas as pd
    from sklearn.preprocessing import StandardScaler
    from sklearn.cluster import KMeans
    import matplotlib.pyplot as plt

    # Cargar los datos
    data_path = 'BTCUSDT-1D.csv'
    btc_data = pd.read_csv(data_path)
    
    

Procedemos a hacer el calculo de la features y estandarizar nuestros datos:

    
    # Crear las características high/open, low/open y close/open
    btc_data['high/open'] = btc_data['high'] / btc_data['open']
    btc_data['low/open'] = btc_data['low'] / btc_data['open']
    btc_data['close/open'] = btc_data['close'] / btc_data['open']

    # Estandarización de las características
    features = ['high/open', 'low/open', 'close/open']
    scaler = StandardScaler()
    btc_data_scaled = scaler.fit_transform(btc_data[features])
    btc_data_scaled_df = pd.DataFrame(btc_data_scaled, columns=features)

    
    

Finalmente hacemos el calculo del metodo del codo.

    
    # Determinar el rango de valores de k para aplicar el método del codo
    k_range = range(1, 11)

    # Calcular la inercia para cada valor de k
    inertia = [KMeans(n_clusters=k, random_state=42).fit(btc_data_scaled_df).inertia_ for k in k_range]

    # Graficar el método del codo
    plt.figure(figsize=(8,6))
    plt.plot(k_range, inertia, marker='o')
    plt.title('Método del Codo')
    plt.xlabel('Número de clusters')
    plt.ylabel('Inercia')
    plt.grid(True)
    plt.show()
    
    

Donde finalmente podemos observar que el numero optimo de tipos de vela es 4, dado que tenemos que seleccionar como numero optimo "el codo" de la gráfica.

Visualización de resultados

Entrenamos nuestro modelo:

    
    kmeans = KMeans(n_clusters=4, random_state=42)
	btc_data['Cluster'] = kmeans.fit_predict(btc_data_scaled)
    
    

Generamos la primer grafica:

    
    traces = []
    colors = ['green', 'red', 'blue', 'yellow', 'orange', 'purple']
    for cluster, color in enumerate(colors):
        cluster_data = btc_data[btc_data['Cluster'] == cluster]
        trace = go.Candlestick(
            x=cluster_data['datetime'],
            open=cluster_data['open'],
            high=cluster_data['high'],
            low=cluster_data['low'],
            close=cluster_data['close'],
            increasing_line_color=color,
            decreasing_line_color=color,
            name=f'Cluster {cluster}'
        )
        traces.append(trace)

    # Crea el gráfico de velas japonesas con Plotly
    fig = go.Figure(data=traces)
    fig.update_layout(
        title='Gráfico de Velas Japonesas con Clusters',
        xaxis_title='Fecha',
        yaxis_title='Precio',
        template="plotly_dark"
    )
    fig.show()
    
    

Generamos la segunda grafica:

    
    traces.clear()

    # Ordenando las observaciones por cluster y luego asignando un nuevo índice continuo
    btc_data_sorted = btc_data.copy()
    btc_data_sorted.sort_values(by='Cluster', inplace=True)
    btc_data_sorted.reset_index(drop=True, inplace=True)

    for cluster, color in enumerate(colors):
        cluster_data = btc_data_sorted[btc_data_sorted['Cluster'] == cluster]

        trace = go.Candlestick(
            x=cluster_data.index,  # Usando el índice global como el eje x
            open=cluster_data['open'],
            high=cluster_data['high'],
            low=cluster_data['low'],
            close=cluster_data['close'],
            increasing_line_color='green',
            decreasing_line_color='red',
            name=f'Cluster {cluster}'
        )

        traces.append(trace)

    # Creando el gráfico de velas japonesas con Plotly
    fig = go.Figure(data=traces)

    # Identificando los índices donde los clusters cambian para añadir líneas verticales
    cluster_changes = btc_data_sorted['Cluster'].diff().ne(0)
    change_indices = btc_data_sorted.loc[cluster_changes].index.tolist()

    for idx in change_indices:
        fig.add_vline(x=idx, line_width=5, line_dash="dash", line_color="white")

    # Definiendo el título y los ejes del gráfico
    fig.update_layout(
        title='Gráfico de Velas Japonesas con Clusters (Independiente del Tiempo)',
        xaxis_title='Índice Global',
        yaxis_title='Precio',
        template="plotly_dark"
    )

    # Mostrando el gráfico
    fig.show()
    
    

Conclusión

A lo largo de este artículo, hemos explorado la eficacia del algoritmo de k-means en la clasificación de velas japonesas en categorías que reflejen patrones significativos. Gracias a una estrategia meticulosamente diseñada de ingeniería de características, que preserva la esencia de las fluctuaciones del mercado, hemos alcanzado una representación fidedigna y significativa de los patrones de las velas japonesas. Este enfoque nos facilita la identificación de tendencias en el comportamiento de los precios de los activos financieros, constituyendo una herramienta valiosa para los análisis de mercado.

Mirando hacia el futuro, se abre la posibilidad de integrar este tipo de análisis con otros modelos sofisticados, tal como los Modelos de Cadenas de Markov, en una búsqueda constante por anticipar con mayor precisión el tipo de vela siguiente en la secuencia. De esta manera, podemos aspire a descubrir patrones estadísticamente significativos que ofrezcan ventajas competitivas en el análisis financiero.

🚀 Lleva tu aprendizaje al siguiente nivel con Quant Academy

¿Te gustaría profundizar en técnicas avanzadas de Machine Learning? Te invitamos a descubrir nuestro curso de Machine Learning con Python, perfecto para quienes buscan fortalecer su perfil profesional en el campo de la ciencia de datos, sin importar su nivel de experiencia.

Perfil del estudiante: Ideal para todo aquel que busque mejorar su perfil profesional, desde principiantes hasta niveles avanzados. No hay restricciones de edad.

Duración: 8-20 horas por curso.
Formato: Videos detallados.
Acceso: Completamente en línea a través de nuestra plataforma y canal de YouTube.

¡No te pierdas esta oportunidad! Únete a los estudiantes satisfechos de Quant Academy.
"He tomado 3 cursos de Domingo y son realmente buenos...aprendí a aplicar la programación y ciencia de datos al mundo de las finanzas..." - Geovani V.

Contacto y Redes Sociales

Plataforma: Quant Academy
YouTube: Quant Academy YouTube
Facebook: Quant Academy Facebook
Telegram: Quant Academy Telegram
Discord: Quant Academy Discord

Comentarios

Entradas populares de este blog

Como conseguir el trabajo que quieras

Encaminándote Hacia el Trabajo de Tus Sueños: Estrategias Probadas. En el transcurso de nuestras vidas, todos nos encontramos con el reto significativo de aspirar a ese trabajo ideal, aquél que no solo satisface nuestras ambiciones profesionales, sino que también resuena profunda y auténticamente con nuestros intereses y pasiones individuales. En este camino hacia la realización profesional, deseamos que cada paso esté guiado por estrategias probadas y consejos pragmáticos que puedan aumentar nuestras oportunidades de éxito. Comenzaré por contarte mi historia personal y como fue que llegue a trabajar a un fondo de inversiones y posteriormente te voy a dar algunas recomendaciones para optimizar tu busqueda y que las empresas volteen a verte de forma mas fácil y puedas sobresalir de miles de solicitantes. Todo comenzó en el año 2017, comenzaba mis estudios en física y no había nada el mundo que me apasionara mas que resolver problemas complejos, siempre fue una satisfacción interna p...

La Historia y Aplicación de K-Means en Python

La Historia y Aplicación de K-Means en Python La Historia y Aplicación de K-Means en Python En el entorno competitivo de hoy, el análisis de datos se ha convertido en una herramienta imprescindible para tomar decisiones informadas. Un actor prominente en este dominio es el algoritmo K-Means, cuyo legado y aplicabilidad perduran hasta el día de hoy. A continuación, exploramos su rica historia y cómo puede implementarse utilizando Python. Historia del K-Means La historia del algoritmo K-Means se remonta a varias décadas atrás. Fue desarrollado independientemente por Stuart Lloyd en 1957 y por James MacQueen en 1967. Lo que comenzó como una técnica para optimizar un sistema telefónico, se transformó en una piedra angular del aprendizaje no supervisado en la ciencia de datos. El nombre K-Means proviene de su método de operación, donde "K" representa el número de grupos (clusters) que el usuario desea crear y "Means" refiriéndose al promedio. El algori...