Создание торговой стратегии на основе времени и скользящей средней Фибоначчи.

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

Я только что опубликовал новую книгу после успеха New Technical Indicators in Python. Он содержит более полное описание и добавление сложных торговых стратегий со страницей Github, посвященной постоянно обновляемому коду. Если вы считаете, что это вас заинтересует, не стесняйтесь перейти по приведенной ниже ссылке или, если вы предпочитаете купить версию в формате PDF, вы можете связаться со мной в Linkedin.



Временной паттерн Фибоначчи

Леонардо Боначчи, также известный как Леонардо Фибоначчи (это прозвище, чтобы сказать сын Боначчи), создал одну из самых увлекательных серий в нашей вселенной, используя простые методы сложения при наблюдении за популяциями кроликов. Честно говоря, есть некоторые свидетельства того, что индийские математики знали эту последовательность заранее, мы будем придерживаться широко признанного факта, что Фибоначчи придумал последовательность (хотя, зная яркую научную и математическую историю индийских исследователей, я бы не удивляйтесь, узнав, что они были первыми, кто это открыл).

Числа Фибоначчи просто получаются с помощью следующей простой формулы для n ›2:

Это дает нам следующую последовательность, уходящую в бесконечность:

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ….

Паттерн объединяет время, цену и последовательность Фибоначчи, чтобы показать, обеспечивают ли они точки разворота или нет. Вот основная интуиция:

  • Для бычьего временного паттерна Фибоначчи нам нужно 8 закрытий, где каждое закрытие ниже, чем закрытие 5 периодов назад, ниже, чем закрытие 3 периода назад, и ниже, чем закрытие 1 период назад. По завершении этого паттерна у нас будет бычий сигнал. Любое прерывание последовательности приведет к аннулированию шаблона.
  • Для медвежьей временной модели Фибоначчи нам нужно 8 закрытий, где каждое закрытие выше, чем закрытие 5 периодов назад, выше, чем закрытие 3 периода назад, и выше, чем закрытие 1 период назад. По завершении этого паттерна у нас будет медвежий сигнал. Любое прерывание последовательности приведет к аннулированию шаблона.

def fibonacci_timing_pattern(Data, count, step, step_two, step_three, close, buy, sell):
   
    # Bullish Fibonacci Timing Pattern
    counter = -1    
    for i in range(len(Data)):    
        if Data[i, close] < Data[i - step, close] and \
           Data[i, close] < Data[i - step_two, close] and \
           Data[i, close] < Data[i - step_three, close]:
               
            Data[i, buy] = counter
            counter += -1 
            
            if counter == -count - 1:
                counter = 0
            else:
                continue   
            
        elif Data[i, close] >= Data[i - step, close]:
            counter = -1 
            Data[i, buy] = 0 
        
    # Bearish Fibonacci Timing Pattern
    counter = 1 
    
    for i in range(len(Data)):
        if Data[i, close] > Data[i - step, close] and \
           Data[i, close] > Data[i - step_two, close] and \
           Data[i, close] > Data[i - step_three, close]: 
               
            Data[i, sell] = counter 
            counter += 1        
            if counter == count + 1: 
                counter = 0            
            else:
                continue   
            
        elif Data[i, close] <= Data[i - step, close]: 
            counter = 1 
            Data[i, sell] = 0 
      
    return Data
# Using the function
count = 8
step = 5
step_two = 3
step_three = 2
my_data = fibonacci_timing_pattern(my_data, count, step, step_two, step_three, 3, 6, 7)

Мы можем добавить столько столбцов, сколько захотим, в массив данных, следовательно, в приведенном выше примере в столбцы 6 и 7 соответственно помещены бычьи и медвежьи подсчеты. Помните, чтобы добавить достаточное количество столбцов

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

На некоторых парах это может казаться более распространенным, и это связано с особенностями рынка и его волатильностью. Иногда достаточно одного хода, чтобы аннулировать весь паттерн. График выше показывает USDCAD.

Скользящая средняя Фибоначчи

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

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

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

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

Чтобы закодировать простую скользящую среднюю, мы можем следовать этому синтаксису в Python, убедившись, что мы определили основные функции манипуляции, также показанные ниже:

# The function to add a certain number of columns
def adder(Data, times):
    
    for i in range(1, times + 1):
    
        z = np.zeros((len(Data), 1), dtype = float)
        Data = np.append(Data, z, axis = 1)                       
 
    return Data
# The function to deleter a certain number of columns
def deleter(Data, index, times):
    
    for i in range(1, times + 1):
    
        Data = np.delete(Data, index, axis = 1)                   
    return Data
# The function to delete a certain number of rows from the beginning
def jump(Data, jump):
    
    Data = Data[jump:, ]
    
    return Data
