Русский Português
preview
Fibonacci en Forex (Parte I): Comprobamos la relación tiempo-precio

Fibonacci en Forex (Parte I): Comprobamos la relación tiempo-precio

MetaTrader 5Integración |
425 4
Yevgeniy Koshtenko
Yevgeniy Koshtenko

Introducción

"Todo es un número", afirmó Pitágoras en el siglo VI a.C. Sus seguidores creían que el universo se basaba en relaciones numéricas, y que el conocimiento de estas relaciones abría la puerta a la comprensión y predicción de cualquier proceso en el universo. Dos milenios más tarde, este presentimiento intuitivo de los antiguos griegos recibió una confirmación inesperada en la mecánica cuántica, la teoría de la relatividad y la teoría del caos: las leyes fundamentales de la naturaleza se expresan de hecho a través de relaciones matemáticas.

En 1202, el matemático italiano Leonardo de Pisa, conocido como Fibonacci, publicó un problema sobre la reproducción de conejos. Difícilmente podría haber imaginado que la secuencia de números que halló se convertiría en uno de los fenómenos matemáticos más misteriosos y ampliamente discutidos de la historia de la humanidad. Quizá esta secuencia y sus relaciones derivadas suponga una de esas leyes numéricas fundamentales de las que hablaban los pitagóricos.

Esta secuencia, en la que cada número sucesivo es igual a la suma de los dos anteriores (1, 1, 2, 3, 3, 5, 8, 13, 21...), no solo describe el crecimiento de la población de conejos. Esta aparece en la disposición de las hojas en un tallo, las espirales de las conchas marinas, la estructura del cuerpo humano e incluso en la estructura de las galaxias. Pero lo más intrigante de todo es que los números de Fibonacci y sus proporciones derivadas se manifiestan de forma constante en los movimientos de los mercados financieros.

Si los pitagóricos tenían razón, y todo en el mundo se rige realmente por relaciones numéricas, entonces el mercado Forex, a pesar de su aparente naturaleza caótica, también se sometería a estas leyes. Pero, ¿por qué, en un mercado en el que millones de tráders toman decisiones independientes y cuyas cotizaciones están determinadas por innumerables factores, surgen patrones relacionados con la secuencia de Fibonacci? Y si estos patrones existen, ¿pueden usarse para realizar predicciones, como sugerían los antiguos griegos?

En el artículo de hoy, nos sumergiremos en el análisis de más de 100.000 movimientos de precios de divisas utilizando técnicas avanzadas de procesamiento de datos y aprendizaje automático. Además, examinaremos no solo las relaciones clásicas entre precios, sino también las pautas temporales, un área que ha recibido (a mi juicio, de forma injusta) poca atención en el análisis técnico tradicional.

Nuestro enfoque será estrictamente científico: ninguna hipótesis sin validación estadística, ninguna conclusión sin una evaluación cuantitativa de su validez. Hoy pondremos a prueba la hipótesis de que el mercado "recuerda" realmente los números de Fibonacci, y averiguaremos si esta memoria puede utilizarse para obtener beneficios, confirmando o refutando la antigua sabiduría pitagórica sobre la previsibilidad del mundo a través de relaciones numéricas.

En la primera parte del estudio, nos centraremos en una cuestión fundamental: ¿existen correlaciones estadísticamente significativas entre los movimientos de precios y temporales correspondientes a los números de Fibonacci? Los resultados de este análisis pueden no solo cambiar nuestra perspectiva sobre la naturaleza de los movimientos del mercado, sino también acercarnos a la comprensión de hasta qué punto los patrones numéricos penetran en el tejido de la realidad.



Antecedentes: de la antigüedad a los algoritmos

Los tráders modernos suelen utilizar los números de Fibonacci para construir niveles de corrección (23,6%, 38,2%, 61,8%) o como "cuadrícula de Fibonacci". Sin embargo, este planteamiento solo aprovecha una pequeña fracción del potencial de estas asombrosas cifras. Poca gente sabe que en la década de 1930 Ralph Nelson Elliott, al crear su famosa Teoría de las Ondas, descubrió no solo relaciones de precios, sino también relaciones temporales de Fibonacci en los movimientos del mercado.

