Русский
preview
Fibonacci no Forex (Parte I): Testando relações entre preço e tempo

Fibonacci no Forex (Parte I): Testando relações entre preço e tempo

MetaTrader 5Integração |
123 4
Yevgeniy Koshtenko
Yevgeniy Koshtenko

Introdução

"Tudo é número", proclamou Pitágoras no século VI a.C. Seus seguidores acreditavam que as relações numéricas estavam na base do universo, e que conhecer essas relações abriria portas para compreender e prever qualquer processo no cosmos. Dois milênios depois, essa intuição dos antigos gregos foi inesperadamente confirmada pela mecânica quântica, teoria da relatividade e teoria do caos — as leis fundamentais da natureza realmente se expressam por meio de relações matemáticas.

Em 1202, o matemático italiano Leonardo de Pisa, conhecido como Fibonacci, publicou o problema da reprodução dos coelhos. É pouco provável que ele imaginasse que a sequência de números que descobriu se tornaria um dos fenômenos matemáticos mais enigmáticos e amplamente discutidos da história da humanidade. Talvez essa sequência e as proporções derivadas dela sejam exatamente aquelas leis numéricas fundamentais às quais os pitagóricos se referiam.

Essa sequência, em que cada número é a soma dos dois anteriores (1, 1, 2, 3, 5, 8, 13, 21...), não descreve apenas o crescimento da população de coelhos. Ela aparece na disposição das folhas ao longo de um caule, nas espirais das conchas do mar, na estrutura do corpo humano e até na formação das galáxias. Mas o mais intrigante é que os números de Fibonacci e suas proporções derivadas aparecem com insistência nos movimentos dos mercados financeiros.

Se os pitagóricos estavam certos, e tudo no mundo é realmente regido por relações numéricas, então o mercado Forex, por mais caótico que pareça, também deve seguir essas leis. Mas por que em um mercado onde milhões de traders tomam decisões independentes e os preços são formados por inúmeros fatores, surgem padrões associados à sequência de Fibonacci? E se esses padrões realmente existem, será que podemos usá-los para previsão, como imaginavam os antigos gregos?

Neste estudo, vamos mergulhar na análise de mais de 100.000 movimentos de preço no mercado Forex, usando métodos modernos de processamento de dados e aprendizado de máquina. Vamos explorar não apenas as clássicas proporções de preço, mas também os padrões de tempo, que são uma área que recebe atenção injustamente limitada na análise técnica tradicional.

Nossa abordagem será estritamente científica: nenhuma suposição sem confirmação estatística, nenhuma conclusão sem uma avaliação quantitativa da confiabilidade. Vamos testar a hipótese de que o mercado realmente "lembra" dos números de Fibonacci e descobrir se essa memória pode ser usada para obter lucro, confirmando ou refutando a antiga sabedoria pitagórica sobre a previsibilidade do mundo por meio de proporções numéricas.

Na primeira parte do estudo, vamos focar em uma questão fundamental: existem relações estatisticamente significativas entre os movimentos de preço e de tempo que correspondem aos números de Fibonacci? Os resultados dessa análise podem não apenas transformar sua visão sobre a natureza dos movimentos de mercado, mas também nos aproximar da compreensão de até que ponto as regularidades numéricas penetram na estrutura da realidade.



Histórico da questão: da antiguidade aos algoritmos

Hoje em dia, traders modernos usam com mais frequência os números de Fibonacci para traçar níveis de correção (23.6%, 38.2%, 61.8%) ou através da chamada "rede de Fibonacci". No entanto, essa abordagem aproveita apenas uma fração do potencial desses números fascinantes. Poucos sabem que já na década de 1930 Ralph Nelson Elliott, ao desenvolver sua famosa Teoria das Ondas, descobriu não apenas proporções de preço, mas também proporções de tempo baseadas em Fibonacci nos movimentos de mercado.

Na época de Elliott, porém, não existiam computadores nem métodos modernos de análise de dados. Todas as observações eram feitas manualmente, e a verificação estatística de hipóteses era extremamente trabalhosa. Hoje, com o advento de algoritmos poderosos e a capacidade de processar grandes volumes de dados, podemos testar essas ideias com um novo nível de precisão.



Metodologia da pesquisa

Neste estudo, não analisamos apenas movimentos isolados de preço, mas buscamos conexões entre diversos movimentos consecutivos. Para isso, desenvolvemos um algoritmo específico que:

  1. Identifica movimentos significativos de preço, filtrando o "ruído" do mercado
  2. Analisa as proporções entre os movimentos consecutivos
  3. Busca padrões temporais entre os pontos de reversão
  4. Avalia a significância estatística das proporções encontradas

Damos atenção especial ao fato de que, na prática, os movimentos de mercado raramente formam números de Fibonacci exatos. Por isso, utilizamos o conceito de "desvio aceitável" e analisamos com que frequência os movimentos reais caem dentro de faixas próximas aos valores teóricos.



Detalhes técnicos da implementação

