preview
Фибоначчи на Форекс (Часть I): Проверяем отношения цены и времени

Фибоначчи на Форекс (Часть I): Проверяем отношения цены и времени

MetaTrader 5Интеграция | 18 февраля 2025, 08:27
1 026 4
Yevgeniy Koshtenko
Yevgeniy Koshtenko

Введение

"Всё есть число" — провозгласил Пифагор в VI веке до нашей эры. Его последователи верили, что в основе мироздания лежат числовые отношения, а познание этих отношений открывает двери к пониманию и предсказанию любых процессов во Вселенной. Спустя два тысячелетия, эта интуитивная догадка древних греков получила неожиданное подтверждение в квантовой механике, теории относительности и теории хаоса — фундаментальные законы природы действительно выражаются через математические отношения.

В 1202 году итальянский математик Леонардо Пизанский, известный как Фибоначчи, опубликовал задачу о размножении кроликов. Вряд ли он мог предположить, что найденная им последовательность чисел станет одним из самых загадочных и широко обсуждаемых математических феноменов в истории человечества. Возможно, именно эта последовательность и её производные отношения являются одним из тех фундаментальных числовых законов, о которых говорили пифагорейцы.

Эта последовательность, где каждое следующее число равно сумме двух предыдущих (1, 1, 2, 3, 5, 8, 13, 21...), не только описывает рост популяции кроликов. Она проявляется в расположении листьев на стебле, спиралях морских раковин, строении человеческого тела и даже в структуре галактик. Но самое интригующее — числа Фибоначчи и их производные соотношения настойчиво проявляются в движениях финансовых рынков.

Если пифагорейцы были правы, и всё в мире действительно управляется числовыми отношениями, то рынок Форекс, несмотря на его кажущуюся хаотичность, тоже должен подчиняться этим законам. Но почему на рынке, где миллионы трейдеров принимают независимые решения, а котировки формируются под влиянием бесчисленных факторов, возникают паттерны, связанные с последовательностью Фибоначчи? И если эти паттерны действительно существуют, можно ли их использовать для прогнозирования, как предполагали древние греки?

В этом исследовании мы погрузимся в анализ более 100,000 движений цены на рынке Форекс, используя современные методы обработки данных и машинного обучения. Мы рассмотрим не только классические ценовые соотношения, но и временные паттерны — область, которой незаслуженно мало внимания уделяется в традиционном техническом анализе.

Наш подход будет строго научным: никаких предположений без статистического подтверждения, никаких выводов без количественной оценки достоверности. Мы проверим гипотезу о том, что рынок действительно "помнит" числа Фибоначчи, и выясним, можно ли использовать эту память для получения прибыли, подтверждая или опровергая древнюю мудрость пифагорейцев о предсказуемости мира через числовые отношения.

В первой части исследования мы сосредоточимся на фундаментальном вопросе: существуют ли статистически значимые соотношения между движениями цены и времени, соответствующие числам Фибоначчи? Результаты этого анализа могут не только изменить ваш взгляд на природу рыночных движений, но и приблизить нас к пониманию того, насколько глубоко числовые закономерности проникают в ткань реальности.



История вопроса: от древности к алгоритмам

Современные трейдеры чаще всего используют числа Фибоначчи для построения уровней коррекции (23.6%, 38.2%, 61.8%) или в виде "сетки Фибоначчи". Однако, такой подход использует лишь малую часть потенциала этих удивительных чисел. Мало кто знает, что ещё в 1930-х годах Ральф Нельсон Эллиотт, создавая свою знаменитую Волновую теорию, обнаружил не только ценовые, но и временные соотношения Фибоначчи в движениях рынка.

Однако, во времена Эллиотта не существовало компьютеров и современных методов анализа данных. Все наблюдения делались вручную, а статистическая проверка гипотез была крайне трудоемкой. Сегодня, с появлением мощных алгоритмов и возможностью обработки больших массивов данных, мы можем проверить эти идеи на новом уровне точности.



Методология исследования

В нашем исследовании мы анализируем не просто отдельные движения цены, а ищем взаимосвязи между несколькими последовательными движениями. Для этого мы разработали специальный алгоритм, который:

  1. Определяет значимые движения цены, отфильтровывая рыночный "шум"
  2. Анализирует соотношения между соседними движениями
  3. Ищет временные паттерны между точками разворота
  4. Оценивает статистическую значимость найденных соотношений

Особое внимание мы уделяем тому, что в реальности рыночные движения редко образуют точные числа Фибоначчи. Поэтому мы используем концепцию "допустимого отклонения" и анализируем, как часто реальные движения попадают в заданные диапазоны вокруг теоретических значений.