def ma(Data, lookback, close, where):           
    Data = adder(Data, 1)          
    for i in range(len(Data)):                     
      try:
        Data[i, where] = (Data[i - lookback + 1:i + 1, close].mean())
     
      except IndexError:
        pass 
   
    # Cleaning
    Data = jump(Data, lookback)           
    return Data

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

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

def ema(Data, alpha, lookback, what, where):
    
    alpha = alpha / (lookback + 1.0)
    beta  = 1 - alpha
    
    # First value is a simple SMA
    Data = ma(Data, lookback, what, where)
    
    # Calculating first EMA
    Data[lookback + 1, where] = (Data[lookback + 1, what] * alpha) + (Data[lookback, where] * beta)            
    # Calculating the rest of EMA
    for i in range(lookback + 2, len(Data)):
      try:
        Data[i, where] = (Data[i, what] * alpha) + (Data[i - 1, where] * beta)
        
            except IndexError:
                pass
    return Data

Теперь, когда мы разобрались с экспоненциальной скользящей средней, мы приступим к созданию скользящей средней Фибоначчи.

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

  • Мы вычисляем экспоненциальные скользящие средние, используя следующие ретроспективные данные {2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181}.
  • Делим сумму экспоненциальных скользящих средних на их количество. В нашем случае мы разделим на 17.
  • Постройте скользящую среднюю Фибоначчи рядом с рыночной ценой.

def fibonnaci_moving_average(Data, where):
    
    # Adding Columns
    Data = adder(Data, 40)
    
    # Calculating Different Moving Averages
    Data = ema(Data, 2, 3,    1, where)
    Data = ema(Data, 2, 5,    1, where + 1)    
    Data = ema(Data, 2, 8,    1, where + 2)    
    Data = ema(Data, 2, 13,   1, where + 3)    
    Data = ema(Data, 2, 21,   1, where + 4)    
    Data = ema(Data, 2, 34,   1, where + 5)    
    Data = ema(Data, 2, 55,   1, where + 6)    
    Data = ema(Data, 2, 89,   1, where + 7)    
    Data = ema(Data, 2, 144,  1, where + 8)    
    Data = ema(Data, 2, 233,  1, where + 9)    
    Data = ema(Data, 2, 377,  1, where + 10)    
    Data = ema(Data, 2, 610,  1, where + 11)    
    Data = ema(Data, 2, 987,  1, where + 12)    
    Data = ema(Data, 2, 1597, 1, where + 13) 
    Data = ema(Data, 2, 2584, 1, where + 14) 
    Data = ema(Data, 2, 4181, 1, where + 15) 
    Data = ema(Data, 2, 6765, 1, where + 16)            
    Data[:, where + 17] = Data[:, where] +  Data[:, where + 1] +     Data[:, where + 2] + Data[:, where + 3] + Data[:, where + 4] + Data[:, where + 5] + Data[:, where + 6] +  Data[:, where + 7] + Data[:, where + 8] + Data[:, where + 9] + Data[:, where + 10] + Data[:, where + 11] + Data[:, where + 12] + Data[:, where + 13] + Data[:, where + 14] + Data[:, where + 15] + Data[:, where + 16]    Data[:, where + 17] = Data[:, where + 17] / 17        
    Data = deleter(Data, 4, 17)
 
    # Calculating Different Moving Averages
    Data = ema(Data, 2, 3,    2, where + 1)
    Data = ema(Data, 2, 5,    2, where + 2)    
    Data = ema(Data, 2, 8,    2, where + 3)    
    Data = ema(Data, 2, 13,   2, where + 4)    
    Data = ema(Data, 2, 21,   2, where + 5)    
    Data = ema(Data, 2, 34,   2, where + 6)    
    Data = ema(Data, 2, 55,   2, where + 7)    
    Data = ema(Data, 2, 89,   2, where + 8)    
    Data = ema(Data, 2, 144,  2, where + 9)    
    Data = ema(Data, 2, 233,  2, where + 10)    
    Data = ema(Data, 2, 377,  2, where + 11)    
    Data = ema(Data, 2, 610,  2, where + 12)    
    Data = ema(Data, 2, 987,  2, where + 13)    
    Data = ema(Data, 2, 1597, 2, where + 14) 
    Data = ema(Data, 2, 2584, 2, where + 15) 
    Data = ema(Data, 2, 4181, 2, where + 16) 
    Data = ema(Data, 2, 6765, 2, where + 17)  
    
    Data[:, where + 18] = Data[:, where + 1] + Data[:, where + 2] + Data[:, where + 3] + Data[:, where + 4] + Data[:, where + 5] + Data[:, where + 6] + Data[:, where + 7] + Data[:, where + 8] + Data[:, where + 9] + Data[:, where + 10] + Data[:, where + 11] + Data[:, where + 12] + Data[:, where + 13] + Data[:, where + 14] + Data[:, where + 15] + Data[:, where + 16] + Data[:, where + 17]    Data[:, where + 18] = Data[:, where + 18] / 17        
    Data = deleter(Data, 5, 17)
    
    return Data