Sin embargo, Elliott no tenía a su disposición ordenadores ni técnicas modernas de análisis de datos. Todas las observaciones se hacían manualmente, y las pruebas estadísticas de las hipótesis requerían mucho trabajo. Hoy en día, con la llegada de potentes algoritmos y la capacidad de procesar grandes conjuntos de datos, podemos probar estas ideas con un nuevo nivel de precisión.



Metodología de la investigación

En nuestro estudio, no nos limitamos a analizar los movimientos individuales de los precios, sino que buscamos las relaciones entre varios movimientos consecutivos. Para ello, hemos desarrollado un algoritmo especial que:

  1. Identifica los movimientos de precios significativos filtrando el "ruido" del mercado.
  2. Analiza las relaciones entre movimientos colindantes
  3. Busca patrones temporales entre puntos de reversión
  4. Valora la significación estadística de los coeficientes encontrados

Nosotros prestamos especial atención al hecho de que, en realidad, los movimientos del mercado rara vez forman números de Fibonacci exactos. Por lo tanto, vamos a usar el concepto de "desviación aceptable" y a analizar con qué frecuencia los movimientos reales se sitúan dentro de unos márgenes determinados en torno a los valores teóricos.



Detalles técnicos de la aplicación

Tras la hermosa idea de buscar los números de Fibonacci en los movimientos del mercado hay una seria aplicación técnica. Para darle vida, necesitamos Python y la biblioteca MetaTrader 5 para acceder a los datos históricos. Vamos a empezar por la funcionalidad básica: la generación de números de Fibonacci y sus relaciones:

def generate_fibonacci_sequence(n):
    fib = [1, 1]
    while len(fib) < n:
        fib.append(fib[-1] + fib[-2])
    return fib

def generate_fibonacci_ratios():
    ratios = {
        '0.236': 0.236, '0.382': 0.382, '0.500': 0.500,
        '0.618': 0.618, '0.786': 0.786, '1.000': 1.000,
        '1.618': 1.618, '2.000': 2.000, '2.618': 2.618,
        '3.618': 3.618, '4.236': 4.236
    }
    return ratios

La primera función genera una secuencia clásica de Fibonacci, mientras que la segunda crea un diccionario con las relaciones clave que buscamos en los movimientos de los precios. Pero la principal dificultad reside en definir los propios movimientos. En el gráfico, los precios fluctúan de forma constante, creando muchos pequeños movimientos que son esencialmente ruido de mercado. Tras muchos experimentos, hemos desarrollado un algoritmo que se encarga con éxito de esta tarea:

def calculate_price_movements(df, min_movement=0.0001):
    movements = []
    current_direction = None
    start_price = df['close'].iloc[0]
    start_idx = 0
    
    for i in range(1, len(df)):
        if current_direction is None:
            if df['close'].iloc[i] > df['close'].iloc[i-1]:
                current_direction = 'up'
            elif df['close'].iloc[i] < df['close'].iloc[i-1]:
                current_direction = 'down'
        else:
            # Проверка на разворот тренда
            if (current_direction == 'up' and df['close'].iloc[i] < df['close'].iloc[i-1]) or \
               (current_direction == 'down' and df['close'].iloc[i] > df['close'].iloc[i-1]):
                
                movement = abs(df['close'].iloc[i-1] - start_price)
                if movement >= min_movement:
                    movements.append({
                        'start_time': df.index[start_idx],
                        'end_time': df.index[i-1],
                        'start_price': start_price,
                        'end_price': df['close'].iloc[i-1],
                        'movement': movement,
                        'direction': current_direction,
                        'duration': (df.index[i-1] - df.index[start_idx]).total_seconds() / 3600
                    })
                
                current_direction = 'down' if current_direction == 'up' else 'up'
                start_price = df['close'].iloc[i-1]
                start_idx = i-1
    
    return movements

Este algoritmo monitorea los retrocesos de los precios y capta el movimiento solo si supera un umbral mínimo especificado. Cada movimiento se caracteriza no solo por la magnitud del cambio de precio, sino también por su duración en el tiempo, lo cual nos permite analizar tanto las relaciones de precio como de tiempo.

Los primeros resultados del análisis del par EUR/USD fueron en su momento sorprendentes. En una muestra de mil velas horarias, encontramos 51 movimientos de precios significativos que formaron 87 relaciones de Fibonacci distintas con una precisión superior al 99%. La famosa "sección áurea" (61,8%) y sus niveles asociados del 38,2% y el 23,6% resultan especialmente frecuentes.