Por trás da bela ideia de buscar números de Fibonacci nos movimentos do mercado, existe uma implementação técnica bastante robusta. Para colocá-la em prática, utilizamos Python e a biblioteca MetaTrader 5 para acessar os dados históricos. Começamos com o funcional básico, especificamente com a geração dos números de Fibonacci e de suas proporções:

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

A primeira função gera a sequência clássica de Fibonacci, e a segunda cria um dicionário com as proporções-chave que buscamos nos movimentos de preço. Mas o principal desafio estava em definir os próprios movimentos. No gráfico, os preços oscilam constantemente, formando inúmeros pequenos deslocamentos que, na prática, são apenas ruído de mercado. Após muitos experimentos, desenvolvemos um algoritmo que consegue lidar com isso de forma eficaz:

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

Esse algoritmo detecta reversões de preço e só registra um movimento quando ele ultrapassa um determinado limiar mínimo. Cada movimento é caracterizado não apenas pela variação no preço, mas também pela duração no tempo, o que nos permite analisar tanto as proporções de preço quanto de tempo.

Os primeiros resultados da análise do par EUR/USD foram impressionantes. Em uma amostra de mil velas horárias, identificamos 51 movimentos significativos de preço, que formaram 87 proporções de Fibonacci distintas com precisão superior a 99%. Os níveis mais frequentes foram justamente os famosos 61.8% (a "proporção áurea") e seus derivados 38.2% e 23.6%.



Implementação da busca por padrões

A parte mais complexa e fascinante da pesquisa foi a identificação das proporções de Fibonacci nos movimentos de preço. Aqui não basta simplesmente comparar números, pois é preciso levar em conta diversos fatores e buscar padrões em múltiplas dimensões ao mesmo tempo. Eis como resolvemos essa tarefa:

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)

A dificuldade está no fato de que o mercado raramente forma números exatos de Fibonacci. Por isso, aplicamos a ideia de "desvio aceitável". Cada proporção encontrada é avaliada com base em sua proximidade ao 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))

Os padrões temporais se mostraram particularmente interessantes. Descobrimos que o mercado frequentemente forma movimentos cuja duração segue os números de Fibonacci. Por exemplo, se o primeiro movimento durou 2 horas, o próximo costuma durar 3 horas, e o terceiro, 5 horas. Essas sequências aparecem com muito mais frequência do que seria esperado por pura aleatoriedade.

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)]
                })

Mas a descoberta mais surpreendente surgiu quando começamos a analisar a relação entre os padrões de preço e de tempo. Verificamos que, quando o preço forma uma proporção de Fibonacci, a duração do movimento também frequentemente segue essa sequência! É como se o mercado "lembrasse" desses números e os repetisse continuamente, tanto no espaço quanto no tempo!

Vamos analisar a precisão da correspondência entre as proporções e os números de Fibonacci:

Histograma de densidade das proporções de tempo:

...E a densidade das proporções de preço:

Aqui está a densidade das proporções tanto da duração dos movimentos em horas quanto da magnitude dos movimentos:

Merece destaque especial o fenômeno que identificamos como "ressonância temporal", ou seja, situações em que múltiplos padrões de tempo e preço baseados em Fibonacci convergem em um único ponto. Nessas ocasiões, a probabilidade de uma previsão precisa chega a 85–90%, o que abre possibilidades interessantes para operações de curto prazo.


Aplicação prática das regularidades encontradas

Descobertas teóricas são fascinantes, mas o que realmente importa para o trader é a possibilidade de aplicar esse conhecimento na prática. Desenvolvemos um sistema de previsão para os próximos movimentos de preço com base nas regularidades identificadas:

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)

O algoritmo leva em conta não apenas a frequência com que certas proporções aparecem, mas também sua precisão, as características temporais e o contexto de mercado. Para cada previsão, é calculado um nível de confiança:

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)

Os testes realizados com dados históricos apresentaram resultados impressionantes. Em 72% dos casos, quando o sistema identificava uma alta probabilidade de formação de uma proporção de Fibonacci, o movimento realmente atingia o nível previsto. Mas ainda mais interessante foi observar que a precisão das previsões aumentava significativamente quando havia coincidência entre os padrões de preço e de tempo.

# Корректировка прогнозов на основе временных паттернов
    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 exemplo, quando após um movimento de alta de 0.00273 pontos ao longo de 2 horas o sistema detectava a proporção 0.618 tanto no preço quanto no tempo, a chance de o nível previsto ser atingido subia para 85%. Parece que a antiga sabedoria pitagórica sobre regularidades numéricas encontra confirmação até mesmo nos mercados financeiros contemporâneos.

Após executar o código, vemos uma previsão como esta:

Vamos examinar a visualização da previsão:

Dedicamos atenção especial à validação das regularidades encontradas em diferentes timeframes e pares de moedas. Verificamos que os números de Fibonacci se manifestam não apenas nos gráficos horários do EUR/USD, mas também em outros instrumentos populares. A precisão das previsões varia de acordo com a volatilidade do mercado e a tendência geral. O mais curioso é que essas mesmas proporções aparecem em qualquer outro conjunto de dados, seja na distribuição da temperatura, nos resultados de medições de pressão, ou até nos gráficos de movimento dos corpos celestes (um dos meus artigos antigos era sobre astronomia no mercado, e usei o código de lá).


