Кодирование и бэк-тестирование индекса относительной жизнеспособности в Python.

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

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



Строительные блоки индекса относительной бодрости

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

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

Строку числителя относительной силы можно рассчитать следующим образом:

  • Рассчитайте текущую разницу между ценой закрытия и ценой открытия. Назовем эту переменную A.
  • Вычислите разницу между текущей ценой закрытия и ценой открытия двух периодов назад. Назовем эту переменную B. Умножим результат на 2.
  • Вычислите разницу между текущей ценой закрытия и ценой открытия трех периодов назад. Назовем эту переменную C. Умножим результат на 2.
  • Вычислите разницу между текущей ценой закрытия и ценой открытия четыре периода назад. Назовем эту переменную D.

Линия знаменателя Относительной энергии может быть рассчитана следующим образом:

  • Рассчитайте текущую разницу между максимальной и низкой ценой. Назовем эту переменную E.
  • Вычислите разницу между текущей максимальной ценой и минимальной ценой два периода назад. Назовем эту переменную F. Умножим результат на 2.
  • Вычислите разницу между текущей максимальной ценой и минимальной ценой трех периодов назад. Назовем эту переменную G. Умножим результат на 2.
  • Вычислите разницу между текущей максимальной ценой и минимальной ценой четыре периода назад. Назовем эту переменную H.

Индекс относительной бодрости

Формула индекса относительной бодрости выглядит следующим образом:

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

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 rvi(Data, lookback, opening, high, low, close, where):
    # Numerator
    for i in range(len(Data)):
        
     Data[i, where] = ((Data[i, close] - Data[i, opening]) + (2 * (Data[i, close] - Data[i - 1, opening])) + (2 * (Data[i, close] - Data[i - 2, opening])) + (Data[i, close] - Data[i - 2, opening])) /6
    
    Data = ma(Data, lookback, where, where + 1)
    
    # Denominator
    for i in range(len(Data)):
        
     Data[i, where + 2] = ((Data[i, high] - Data[i, low]) + 2 * (Data[i, high] - Data[i - 1, low])) + (2 * (Data[i, high] - Data[i - 2, low])) + (Data[i, high] - Data[i - 2, low])) / 6
            
    Data = ma(Data, lookback, where + 2, where + 3)
    
    # RVI
    Data[:, where + 4] = Data[:, where + 1] / Data[:, where + 3]
    
    # Signal
    for i in range(len(Data)):
    
      Data[i, where + 5] = ((Data[i, where + 4]) + (2 * (Data[i - 1, where + 4])) + (2 * (Data[i - 2, where + 4])) + (Data[i - 3, where + 4])) / 6 
    
    return Data

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



Бэк-тестирование стратегии кроссовера

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

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

Поэтому сигнальную функцию в Python можно записать как:

def signal(Data, rvi_column, rvi_signal, buy, sell):
    
    for i in range(len(Data)):
            
        if Data[i, rvi_column] > Data[i, rvi_signal] and Data[i - 1, rvi_column] < Data[i - 1, rvi_signal] and Data[i - 2, rvi_column] < Data[i - 2, rvi_signal]:
            Data[i, buy] = 1
            
        if Data[i, rvi_column] < Data[i, rvi_signal] and Data[i - 1, rvi_column] > Data[i - 1, rvi_signal] and Data[i - 2, rvi_column] > Data[i - 2, rvi_signal]:
            Data[i, sell] = -1

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

Теперь, при спреде 0,5 пипса и теоретическом соотношении риска и прибыли 0,25 ATR, мы посмотрим на эффективность стратегии на основе почасовых данных за 11 лет.

Результаты показывают, что это дает резко отрицательные результаты. Иногда наиболее согласованные правила оказываются неверными. Что я имею в виду? Вот график кривой капитала для той же стратегии и условий, только мы открываем длинную позицию (Покупаем), когда мы должны открывать короткую позицию, и наоборот (т.е. мы инвертируем торговые триггеры).

Как насчет того, чтобы попробовать другую стратегию, основанную на развороте вокруг нулевого уровня?

Пересечение нулевой линии. Другая стратегия?

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

  • Открывайте длинную позицию (Покупайте) всякий раз, когда RVI пересекает нулевую линию снизу вверх. Удерживайте эту позицию до получения противоположного сигнала.
  • Открывайте короткую позицию (продавайте), когда RVI пересекает нулевую линию сверху вниз. Удерживайте эту позицию до получения противоположного сигнала.

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

def signal(Data, what, buy, sell):
    
    for i in range(len(Data)):
            
        if Data[i, what] > 0 and Data[i - 1, what] < 0 and Data[i - 2, what] < 0:
            Data[i, buy] = 1
            
        if Data[i, what] < 0 and Data[i - 1, what] > 0 and Data[i - 2, what] > 0:
            Data[i, sell] = -1

Заключение

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