Кодирование и визуализация полос Фибоначчи-Боллинджера в Python.

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

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



Знакомство с полосами Боллинджера

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

Кривая выше показывает количество значений в пределах ряда стандартных отклонений. Например, область, заштрихованная красным, соответствует примерно 1,33-кратному стандартному отклонению от нулевого среднего значения. Мы знаем, что при нормальном распределении данных:

  • Около 68% данных находится в пределах 1 стандартного отклонения от среднего.
  • Около 95% данных находится в пределах 2 стандартных отклонений от среднего.
  • Около 99% данных находится в пределах 3 стандартных отклонений от среднего.

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

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

Для расчета двух полос мы используем следующие относительно простые формулы:

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

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

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

def ma(Data, lookback, what, where):
    
    for i in range(len(Data)):
      try:
        Data[i, where] = (Data[i - lookback + 1:i + 1, what].mean())
        
            except IndexError:
                pass
    return Data
def volatility(Data, lookback, what, where):
    
    for i in range(len(Data)):
      try:
        Data[i, where] = (Data[i - lookback + 1:i + 1, what].std())
    
        except IndexError:
            pass
        
    return Data
def BollingerBands(Data, boll_lookback, standard_distance, what, where):
       
    # Calculating mean 
    ma(Data, boll_lookback, what, where)    
    # Calculating volatility
    volatility(Data, boll_lookback, what, where + 1)
    
    Data[:, where + 2] = Data[:, where] + (standard_distance *  Data[:, where + 1])
    Data[:, where + 3] = Data[:, where] - (standard_distance * Data[:, where + 1])
        
    return Data

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

Чтобы построить полосы Фибоначчи-Боллинджера, нам нужно сначала создать скользящую среднюю Фибоначчи. Последовательность Фибоначчи следует этому отличному шаблону:

Числа находятся путем сложения двух предыдущих чисел после них. В случае 13 оно рассчитывается как 8 + 5, следовательно, формула имеет следующий вид:

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

def fib(n):
   if n == 1:
      return 1
  
   elif n == 0:   
      return 0 
           
   else:                      
      return fib(n - 1) + fib(n - 2)

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

Теперь, если мы воспользуемся функцией и посмотрим на ее результаты, мы поймем лучше.

fib(14)
# Output: 377 
fib(5)
# Output: 5

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



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

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

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

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
def fibonnaci_moving_average(Data, fib_range, what, where):
    
    for i in range(3, fib_range):
        
        Data = adder(Data, 1)
        lookback = fib(i)
        Data = ema(Data, 2, lookback, what, -1)
    
        Data = adder(Data, 1)    for i in range(len(Data)):
        Data[i, -1] = np.sum(Data[i, where:where + 15])
        Data[i, -1] = Data[i, - 1] / 15
    
    return Data

Создание полос Фибоначчи-Боллинджера

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

def fibonacci_bands(Data, fibonacci_column, what, where):
    
    # Calculating Volatility
    volatility(Data, boll_lookback, what, where)
    
    Data[:, where + 1] = Data[:, fibonacci_column] + (standard_distance * Data[:, where])
    Data[:, where + 2] = Data[:, fibonacci_column] - (standard_distance * Data[:, where])
    
    Data = jump(Data, boll_lookback)
    
    Data = deleter(Data, where, 1)
return Data

Функции перехода и удаления используются для удаления определенного количества строк и столбцов соответственно. Их можно определить ниже:

def deleter(Data, index, times):
    
    for i in range(1, times + 1):
    
        Data = np.delete(Data, index, axis = 1)
return Data
   
def jump(Data, jump):
    
    Data = Data[jump:, ]
    
    return Data

На приведенном выше графике показаны почасовые данные по EURUSD со скользящей средней 13-Фибоначчи и 20-периодными полосами 3-стандартного отклонения от нее.

# Defining the variables
fibo                = 13
boll_lookback       = 20
standard_distance   = 3
# Calculating the Fibonacci Moving Average on OHLC array
my_data = fibonnaci_moving_average(my_data, fibo, 3, 5)
# Adding a few columns
my_data= adder(my_data, 10)
# Adding the Fibonacci Bands
my_data= fibonacci_bands(my_data, 4, 3, 5)

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

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



Заключение

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

Прежде всего, я постоянно публикую свои торговые журналы в Твиттере до и после запуска, чтобы показать результаты. Это обеспечивает прозрачность. Я также публикую в Твиттере каждые 1–3 месяца. Тем не менее, я никогда не гарантирую ни возврата ни превосходного мастерства. Что касается индикаторов, которые я разрабатываю, я постоянно использую их в своей личной торговле. Следовательно, у меня нет мотива публиковать предвзятые исследования. Моя цель - поделиться тем, что я узнал от онлайн-сообщества.

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

Рыночную цену невозможно предсказать или ее очень трудно предсказать более чем в 50% случаев. Но реакцию рынка можно предсказать.

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

Пока мы обсуждаем эту тему, я должен отметить несколько моментов в моих тестах на истории и статьях:

  • Я использую спред, основанный на институциональных котировках небольшой доли пунктов. Как правило, розничным трейдерам предоставляется колоссальный спред в 1-2 пункта за сделку. Это огромно и несправедливо по отношению к ним. Я использую спред 0,2–0,5. Однако большинство стратегий, использующих часовой таймфрейм, по-прежнему работают со спредом в 1 пункт. Для тех, кто использует таймфреймы M15 или M5, они не могут быть прибыльными со спредом в 1 пункт.
  • Я использую расчет периода удержания, близкий к близкому, если нет процесса управления рисками.
  • Хотя я не рекомендую торговать только по одному индикатору, цифры не лгут. Я представляю то, что могло произойти, если принять во внимание низкий спред.
  • Некоторые из представленных мною тестов на истории неудачны, и они публикуются либо для того, чтобы развенчать миф о торговле, либо для того, чтобы представить интересные функции, которые читатели могут запрограммировать.
  • Наконец, я твердо убежден, что нельзя кормить учащихся с ложечки. Я научился на практике, а не копируя. Вы должны понять идею, функцию, интуицию, условия стратегии, а затем разработать (даже лучше) одну из них самостоятельно, чтобы вы протестировали ее на исторических данных и улучшили, прежде чем принять решение о том, чтобы применить ее вживую или отменить.

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