Aplicación de la búsqueda de patrones

La parte más desafiante e interesante del estudio ha sido encontrar las relaciones de Fibonacci en los movimientos de los precios. No basta con comparar cifras: debemos considerar muchos factores y buscar patrones en múltiples dimensiones al mismo tiempo. He aquí cómo resolvimos este problema:

def find_fibonacci_patterns(movements, tolerance=0.01):
    fib_sequence = generate_fibonacci_sequence(15)
    fib_ratios = generate_fibonacci_ratios()
    patterns = []
    time_patterns = []
    
    # Ищем паттерны в последовательных движениях
    for i in range(len(movements) - 2):
        moves = [movements[i]['movement'], 
                movements[i+1]['movement'], 
                movements[i+2]['movement']]
        
        # Рассчитываем фактические расстояния во времени
        times = []
        for j in range(3):
            start_price = movements[i+j]['start_price']
            end_price = movements[i+j]['end_price']
            time_distance = abs(end_price - start_price)
            times.append(time_distance)

La dificultad estriba en que el mercado rara vez muestra los números de Fibonacci exactos. Por ello, utilizamos el concepto de "desviación aceptable". Cada ratio encontrado se evalúa según su proximidad al valor teórico:

# Нормализация и поиск соответствий
        min_move = min(moves)
        normalized_moves = [m/min_move for m in moves]
        
        min_time_dist = min(times)
        if min_time_dist > 0:
            normalized_times = [t/min_time_dist for t in times]
            
            for j in range(len(fib_sequence)-2):
                fib_pattern = [fib_sequence[j], fib_sequence[j+1], fib_sequence[j+2]]
                
                time_matches = all(abs(normalized_times[k] - fib_pattern[k]) <= tolerance 
                                 for k in range(3))

Los patrones temporales resultaron especialmente interesantes. Hemos comprobado que el mercado suele formar movimientos cuyas duraciones se correlacionan como números de Fibonacci. Por ejemplo, si el primer movimiento ha durado 2 horas, el siguiente suele durar 3 horas y el tercero, 5 horas. Estas secuencias son mucho más frecuentes de lo que podríamos esperar de una distribución aleatoria.

if time_matches:
                time_patterns.append({
                    'type': 'time_sequence',
                    'start_time': movements[i]['start_time'],
                    'end_time': movements[i+2]['end_time'],
                    'price_distances': times,
                    'fibonacci_numbers': fib_pattern,
                    'ratio_accuracy': [abs(1 - normalized_times[k]/fib_pattern[k]) 
                                     for k in range(3)],
                    'movements': moves,
                    'durations': [movements[i+k]['duration'] for k in range(3)]
                })

Pero el descubrimiento más sorprendente realizado fue cuando empezamos a analizar la relación entre el precio y los patrones temporales. Resulta que cuando el precio forma una relación de Fibonacci, el momento del movimiento también suele coincidir con dicha secuencia. Es como si el mercado "recordara" esas cifras y las reprodujera una y otra vez, ¡tanto en el espacio como en el tiempo!

Vamos a analizar la exactitud de la correspondencia de las relaciones con los números de Fibonacci:

Histograma de la densidad de las relaciones temporales:

...Y de la densidad de la relación de precio:

Y aquí tenemos la densidad de la relación entre la duración del movimiento en horas, y el tamaño del movimiento:

Merece especial atención el fenómeno de la "resonancia temporal", una situación en la que coinciden en un punto varias pautas temporales y de precios de Fibonacci. En estos momentos, la probabilidad de una previsión acertada aumenta hasta el 85-90%, lo cual descubre interesantes oportunidades comerciales a corto plazo.


Aplicación práctica de los patrones encontrados

Los hallazgos teóricos son interesantes, pero lo más importante para un tráder es su posible aplicación práctica. Hemos desarrollado un sistema para predecir los próximos movimientos de los precios basándonos en los patrones identificados:

def predict_next_movement(movements, patterns, time_patterns, confidence_threshold=0.95):
    predictions = []
    last_movement = movements[-1]
    last_price = last_movement['end_price']
    last_movement_size = last_movement['movement']
    
    # Анализ паттернов с высокой точностью
    high_accuracy_patterns = [p for p in patterns 
                            if p['type'] == 'price_ratio' 
                            and (1 - p['accuracy']) >= confidence_threshold]
    
    # Группировка паттернов по соотношениям
    ratio_groups = {}
    for pattern in high_accuracy_patterns:
        ratio = pattern['ratio_name']
        if ratio not in ratio_groups:
            ratio_groups[ratio] = []
        ratio_groups[ratio].append(pattern)

