Активируйте JavaScript для полноценного использования elitetrader.ru Проверьте настройки браузера.
Алготрейдинг: о чём расскажет RSI? » Элитный трейдер
Элитный трейдер
Искать автора

Алготрейдинг: о чём расскажет RSI?

21 июля 2017 Румянцев Александр
При бэктестингах индикатора RSI заметил разное поведение на разных активах. На некоторых активах сигналы перекупленности и перепроданности по RSI за короткий период (2-5 дней) работают одинаково хорошо в обе? стороны, а иногда преобладает только один? сигнал. На крупных индексах за последние 10 лет лучше работает сигнал перепроданности?.

При поиске? ответа на «Почему?» удалось найти решение для определения оптимального периода RSI и лучших порогов. Итак, проанализируем это вместе на Python?.


Идикатор RSI по своей природе движется в диапазоне от 0 до 100. Значение выше 50 говорит о том, что цена за период выросла больше, чем упала, и наоборот. Когда цена дорастает до верхнего порогового значения (по умолчанию 70) считается, что актив перекуплен. Пересечение нижнего порога (по умолчанию 30) говорит о перепроданности. При наступлении таких пересечений ожидается разворот цены.

Но разворот случается далеко не всегда. Очень часто актив зависает в зоне перекупленности или перепроданности на недели. На графике видно, что SPY чаще задерживается в зоне перекупленности.

Алготрейдинг: о чём расскажет RSI?


?Предположение

Так как RSI зависит от движения цены, значит по пересечениям пороговых значений можно определить:
Тренд актива за период.
Вероятность разворота при пересечении одного из порогов.
Вероятность последовательных пересечений одного порога до возвращения к противоположному.
Общее изменение цены при движении от одного порога до другого. Например, от нижнего до верхнего.

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

Окружение:
Операционная система Linux.
Python 3.5.
Блокнот Jupyter.
Numpy, Pandas, Matplotlib.

Анализируем:
SPY, отрегулированный на дивиденды.
2-дневный RSI.
Период: с 2012 до 2017 года.
?Реализация

Основная идея воплощена в этой маленькой функции кодирования последовательных значений:

def rle(inarray):
    """
    Run length encoding. Partial credit to R rle function. 
    Multi datatype arrays catered for including non Numpy
    
    Wiki: http://bit.ly/wiki_rle
    Source: htts://stackoverflow.com
    
    returns: 
        tuple (runlengths, startpositions, values) 
    """
    ia = np.array(inarray)                  # force numpy
    n = len(ia)
    if n == 0: 
        return (None, None, None)
    else:
        y = np.array(ia[1:] != ia[:-1])     # pairwise unequal (string safe)
        i = np.append(np.where(y), n - 1)   # must include last element posi
        z = np.diff(np.append(-1, i))       # run lengths
        p = np.cumsum(np.append(0, z))[:-1] # positions
        return(z, p, ia[i])


На вход мы подаем numpy-массив, а на выходе получаем:
Массив длин последовательного повторения значения.
Массив индексов изменения значения, относительно предыдущего.
Массив значений.

Например:

In: rle(np.array([1, 1, 5, 5, 5, 3, 2, 3, 3, 3]))
Out: ([2, 3, 1, 1, 3],
      [0, 2, 5, 6, 7], 
      [1, 5, 3, 2, 3])


?Пример анализа SPY

Посмотрим, что нам расскажет график SPY.



Сверху цена SPY за 5 лет. Далее график RSI(2), на котором видно, что верхний порог любим больше нижнего. На нижнем графике пример возможного индикатора вероятности разворота при пересечении границы RSI:
Top — вероятность разворота при достижении верхней границы.
Bottom — при достижении нижней.

Уже здесь мы видим, что от нижней границы вероятность разворота цены выше. Что не удивительно во времена бычьего рынка.

Теперь взглянем на продолжительность нахождения значения RSI вне границ каждого порога.


Нахождение за порогами

Слева видно, что большинство пересечений нижней границы продолжается лишь один день. А 75% всех пересечений длятся не более 3-х дней. Пересечение верхнего порога длится в среднем 2 дня. А 75% пересечений длятся не более 4-х дней.

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

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


Повторное пересечение порога

На графиках видно, что в 75% случаев повторные пересечения случаются реже 2-х раз подряд. Но опять видно, что два пересечения подряд чаще встречается на верхнем пороге (справа).

В заключение глянем на скорость перехода от порога к порогу.



Видно, что от нижней границы до верхней мы движемся быстрее. В 75% случаев снизу до верху мы доберемся примерно за 5 торговых дней. А путь от верхней границы до нижней может занять почти 8 дней.
?Вывод

Данный анализ показывает поведение актива и позволяет принимать решения о торговле по сигналам разворота. Мы видим основной тренд актива и можем рассчитать вероятность разворота цены от одного из порогов. Теперь легко найти оптимальные границы сигналов и период RSI.

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

В следующей статье проведем бэктестинг RSI(2/5) на нескольких активах, применяя описанный инструментарий.