Технические детали реализации

За красивой идеей поиска чисел Фибоначчи в движениях рынка стоит серьёзная техническая реализация. Чтобы воплотить её в жизнь, нам потребовался Python и библиотека MetaTrader 5 для доступа к историческим данным. Начнём с базового функционала — генерации чисел Фибоначчи и их отношений:

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

Первая функция генерирует классическую последовательность Фибоначчи, а вторая создаёт словарь с ключевыми отношениями, которые мы будем искать в движениях цены. Но главная сложность заключалась в определении самих движений. На графике цены постоянно колеблются, образуя множество мелких движений, которые по сути являются рыночным шумом. После долгих экспериментов, мы разработали алгоритм, который успешно справляется с этой задачей:

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

Этот алгоритм отслеживает развороты цены и фиксирует движение, только если оно превышает заданный минимальный порог. Каждое движение характеризуется не только величиной изменения цены, но и длительностью во времени, что позволяет нам анализировать как ценовые, так и временные соотношения.

Первые результаты анализа пары EUR/USD оказались поразительными. В выборке из тысячи часовых свечей мы обнаружили 51 значимое движение цены, которые образовали 87 различных соотношений Фибоначчи с точностью более 99%. Особенно часто встречается знаменитое "золотое сечение" (61.8%) и связанные с ним уровни 38.2% и 23.6%.



Реализация поиска паттернов

Наиболее сложной и интересной частью исследования стал поиск соотношений Фибоначчи в движениях цены. Здесь недостаточно просто сравнивать числа — нужно учитывать множество факторов и искать закономерности в нескольких измерениях одновременно. Вот как мы решили эту задачу:

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)

Сложность в том, что рынок редко показывает точные числа Фибоначчи. Поэтому мы используем концепцию "допустимого отклонения". Каждое найденное соотношение оценивается с точки зрения близости к теоретическому значению:

# Нормализация и поиск соответствий
        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))

Особенно интересными оказались временные паттерны. Мы обнаружили, что рынок часто формирует движения, длительность которых соотносится как числа Фибоначчи. Например, если первое движение заняло 2 часа, следующее часто длится 3 часа, а третье — 5 часов. Такие последовательности встречаются значительно чаще, чем можно было бы ожидать при случайном распределении.

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

Но самое удивительное открытие мы сделали, когда начали анализировать взаимосвязь между ценовыми и временными паттернами. Оказалось, что когда цена образует соотношение Фибоначчи, время движения тоже часто соответствует этой последовательности! Словно рынок "помнит" эти числа и воспроизводит их снова и снова, как в пространстве, так и во времени!

Рассмотрим точность соответствия отношений числам Фибоначчи:

Гистограмма плотности отношений времени:

...И плотности отношения по цене:

А вот и плотность отношения длительности движений в часах, и размера движений:

Отдельного внимания заслуживает обнаруженный нами феномен "временного резонанса" — ситуации, когда несколько временных и ценовых паттернов Фибоначчи совпадают в одной точке. В такие моменты вероятность точного прогноза возрастает до 85-90%, что открывает интересные возможности для краткосрочной торговли.


Практическое применение найденных закономерностей

Теоретические находки интересны, но для трейдера главное — возможность их практического применения. Мы разработали систему прогнозирования следующих движений цены, основанную на выявленных закономерностях:

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)

Алгоритм учитывает не только частоту появления определенных соотношений, но и их точность, временные характеристики и рыночный контекст. Для каждого прогноза рассчитывается уровень уверенности:

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)

Тестирование на исторических данных показало впечатляющие результаты. В 72% случаев, когда система определяла высокую вероятность формирования соотношения Фибоначчи, движение действительно достигало прогнозируемого уровня. Но ещё более интересным оказалось то, что точность прогноза существенно повышается при совпадении ценовых и временных паттернов.

# Корректировка прогнозов на основе временных паттернов
    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])

Например, когда после движения вверх на 0.00273 пункта в течение 2 часов система фиксировала соотношение 0.618 как в цене, так и во времени, вероятность достижения прогнозируемого уровня возрастала до 85%. Похоже, древняя мудрость пифагорейцев о числовых закономерностях находит подтверждение даже на современных финансовых рынках.

После выполнения кода мы видим такой прогноз:

Рассмотрим визуализацию прогноза:

Особое внимание мы уделили валидации найденных закономерностей на различных таймфреймах и валютных парах. Оказалось, что числа Фибоначчи проявляются не только на часовых графиках EUR/USD, но и на других популярных инструментах. При этом точность прогнозов варьируется, в зависимости от волатильности рынка и общего тренда. Самое интересное — что эти же отношения встречаются в любом другом датасете — и в распределении температуры, и в результатах измерений давления, и даже в графиках движений небесных тел (одна из моих старых статей была посвящена астрономии на рынке, и я взял код оттуда).