El algoritmo considera no solo la frecuencia de aparición de determinados ratios, sino también su precisión, sus características temporales y el contexto del mercado. Para cada predicción, se calcula un nivel de confianza:

for ratio_name, ratio_value in fib_ratios.items():
        patterns_with_ratio = ratio_groups.get(ratio_name, [])
        if not patterns_with_ratio:
            continue
        
        # Анализ направления движения
        up_count = sum(1 for p in patterns_with_ratio 
                      if p['movement2'] > p['movement1'])
        down_count = len(patterns_with_ratio) - up_count
        
        # Расчет вероятных целевых уровней
        target_levels = []
        for pattern in patterns_with_ratio:
            if pattern['movement1'] > 0:
                level = last_movement_size * pattern['movement2'] / pattern['movement1']
                target_levels.append(level)

Las pruebas con datos históricos han mostrado resultados impresionantes. En el 72% de los casos, cuando el sistema determina una alta probabilidad de formación de una relación de Fibonacci, el movimiento sí alcanza el nivel previsto. Pero aún más interesante resulta el hecho de que la precisión de la previsión mejore significativamente cuando coinciden los patrones de precio y tiempo.

# Корректировка прогнозов на основе временных паттернов
    time_patterns_high_accuracy = [p for p in time_patterns 
                                 if (1 - p['accuracy']) >= confidence_threshold]
    
    for pred in predictions:
        matching_time_patterns = [p for p in time_patterns_high_accuracy 
                                if p['ratio_name'] == pred['ratio']]
        if matching_time_patterns:
            avg_time_accuracy = np.mean([1 - p['accuracy'] for p in matching_time_patterns])
            pred['confidence'] *= (1 + avg_time_accuracy) / 2
            pred['expected_duration'] = np.mean([p['duration2'] for p in matching_time_patterns])

Por ejemplo, cuando tras un movimiento al alza de 0,00273 puntos en 2 horas, el sistema capta una relación de 0,618 tanto en precio como en tiempo, la probabilidad de alcanzar el nivel previsto aumenta al 85%. Parece que la antigua sabiduría de los pitagóricos sobre los patrones numéricos encuentra confirmación incluso en los mercados financieros modernos.

Tras ejecutar el código, vemos esta predicción:

Vamos a analizar la visualización del pronóstico:

Hemos prestado especial atención a la validación de los patrones encontrados en diferentes marcos temporales y pares de divisas. Resulta que los números de Fibonacci aparecen no solo en los gráficos horarios del EUR/USD, sino también en otros instrumentos populares. Al mismo tiempo, la precisión de las previsiones varía según la volatilidad del mercado y de la tendencia general. Lo interesante es que estas mismas relaciones se encuentran en cualquier otro conjunto de datos: en las distribuciones de temperatura, en las mediciones de presión e incluso en los gráficos de movimiento de los cuerpos celestes (uno de mis antiguos artículos trataba de la astronomía en el mercado, de ahí saqué el código).


Conclusión

Nuestra investigación no solo ha confirmado la existencia de patrones de Fibonacci en el mercado de divisas, sino que también ha descubierto una nueva dimensión en la comprensión de los movimientos del mercado. La síntesis de la antigua sabiduría matemática con los modernos algoritmos de aprendizaje automático nos ha permitido ver lo que ha escapado a los tráders durante décadas.

Un hallazgo clave es el descubrimiento de la "resonancia temporal", el asombroso fenómeno por el que el mercado sincroniza sus movimientos simultáneamente en el precio y en el espacio temporal, siguiendo las proporciones de la proporción áurea. Es como una danza cósmica de números, donde cada movimiento forma parte de un patrón mayor que obedece a una armonía matemática.

El algoritmo que hemos desarrollado, con una excelente precisión de previsión en determinadas condiciones, no solo supone una herramienta comercial: es una ventana a la naturaleza matemática de los procesos de mercado. Cada línea de código, cada función de búsqueda de patrones representa un ladrillo en el puente entre el caos y el orden, entre la aleatoriedad y la previsibilidad.

Traducción del ruso hecha por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/ru/articles/17168

