Создание стратегии на основе расширенных полос Боллинджера.

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

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



Расширенные полосы Боллинджера

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

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

  • Рассчитайте 20-периодное скользящее среднее максимумов.
  • Рассчитайте 20-периодное скользящее среднее минимумов.
  • Рассчитайте стандартное отклонение обоих скользящих средних.
  • Чтобы найти верхнюю полосу, мы умножаем стандартное отклонение скользящей средней максимумов и добавляем его к текущей скользящей средней максимумов.
  • Чтобы найти нижнюю полосу, мы умножаем стандартное отклонение скользящей средней минимумов и вычитаем его из текущей скользящей средней скользящих минимумов.

На приведенном выше графике показаны значения EURUSD с 20-периодными расширенными полосами Боллинджера с двумя стандартными отклонениями. Чтобы приведенный ниже код работал, нам нужен массив данных OHLC, содержащий исторические значения.

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 volatility(Data, lookback, what, where):
    
    # Adding an extra column
    Data = adder(Data, 1)
    
    for i in range(len(Data)):
        
     try:
      Data[i, where] = (Data[i - lookback + 1:i + 1, what].std())
    
        except IndexError:
            pass
     
    # Cleaning
    Data = jump(Data, lookback)    
     
    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
def augmented_BollingerBands(Data, boll_lookback, standard_deviation, high, low, where):
      
    Data = adder(Data, 10)
    
    # Calculating means
    Data = ma(Data, boll_lookback, high, where)
    Data = ma(Data, boll_lookback, low,  where + 1)
    
    Data = volatility(Data, boll_lookback, high, where + 2)
    Data = volatility(Data, boll_lookback, low,  where + 3)
    
    Data[:, where + 4] = Data[:, where] +     (standard_deviation * Data[:, where + 2])
    Data[:, where + 5] = Data[:, where + 1] - (standard_deviation * Data[:, where + 3])
    
    Data = jump(Data, boll_lookback)
    
    Data = deleter(Data, where, 4)
        
    return Data

Если вы хотите поддержать меня и статьи, которые я регулярно публикую, рассмотрите возможность подписки на мою ежедневную новостную рассылку (доступен бесплатный план) по приведенной ниже ссылке. Это поможет мне продолжать делиться своими исследованиями. Спасибо!



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

Как обычно, простая стратегия полос Боллинджера - это стратегия, при которой мы начинаем противоположные сделки всякий раз, когда достигаем любой из полос. Таким образом, торговые условия будут такими:

  • Сигнал на покупку (покупку) генерируется, когда минимум касается нижней 40-периодной расширенной полосы Боллинджера.
  • Сигнал на продажу (короткую продажу) генерируется, когда максимум касается более высокой 40-периодной расширенной полосы Боллинджера.

def signal(Data, high, low, upper_boll, lower_boll, buy, sell):
    
    Data = adder(Data, 5)
for i in range(len(Data)):
    
        if Data[i, low] < Data[i, lower_boll] and Data[i - 1, low] > Data[i - 1, lower_boll]:
            
            Data[i, buy] = 1
        
        if  Data[i, high] > Data[i, upper_boll] and Data[i - 1, high] < Data[i - 1, upper_boll]:
        
            Data[i, sell] = -1
            
    return Data

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



Оценка стратегии

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

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

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

# Choosing a Holding Period for a trend-following strategy
period = 5
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 = 52.25%
# Output Signal Quality USFCHF = 51.74%
# Output Signal Quality GBPUSD = 51.29%
# Output Signal Quality AUDUSD = 52.02%
# Output Signal Quality NZDUSD = 51.04%
# Output Signal Quality USDCAD = 51.58%

Вывод

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

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

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