Заключение

В ходе нашего исследования мы не просто подтвердили существование закономерностей Фибоначчи на рынке Форекс, а открыли новое измерение в понимании рыночных движений. Синтез древней математической мудрости с современными алгоритмами машинного обучения позволил увидеть то, что ускользало от внимания трейдеров десятилетиями.

Ключевой находкой стало обнаружение "временного резонанса" — удивительного явления, когда рынок синхронизирует свои движения одновременно в пространстве цены и времени, следуя пропорциям золотого сечения. Это словно космический танец чисел, где каждое движение является частью большего паттерна, подчиняющегося математической гармонии.

Разработанный нами алгоритм с прекрасной точностью прогнозов в определенных условиях, не просто инструмент для торговли — это окно в математическую природу рыночных процессов. Каждая строка кода, каждая функция поиска паттернов — это кирпичик в мосту между хаосом и порядком, между случайностью и предсказуемостью.

Прикрепленные файлы |
FiboPattern_4.py (26.52 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (4)
Victor Golovkov
Victor Golovkov | 18 февр. 2025 в 14:55
"феномен временного резонанса"
иными словами - вы переоткрыли временные зоны Фибоначчи?
Inquiring
Inquiring | 19 февр. 2025 в 12:16
А как бы это все в mql4 или mql5 увидеть?
Михалыч Трейдинг
Михалыч Трейдинг | 22 февр. 2025 в 07:02

Евгений, спасибо! Полностью согласен и с Пифагором, и с Вами!

Уже не один год эта тема - одна из главных моих тем, которые я копаю, увы, вручную. Идёт тяжело, но полезно - гораздо более точные точки поиска входов и понимание на какую цель можно рассчитывать в зависимости от сочетания тайминга и размеров коррекции. И вдруг ваша статья - радость немеряная хотя бы в том, что увидел в вашем лице 100%-го единомышленника-пифагорейца )

Но приложенные к статье файлы ".ру" радости поубавили - не знаю "куда класть и с чем есть"...

Прям знаете, как с радостью удариться в стену ))

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

Но приложенные к статье файлы ".ру" радости поубавили - не знаю "куда класть и с чем есть"...

С большего разобрался и понял, что даже просто посмотреть - не очень просто.

Вы автор, ваше право работать как вам удобно, но думаю, что здесь даже программисты - не все поклонники Пайтона, а большинство присутствующих ... даже не программисты.

Так что если хотите быть ближе к народу - как-нибудь попытайтесь к нему приблизиться, чтобы люди могли видеть ваши результаты без лишних танцев с бубнами.

PS: допускаю, что это только я такой тупой и ради меня одного ничего менять не надо, конечно.

От начального до среднего уровня: Массивы и строки (II) От начального до среднего уровня: Массивы и строки (II)
В этой статье я покажу, что хотя мы всё еще находимся на очень базовой стадии программирования, мы уже можем реализовать несколько интересных приложений. В данном случае мы создадим довольно простой генератор паролей. Таким образом мы сможем применить некоторые концепции, которые объяснялись до этого. Кроме того, мы рассмотрим, как можно разработать решения для некоторых конкретных проблем.
Переосмысливаем классические стратегии (Часть IV): SP500 и казначейские облигации США Переосмысливаем классические стратегии (Часть IV): SP500 и казначейские облигации США
В этой серии статей мы анализируем классические торговые стратегии с использованием современных алгоритмов, чтобы определить, можно ли улучшить стратегию с помощью искусственного интеллекта (ИИ). В сегодняшней статье мы рассмотрим классический подход к торговле индексом SP500, используя его взаимосвязь с казначейскими облигациями США (US Treasury Notes).
Нейросети в трейдинге: Двухмерные модели пространства связей (Окончание) Нейросети в трейдинге: Двухмерные модели пространства связей (Окончание)
Продолжаем знакомство с инновационным фреймворком Chimera — двухмерной моделью пространства состояний, использующей нейросетевые технологии для анализа многомерных временных рядов. Этот метод обеспечивает высокую точность прогнозирования при низких вычислительных затратах.
Нейросети в трейдинге: Двухмерные модели пространства связей (Chimera) Нейросети в трейдинге: Двухмерные модели пространства связей (Chimera)
Откройте для себя инновационный фреймворк Chimera — двухмерную модель пространства состояний, использующую нейросети для анализа многомерных временных рядов. Этот метод предлагает высокую точность с низкими вычислительными затратами, превосходя традиционные подходы и архитектуры Transformer.