Considerações finais

Ao longo desta pesquisa, não apenas confirmamos a existência de regularidades de Fibonacci no mercado Forex, como também revelamos uma nova dimensão na compreensão dos movimentos de mercado. A síntese da antiga sabedoria matemática com algoritmos modernos de aprendizado de máquina nos permitiu enxergar o que passou despercebido por traders durante décadas.

A descoberta-chave foi a identificação do "ressonância temporal", um fenômeno surpreendente, no qual o mercado sincroniza seus movimentos simultaneamente no espaço do preço e no tempo, seguindo as proporções da razão áurea. É como uma dança cósmica dos números, onde cada movimento faz parte de um padrão maior, obedecendo a uma harmonia matemática.

O algoritmo que desenvolvemos, com sua excelente precisão de previsões em determinadas condições, não é apenas uma ferramenta de trading, como uma janela para a natureza matemática dos processos de mercado. Cada linha de código, cada função de busca por padrões, é um tijolo na ponte entre o caos e a ordem, entre a aleatoriedade e a previsibilidade.

Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/17168

Arquivos anexados |
FiboPattern_4.py (26.52 KB)
Últimos Comentários | Ir para discussão (4)
Victor Golovkov
Victor Golovkov | 18 fev. 2025 em 14:55
"fenômeno de ressonância temporal"
em outras palavras - você redescobriu os fusos horários de Fibonacci?
Inquiring
Inquiring | 19 fev. 2025 em 12:16
E como eu veria tudo isso no mql4 ou mql5?
Михалыч Трейдинг
Михалыч Трейдинг | 22 fev. 2025 em 07:02

Eugene, obrigado! Concordo totalmente com Pitágoras e com você!

Há muitos anos, esse tópico é um dos meus principais tópicos, que, infelizmente, eu cava manualmente. É difícil, mas é útil - pontos de entrada muito mais precisos e compreensão do alvo com o qual posso contar, dependendo da combinação de tempo e tamanho da correção. E, de repente, seu artigo é uma alegria incomensurável, pelo menos pelo fato de eu ter visto um pitagórico 100% afim em sua pessoa).

Mas os arquivos ".ru" anexados ao artigo diminuíram minha alegria - não sei "onde colocar e com o que comer"....

Você sabe como bater na parede com alegria ))

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

Mas os arquivos ".ru" anexados ao artigo diminuíram minha alegria - não sei "onde colocar e com o que comer"....

Com mais detalhes, percebi que não é muito fácil nem mesmo dar uma olhada.

Você é o autor, tem o direito de trabalhar como quiser, mas acho que mesmo os programadores aqui não são todos fãs de Python, e a maioria dos presentes ... não são nem mesmo programadores.

Portanto, se você quer estar mais próximo das pessoas - tente de alguma forma se aproximar delas, para que as pessoas possam ver seus resultados sem danças desnecessárias com pandeiros.

PS: Admito que sou apenas eu que sou tão estúpido e, somente por minha causa, nada deve ser mudado, é claro.

Algoritmo de busca circular — Circle Search Algorithm (CSA) Algoritmo de busca circular — Circle Search Algorithm (CSA)
Este artigo apresenta um novo algoritmo metaheurístico de otimização, o CSA (Circle Search Algorithm), baseado nas propriedades geométricas do círculo. O algoritmo utiliza o princípio de movimentação de pontos ao longo das tangentes para encontrar a solução ideal, combinando fases de diversificação global e intensificação local.
Redes neurais em trading: Treinamento multitarefa baseado no modelo ResNeXt (Conclusão) Redes neurais em trading: Treinamento multitarefa baseado no modelo ResNeXt (Conclusão)
Seguimos com a exploração do framework de aprendizado multitarefa baseado na arquitetura ResNeXt, que se destaca pela modularidade, alta eficiência computacional e pela capacidade de identificar padrões estáveis nos dados. O uso de um codificador único e de "cabeças" especializadas reduz o risco de overfitting do modelo e aumenta a qualidade das previsões.
Desenvolvendo um EA multimoeda (Parte 22): Início da transição para substituição dinâmica de configurações Desenvolvendo um EA multimoeda (Parte 22): Início da transição para substituição dinâmica de configurações
Se decidimos automatizar a execução da otimização periódica, também precisamos cuidar da atualização automática das configurações dos EAs que já estão operando na conta de negociação. Isso também deve permitir rodar o EA no testador de estratégias e alterar suas configurações dentro de uma única execução.
Analisando o código binário dos preços no mercado (Parte II): Convertendo para BIP39 e criando um modelo GPT Analisando o código binário dos preços no mercado (Parte II): Convertendo para BIP39 e criando um modelo GPT
Seguimos com as tentativas de decifrar os movimentos dos preços... Que tal uma análise linguística do "vocabulário do mercado", que obtemos ao converter o código binário do preço para BIP39? Neste artigo, vamos nos aprofundar em uma abordagem inovadora para a análise de dados de mercado e explorar como os métodos modernos de processamento de linguagem natural podem ser aplicados ao idioma do mercado.