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

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

Я только что выпустил новую книгу после успеха моей предыдущей «Книга торговых стратегий». Он содержит передовые индикаторы и стратегии, следующие за трендом, а также страницу GitHub, посвященную постоянно обновляемому коду. Кроме того, в этой книге представлены оригинальные цвета после оптимизации затрат на печать. Если вы чувствуете, что это вас интересует, не стесняйтесь посетить приведенную ниже ссылку Amazon, или, если вы предпочитаете купить версию в формате PDF, вы можете связаться со мной на LinkedIn.



Полосы Боллинджера

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

Предположим, что приведенное выше является упорядоченным по времени временным рядом. Если бы нам пришлось наивно угадывать следующее значение после 10, то одним из лучших предположений может быть среднее значение данных. Поэтому, если мы суммируем значения {5, 10, 15, 5, 10} и разделим их на их количество (т.е. 5), мы получим 9. Это среднее значение для приведенного выше набора данных. В python мы можем сгенерировать список или массив, а затем легко вычислить среднее значение:

# Importing the required library
import numpy as np
# Creating the array
array = [5, 10, 15, 5, 10]
array = np.array(array)
# Calculating the mean
array.mean()

Теперь, когда мы вычислили среднее значение, мы видим, что ни одно значение в наборе данных на самом деле не равно 9. Откуда мы знаем, что набор данных, как правило, не близок к набору данных? Это измеряется тем, что мы называем стандартным отклонением (волатильностью). Стандартное отклонение просто измеряет среднее расстояние от среднего значения, перебирая отдельные значения и сравнивая их расстояние со средним значением.

# Calculating the mean
array.std()

Приведенный выше фрагмент кода вычисляет стандартное отклонение набора данных, которое составляет около 3,74. Это означает, что в среднем отдельные значения отличаются на 3,74 единицы от 9 (среднего). Теперь давайте перейдем к нормальному распределению, показанному на кривой ниже.

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

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

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

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

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

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

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

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

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

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

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

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

def adder(data, times):
    
    for i in range(1, times + 1):
    
        new = np.zeros((len(data), 1), dtype = float)
        
        data = np.append(data, new, axis = 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
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
            
    data = jump(data, lookback)
    
    return data
def ema(data, alpha, lookback, what, where):
    
    alpha = alpha / (lookback + 1.0)
    
    beta  = 1 - alpha
    
    data = ma(data, lookback, what, where)
data[lookback + 1, where] = (data[lookback + 1, what] * alpha) + (data[lookback, where] * beta)
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

Если вы хотите видеть больше статей, подпишитесь на мой ЕЖЕДНЕВНЫЙ информационный бюллетень (доступен бесплатныйплан) по ссылке ниже. В нем представлены мои статьи на Medium, другие торговые стратегии, уроки кодирования, связанные с исследованиями и анализом, а также подписчики получают бесплатную копию моей первой книги в формате PDF. Вы можете ожидать 5–7 статей в неделю с платной подпиской и 1–2 статей в неделю с бесплатным планом. Это помогло бы мне продолжить делиться своими исследованиями. Спасибо!



Последовательность Фибоначчи

Последовательность Фибоначчи следует этому четкому шаблону:

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

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

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



Полосы Боллинджера Фибоначчи

Основная идея состоит в том, чтобы рассчитать полосы Боллинджера, используя различные ретроспективные периоды Фибоначчи. Это означает, что мы будем рассчитывать 5-периодные полосы Боллинджера, затем 8-периодные, а затем 13-периодные, пока не достигнем 377-периодного. После этого она становится немного далекой от рыночной цены и, следовательно, мы можем рассчитать первые десять полос Фибоначчи. На приведенном ниже графике показан пример на EURUSD.

my_data = bollinger_bands(my_data, 5,   2, 3, 4)
my_data = bollinger_bands(my_data, 8,   2, 3, 6)
my_data = bollinger_bands(my_data, 13,  2, 3, 8)
my_data = bollinger_bands(my_data, 21,  2, 3, 10)
my_data = bollinger_bands(my_data, 34,  2, 3, 12)
my_data = bollinger_bands(my_data, 55,  2, 3, 14)
my_data = bollinger_bands(my_data, 89,  2, 3, 16)
my_data = bollinger_bands(my_data, 144, 2, 3, 18)
my_data = bollinger_bands(my_data, 233, 2, 3, 20)
my_data = bollinger_bands(my_data, 377, 2, 3, 22)
my_data = adder(my_data, 1)
my_data[:, -1] = (my_data[:, 4]  + my_data[:, 6] + my_data[:, 8] +   my_data[:, 10] + my_data[:, 12] + my_data[:, 14] + my_data[:, 16] + my_data[:, 18] + my_data[:, 20] + my_data[:, 22]) / 10
my_data = adder(my_data, 1)
my_data[:, -1] = (my_data[:, 5]  + my_data[:, 7] + my_data[:, 9] + my_data[:, 11] + my_data[:, 13] + my_data[:, 15] + my_data[:, 17] + my_data[:, 19] + my_data[:, 21] + my_data[:, 23]) / 10

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

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

def signal(data, close, upper_band, lower_band, buy, sell):
    
    data = adder(data, 2)
    
    for i in range(len(data)):
        
        if data[i, close] > data[i, lower_band] and data[i - 1, close] < data[i - 1, lower_band]:
            
            data[i, buy] = 1
if data[i, close] < data[i, upper_band] and data[i - 1, close] > data[i - 1, upper_band]:
            
            data[i, sell] = -1
            
    return data

На приведенном ниже графике показана разница между полосой Фибоначчи Боллинджера и 20-периодными полосами Боллинджера.

Заключение

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

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

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



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