?В комментариях напишите, какие ещё можно сделать выводы на полученных наблюдениях? Что можно улучшить? Также пишите, если нужен блокнот с анализом и графиками.

Бэктестинг: торгуем SPY по сигналам RSI(3)

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

Анализ и тесты будем проводить на Python?. Используем библиотеку Zipline и Quantopian.

Индикатор RSI описан здесь. Алгоритм анализа пересечения порогов описан здесь.

Ниже я публикую результаты анализа пересечения 30 и 70 порогов RSI(3) для SPY с 1995 до 2017 года. Нам интересны количество и продолжительность нахождения вне порогов и продолжительность движения от одного порога к другому.



Мы захватили несколько бычьих и медвежьих рынков. Анализ показывает, что в 75% случаев значение RSI(3) находится ниже 30 менее трёх дней. При этом значение находится выше 70 в течение одного дня реже, чем ниже 30. А 75% процентиль находится на четырёх днях. За весь период мы видим, что покупать SPY от нижней границы в первый день безопаснее, чем шортить от верхней.

На нижних гистограммах мы видим, что от 30 до 70 значение RSI(3) доходит за восемь дней в 75% случаев. А вот сверху вниз цена идёт дольше и 75% процентиль лежит на 12 днях.

Выводы наводят на мысль, что торговать нужно только в длинную.



Если постараться?, на графике можно увидеть, что в периоды медвежьих рынков индикатор RSI(3) плотнее ниже нижней границы (30). В этот раз, мы эти периоды отфильтруем пересечением скользящих средних SMA(50) и SMA(200).

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

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

?Условия алгоритма

Тестировать будем на двух платформах:
Локальный тест на дневной истории с помощью Zipline.
Тест на минутной истории с сигналом в конце дня на Quantopian.

Условия:
SPY.
Капитал $100 000.
Торгуем с 2004 до 2017 года на закрытии рынка только в длинную.
Бычий/медвежий рынок фильтруем с помощью SMA(50) x SMA(200).
3-х дневный RSI.
Динамические пороги 30 и 70 с отклонением 15 в зависимости от рынка:
Бычий 30 и 85.
Медвежий 15 и 70.
Фильтр по вероятности разворота проверяем за 30 торговых дней и покупаем, если вероятность выше 20%. Вероятность падает в ноль, если пересечения отсутствуют.
Максимальное удержание позиции 5 торговых дней.
Без стопов.

?Тестирование на дневной истории

Первым делом протестируем локально с помощью Zipline на дневной истории. Код алгоритма доступен в Jupyter блокноте и обычном скрипте.

В первую очередь сделаем отступление. На первом графике видно, что сделки проводятся только на следующий день. Что логично, ведь сигнал мы получили в конце дня и открыться можем только в следующую торговую сессию. Это свойство тестирования на дневной истории.



Тестирование показало следующие результаты:
Доходность: +143%
Максимальная просадка: -12%
SPY(Купи-Держи): +189%



Результаты удовлетворительные, особенно учитывая просадку всего в -12%.

На графике RSI(3) мы можем видеть изменение порогов в разные периоды рынка. Красная линия показывает вероятность разворота от нижней границы. Фильтр не идеальный, но позволяет увеличить доход на 10%.

Фильтр по пересечению средних спасает лишь от пары резких просадок в 2008 году, которые категорически портят результаты. А медлительность разворота средних слишком долго запрещает алгоритму торговать. Так что стратегию можно улучшить, фильтруя сигналы во время высокой волатильности или сокращая размер позиции. Например, фильтровать можно проверяя положение внутри канала 52-недельных максимума и минимума.

?Тестирование на Quantopian

Теперь протестируем нашу стратегрию на минутной истории цен при условии проверки сигналов один раз в день. Код алгоритма ниже.

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



Результаты любопытней:
Доходность: +166%
Максимальная просадка: -14%
SPY(Купи-Держи): +183%

Разница в 20% может быть связана с открытием позиции в конце дня, так как тестирование проводится на минутной истории. Это же могло повлиять и на просадку. Как видно, алгоритм торгует достаточно активно, что позволяет исключить случайность получения результатов.
?Код в студию

Поделитесь статьей для доступа к репозиторию с исходным кодом. Вопросы по коду пишите в комментариях?.

?Вывод

В этот раз, стратегия по RSI оказалась более чем жизнеспособной, в сравнении с первой попыткой, описанной здесь. Удивительные результаты были получены при торговле IWM, аж в +250%.

Для справки, оптимизация стратегии проводилась в период с 2015 до 2016 года. То есть результаты получены на OOS (Out-Of-Sample). А по-русски, вне тестового периода.

Можно ли улучшить стратегию? Легко! Идей множество. Например, добавить контроль и закрытие позиции при долгом нахождении в зоне перепроданности. Или фильтровать по росту волатильности (ATR). А можно поменять принцип проверки бычьего/медвежьего рынка, чтобы фильтровать резкие просадки и оперативнее разрешать торговлю.