Archivos adjuntos |
FiboPattern_4.py (26.52 KB)
Victor Golovkov
Victor Golovkov | 18 feb 2025 en 14:55
"fenómeno de resonancia temporal"
en otras palabras - ¿ha redescubierto los husos horarios de Fibonacci?
Inquiring
Inquiring | 19 feb 2025 en 12:16
¿Y cómo vería todo esto en mql4 o mql5?
Михалыч Трейдинг
Михалыч Трейдинг | 22 feb 2025 en 07:02

Eugene, ¡gracias! ¡Totalmente de acuerdo tanto con Pitágoras como contigo!

Desde hace muchos años este tema es uno de mis temas principales, que cavo, por desgracia, de forma manual. Es difícil, pero es útil - puntos de entrada mucho más precisos y la comprensión de qué objetivo puedo contar en función de la combinación de la sincronización y el tamaño de la corrección. Y de repente su artículo es una alegría sin medida por lo menos en el hecho de que vi un pitagórico 100% de ideas afines en su persona ).

Pero los archivos ".ru" adjuntos al artículo disminuyeron mi alegría - no sé "dónde ponerlo y con qué comer"....

Usted sabe cómo golpear la pared con alegría ))

Михалыч Трейдинг
Михалыч Трейдинг | 22 feb 2025 en 08:39
Михалыч Трейдинг #:

Pero los archivos ".ru" adjuntos al artículo disminuyeron mi alegría - no sé "dónde ponerlo y con qué comerlo"....

Con más ordenado y se dio cuenta de que incluso sólo para mirar - no es muy fácil.

Usted es el autor, su derecho a trabajar como quieras, pero creo que incluso los programadores aquí no son todos los fans de Python, y la mayoría de los presentes ... ni siquiera son programadores.

Así que si quieres estar más cerca de la gente - de alguna manera tratar de acercarse a ellos, para que la gente pueda ver sus resultados sin baile innecesario con panderetas.

PD: Admito que sólo yo soy tan estúpido y sólo por mí no hay que cambiar nada, por supuesto.

Integración de las API de los brókers con los Asesores Expertos usando MQL5 y Python Integración de las API de los brókers con los Asesores Expertos usando MQL5 y Python
En este artículo, analizaremos la implementación de MQL5 en colaboración con Python para realizar operaciones relacionadas con los brókers. Imagina tener un asesor experto (Expert Advisor, EA) funcionando continuamente alojado en un VPS, ejecutando operaciones en tu nombre. En algún momento, la capacidad de la EA para gestionar fondos se vuelve primordial. Esto incluye operaciones como recargar su cuenta de trading e iniciar retiradas. En este debate, analizaremos las ventajas y la aplicación práctica de estas funciones, garantizando una integración perfecta de la gestión de fondos en su estrategia comercial. ¡Estén atentos!
Analizamos el código binario de los precios en bolsa (Parte II): Convirtiendo a BIP39 y escribiendo un modelo GPT Analizamos el código binario de los precios en bolsa (Parte II): Convirtiendo a BIP39 y escribiendo un modelo GPT
Seguimos intentando descifrar los movimientos de los precios.... ¿Qué tal un análisis lingüístico del "diccionario de mercado" que obtendríamos convirtiendo el código binario de precios en BIP39? En el presente artículo, nos adentramos en un enfoque innovador del análisis de los datos bursátiles y exploramos cómo pueden aplicarse las modernas técnicas de procesamiento del lenguaje natural al lenguaje del mercado.
Cómo publicar código en CodeBase: Guía práctica Cómo publicar código en CodeBase: Guía práctica
En este artículo, analizaremos el proceso de publicación de diferentes tipos de programas para el terminal en la biblioteca de código fuente MQL5 usando ejemplos reales.
Redes neuronales en el trading: Aprendizaje multitarea basado en el modelo ResNeXt (Final) Redes neuronales en el trading: Aprendizaje multitarea basado en el modelo ResNeXt (Final)
Continuamos nuestra exploración del framework de aprendizaje multitarea basado en ResNeXt, que destaca por su modularidad, su alta eficiencia desde el punto de vista computacional y su capacidad de identificar patrones consistentes en los datos. El uso de un único codificador y de "cabezas" especializadas reduce el riesgo de sobreentrenamiento del modelo y mejora la calidad de las predicciones.