Подавляющее число трейдеров используют знаменитый индекс относительной силы, чтобы помочь им в принятии решений, и хотя он может служить только подтверждающим индикатором, тем не менее, он имеет значение при принятии многих торговых решений или, по крайней мере, при определении времени принятия решений. RSI был создан Дж. Уэллсом Уайлдером в 1978 году как индикатор импульса с оптимальным периодом обзора в 14 баров. Он ограничен между 0 и 100, причем 30 и 70 являются согласованными зонами перепроданности и перекупленности соответственно. RSI можно использовать с помощью 3 известных методов:

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



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

Первая строка в функции ниже - это коррекция / преобразование экспоненциальной скользящей средней в пандах в исходную более гладкую версию, которая обычно используется в пакетах RSI. Я рекомендую использовать старую версию pandas, поскольку указанная ниже функция ewma устарела в новых версиях.

def rsi(Data, rsi_lookback, which = 1): #OHLC Data
    
    rsi_lookback = (rsi_lookback * 2) - 1 # From exp to smoothed
    # Get the difference in price from previous step
    Data = pd.DataFrame(Data)
    delta = Data.iloc[:, 3].diff()
    delta = delta[1:] 
    
    # Make the positive gains (up) and negative gains (down) Series
    up, down = delta.copy(), delta.copy()
    up[up < 0] = 0
    down[down > 0] = 0
    
    roll_up = pd.stats.moments.ewma(up, rsi_lookback)
    roll_down = pd.stats.moments.ewma(down.abs(), rsi_lookback)
    
    roll_up = roll_up[rsi_lookback:]
    roll_down = roll_down[rsi_lookback:]
    Data = Data.iloc[rsi_lookback + 1:,].values
    
    # Calculate the RSI
    RS = roll_up / roll_down
    RSI = (100.0 - (100.0 / (1.0 + RS)))
    RSI = np.array(RSI)
    RSI = np.reshape(RSI, (-1, 1))
    
    Data = np.concatenate((Data, RSI), axis = 1)

Здесь мы постараемся оптимизировать сигналы, настроив параметры. Проверенные на истории пары, как обычно, будут представлять собой шесть основных пар на временном интервале 3H, с использованием транзакционной стоимости 1 пипса для каждой сделки (ориентировочно), удержанием позиций в течение 10 периодов (3 x 10 = 30 часов) и с RSI (14, 25, 75). Анализируемые исторические данные охватывают период с 2005 г. по настоящее время.

Видно, что чистый метод RSI не работает. Что, если мы оптимизируем период удержания и период RSI. Вы можете сделать это для всех пар, но чтобы статья не была длиннее, чем она должна быть, мы оптимизируем только EURUSD (то есть, если он поддается оптимизации).

Кривые капитала после попытки оптимизации периода владения (т. Е. Переход через разные периоды владения)

Видно, что мы мало что можем сделать в отношении чистой стратегии RSI (идея которой уже была идея до написания статьи). Ключевые моменты, прежде чем мы перейдем к более продвинутой стратегии ниже:

  • Не верьте сообщениям людей, утверждающих, что хорошие результаты дает только RSI. Это либо аномалия, либо сбор вишен. Такой простой индикатор из субъективной области никогда не может дать аномальных результатов. Если бы это было так, это было бы артбитражным.
  • RSI может использоваться только в качестве подтверждающего фактора внутри ранжированного рынка. Вскоре я опубликую еще одну статью, чтобы показать, что это действительно увеличивает ценность уже существующей торговой системы.
  • Всегда проводите массовое тестирование на истории и старайтесь не слишком сильно настраивать параметры. Работа только с одной ценной бумагой на одном таймфрейме кричит о переобучении и чистом совпадении.
  • RSI зависит от текущего состояния рынка. Если он находится в диапазоне, то, скорее всего, будет подавать хорошие сигналы. Если он в тренде, то лучше воспользоваться другими инструментами.

Беглый взгляд на график сигналов из приведенной выше стратегии:

Что, если мы сейчас попробуем что-то новое?

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

Идея остается простой:

  • Условия покупки: если переменная расширения остается в пределах Боллинджера, а расширение полос меньше заранее заданной маржи, а также RSI достигает зоны перепроданности, то мы совершаем покупку . заказ.
  • Условия продажи: если переменная расширения остается в пределах диапазона Боллинджера, а расширение полос меньше заранее заданной маржи, а также если RSI достигает зоны перекупленности, мы инициируем продажу . (короткий) заказ.

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

Ниже приведен пример EURNOK, показывающий, что, когда полосы Боллинджера значительно расширяются, сигналы RSI не следует принимать во внимание.

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

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

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



Вторая панель - это индикатор RSI. Помните, мы покупаем по 30 и продаем по 70.

третья панель - это спред Боллинджера со стандартным отклонением спреда 2,00. Это необходимо для приблизительного измерения состояния рынка. Следовательно, если спред больше, чем его верхнее отклонение, или ниже, чем его нижнее отклонение при наличии сигнала от RSI, мы его не принимаем. Это показано двумя вертикальными черными линиями на графике, где у нас был сигнал от RSI, но спред (на третьей панели) был больше, чем его отклонение. Теперь мы собираемся сравнить наши первоначальные результаты RSI с результатами новой модифицированной стратегии диапазона:

Видно, результаты намного лучше. Они по-прежнему не заслуживают титула «отличная стратегия», но фильтр спреда Боллинджера улучшил результаты, доказывая, что приближение к определению состояния рынка улучшит ваши торговые результаты.

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

Почему была написана эта статья?

  • Покажите, что использование систематической стратегии RSI не работает. Мы это доказали; хотя нам и не нужно было это доказывать. Основная интуиция подсказывает нам, что очевидные вещи не работают.
  • Представьте код для RSI и полос Боллинджера амбициозным бэктестерам, чтобы они использовали их в своих стратегиях и, возможно, нашли «тот».
  • Покажите, что сочетание некоторых интуитивно понятных методов может улучшить результаты.

Другие образцы сигнальных графиков с использованием фильтра спреда Боллинджера:

Если вы хотите больше контента такого рода, обязательно подписывайтесь на меня.

Код полос Боллинджера

def BollingerBands(Data, boll_lookback, volatility, onwhat, where_ma, where_up, where_down):
       
    # Calculating means
    for i in range(len(Data)):
        try:
            Data[i, where_ma] = (Data[i - boll_lookback:i + 1, onwhat].mean())
    
        except IndexError:
            pass
for i in range(len(Data)):
        Data[i, where_up] = ((Data[i - boll_lookback:i, onwhat].std()) * volatility) + Data[i, where_ma]
        
    for i in range(len(Data)):
        Data[i, where_down] = Data[i, where_ma] - ((Data[i - boll_lookback:i, onwhat].std()) * volatility) 
        
    return Data