Ясно, что скользящая средняя Фибоначчи показывает лучшие реакционные уровни, особенно когда цены падают. Способ торговать этим - просто инициировать противоположную торговлю, когда к ней приближаются рынки. Например, если рынок падает и движется к зоне скользящей средней, мы можем подумать о бычьей реакции, которая может произойти вокруг этой зоны. На приведенном ниже графике USDCHF показаны сигналы, сгенерированные на основе скользящей средней Фибоначчи.

Если вас также интересуют другие технические индикаторы и использование Python для создания стратегий, то мой бестселлер по техническим индикаторам может вас заинтересовать:



Создание стратегии

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

  • Длинная позиция (покупка), когда рынок находится выше и близок к скользящей средней Фибоначчи, одновременно имея бычий сигнал, исходящий от временного паттерна Фибоначчи.
  • Короткая позиция (продажа), когда рынок ниже и близок к скользящей средней Фибоначчи, одновременно имея медвежий сигнал, исходящий от временного паттерна Фибоначчи.

distance = 0.0020
def signal(Data, close, upper_fma, lower_fma, bullish_pattern, bearish_pattern, buy, sell):
    
    for i in range(len(Data)):
       if abs(Data[i, 3] - Data[i, upper_fma]) < distance and Data[i, bullish_pattern] == -8 and Data[i, 3] > Data[i, lower_fma]:
        
                Data[i, buy] = 1
         
        elif abs(Data[i, lower_fma] - Data[i, 3]) < distance and Data[i, bearish_pattern] == 8and Data[i, 3] < Data[i, upper_fma]:
            
                Data[i, sell] = -1
                
    return Data

Как и любая комбинация индикаторов, сигналы могут быть менее частыми. Обычно предпочтение отдается качеству, а не количеству.

Оценка качества сигнала

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

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

Иногда мы закрываемся в случайные периоды времени. Следовательно, качество сигнала - это очень простая мера, которая предполагает фиксированный период удержания, а затем проверяет рыночный уровень в этот момент времени, чтобы сравнить его с начальным уровнем. Другими словами, он измеряет время рынка, проверяя реакцию рынка через определенный период времени.

# Choosing a Holding Period
period = 13
def signal_quality(Data, closing, buy, sell, period, where):
    
    Data = adder(Data, 1)
    
    for i in range(len(Data)):
        
        try:   
            
            if Data[i, buy] == 1:
                
                Data[i + period, where] = Data[i + period, closing] - Data[i, closing]
            
            if Data[i, sell] == -1:
                
                Data[i + period, where] = Data[i, closing] - Data[i + period, closing]
                
        except IndexError:
            
             pass
         
    return Data
# Applying the Signal Quality Function
my_data = signal_quality(my_data, 3, 6, 7, period, 8)
positives = my_data[my_data[:, 8] > 0]
negatives = my_data[my_data[:, 8] < 0]
# Calculating Signal Quality
signal_quality = len(positives) / (len(negatives) + len(positives))
print('Signal Quality = ', round(signal_quality * 100, 2), '%')
# Output Signal Quality EURUSD = 64.37% 
# Output Signal Quality USDCHF = 55.21%

Поскольку это модель разворота, более короткие периоды владения должны соответствовать более высокому качеству. Качество сигнала 64,37% означает, что на 100 сделках мы склонны видеть прибыльный результат в 64 случаях без учета транзакционных издержек.

Заключение

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

Я твердо убежден, что нельзя кормить с ложечки. Я научился на практике, а не копируя. Вы должны понять идею, функцию, интуицию, условия стратегии, а затем разработать (даже лучше) одну из них самостоятельно, чтобы вы протестировали и улучшили ее, прежде чем принимать решение о том, чтобы воплотить ее в жизнь или отказаться от нее. Мой выбор не предоставлять результаты бэк-тестирования должен побудить читателя больше изучить стратегию и больше работать над ней.

Подводя итог, можно ли сказать, что стратегии, которые я предлагаю, реалистичны? Да, но только путем оптимизации среды (надежный алгоритм, низкие затраты, честный брокер, надлежащее управление рисками и управление заказами). Предусмотрены ли стратегии исключительно для торговли? Нет, это нужно для стимулирования мозгового штурма и получения новых торговых идей, поскольку мы все устали слышать о перепроданности RSI как о причине для открытия короткой позиции или о преодолении сопротивления как о причине идти долго. Я пытаюсь представить новую область под названием «Объективный технический анализ», в которой мы используем достоверные данные для оценки наших методов, а не полагаемся на устаревшие классические методы.