Бэктестинг: пересечение RSI разных периодов

В прошлый раз мы проверили трендовую📈 природу индикатора RSI. Нами были получены интересные результаты, особенно при торговле основными секторами. В этот раз мы продолжим двигаться👣 в направлении изменения индикатора RSI, но будем использовать сигнал🛎 разворота тенденции.

Рассмотрим пересечение индикаторов RSI разных периодов. Алгоритмы пишем в Quantopian на Python🐍.

В этот раз:

  • Попробуем быть на шаг впереди, используя 13-дневный и 65-дневный периоды RSI.
  • Попробуем использовать стандартные 14-дневный и 70-дневный периоды RSI.
  • Посмотрим на лучший период прошлого теста и используем 20-дневный и 100-дневный RSI.
  • Попробуем отфильтровать тренды с помощью скользящих средних.

Индикатор RSI показывает отношение средних роста и падения цены. Подробнее о RSI можно прочитать в первой статье. Мы же будем проверять сигналы разворота тенденции движения цены. Как известно, короткий период индикатора быстрее реагирует на изменение цены, а длинный — медленнее. Пересечение этих двух периодов позволит нам получить сигнал разворота, чуть раньше.

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

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

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

Сделаем следующее:

  • Откроем длинные позиции, когда быстрый индикатор пересекает медленный снизу вверх, а медленный RSI выше 50.
  • Откроем короткие позиции, когда быстрый индикатор пересекает медленный сверху вниз, медленный RSI ниже 50.
  • Удерживаем открытые позиции, когда значение быстрого RSI в диапазоне ±10 от значения медленного RSI.

В конце статьи исходный код на Python и таблица с результатами.

👆Условия

  • Торгуем SPY или фондами основных секторов — XLY, XLK, XLI, XLB, XLE, XLP, XLV, XLU, XLF, XLRE.
  • Капитал $100 000.
  • Торгуем с 2004 до 2017 года (13 лет).
  • Торгуем на открытии рынка.
  • Периоды индикаторов (быстрый X медленный): 13×65, 14×70, 20×100.
  • Направления: только длинные позиции, торгуем в обе стороны.
  • Без стопов.

👌Пересечение 13×65

В первую очередь попробуем реагировать раньше толпы и будем получать сигналы при пересечении 13-дневного и 65-дневного периодов RSI. SPY при этих настройках проявляет себя плохо. Особенно в периоды отсутствия ярко выраженных трендов. Алгоритм находится в открытых позициях 61% времени (за весь период капитал вложен в SPY только 61% времени, примерно 8 из 13 лет).

Код проверки сигналов:

# calculate RSI
arr_rsi_fast = talib.RSI(prices[stock], timeperiod=context.RSI_PERIOD_FAST)
rsi_fast = arr_rsi_fast[-2]
rsi_fast_prev = arr_rsi_fast[-3]
arr_rsi_slow = talib.RSI(prices[stock], timeperiod=context.RSI_PERIOD_SLOW)
rsi_slow = arr_rsi_slow[-2]
rsi_slow_prev = arr_rsi_slow[-3] 
 
# signal to open on enter
long_allow = rsi_fast_prev < rsi_slow_prev and rsi_fast > rsi_slow and rsi_slow > 50
short_allow = rsi_fast_prev > rsi_slow_prev and rsi_fast < rsi_slow and rsi_slow < 50
 
# signal to hold
long_hold = rsi_fast > rsi_slow - context.RSI_HOLD_DEVIATION
short_hold = rsi_fast < rsi_slow + context.RSI_HOLD_DEVIATION

Торговля основными секторами позволяет заработать и опередить SPY по стратегии «Купи и держи«. При бэктесте лучшие результаты показал алгоритм с диапазоном удержания ±12 от медленного RSI. Опережающая доходность есть только при торговле в длинную. Стратегии с короткими позициями показывают отрицательную доходность, и я их в результаты не добавлял. При тестировании алгоритм находится в открытых позициях 91% времени.

👍Пересечение 14×70

Стандартный 14-дневный и 70-дневный периоды показывают в сегодняшних тестах лучшую доходность при умеренной просадке в -24%. Алгоритм в открытых позициях 91% процент времени. И снова лучшими были тесты с диапазоном удержания ±12 от медленного RSI. Предположу, что можно подобрать более удачную величину диапазона. Попробуйте.

👌Пересечение 20×100

Увеличенные периоды до 20 и 100 дней положительно отразились на доходности торговли одиноким фондом SPY. Уменьшив количество сделок в сравнении с 13х65 и увеличив время в позиции до 63%.

Торговля равными долями секторов снова вырвалась вперед. Удалось снизить просадку до -21%. Видно, что стратегия плохо себя ведет в периоды боковика и коррекций с 2015 года. Капитал работает 94% времени, что очень хорошо. Есть явный период простоя в районе 2009 года.

👌Фильтруем вход по SMA(200)

Фильтрация трендов с помощью скользящих средних SMA(20) и SMA(200) лишь ухудшила наши результаты. Само по себе пересечение разных периодов прекрасно фильтрует направление основной тенденции цены. Лучшие показатели доходности при фильтрации сохранились на максимальных периодах RSI(20×100).

🏆Результаты тестов

Стратегия Доход Просадка Кол-во сделок Alpha Beta
SPY, Long*, 13×65/10** +13% -20% 88/66*** -0.01 0.23
SPY, Long, 13×65/12 +45% -21% 70/49 0.01 0.25
SPY, Long&Short, 13×65/10 +18% -29% 120/105 0.04 -0.23
Sectors, Long, 13×65/10 +271% -29% 1003/1083 0.07 0.44
Sectors, Long, 13×65/12 +273% -25% 946/1016 0.07 0.46
Sectors, Long&Short, 13×65/10 +69% -39% 1285/1413 0.09 -0.33
RSI(14×70)
SPY, Long, 14×70/10 +54% -21% 77/55 0.01 0.24
SPY, Long, 14×70/12 +60% -21% 69/44 0.02 0.26
SPY, Long&Short, 14×70/10 +75% -25% 103/87 0.07 -0.19
SPY, Long, 14×70/10, SMA20x200 +40% -19% 72/52 0.01 0.20
SPY, Long&Short, 14×70/10, SMA20x200 +59% -26% 89/83 0.07 -0.22
Sectors, Long, 14×70/10 +277% -23% 951/1042 0.07 0.47
Sectors, Long, 14×70/12 +305% -24% 905/988 0.07 0.48
Sectors, Long&Short, 14×70/10 +95% -40% 1209/1348 0.10 -0.32
Sectors, Long, 14×70/10, SMA20x200 +239% -25% 910/997 0.06 0.44
Sectors, Long&Short, 14×70/10, SMA20x200 +104% -34% 1165/1293 0.10 -0.30
RSI(20×100)
SPY, Long, 20×100/10 +69% -20% 53/33 0.02 0.26
SPY, Long, 20×100/12 +46% -23% 48/28 0.01 0.29
SPY, Long&Short, 20×100/10 +77% -31% 68/54 0.07 -0.18
SPY, Long, 20×100/10, SMA20x200 +48% -16% 48/31 0.01 0.21
SPY, Long&Short, 20×100/10, SMA20x200 +84% -27% 61/49 0.08 -0.22
Sectors, Long, 20×100/10 +290% -24% 736/837 0.07 0.50
Sectors, Long, 20×100/12 +261% -21% 703/782 0.06 0.49
Sectors, Long&Short, 20×100/10 +137% -34% 894/1048 0.10 -0.23
Sectors, Long, 20×100/10, SMA20x200 +250% -27% 668/783 0.06 0.46
Sectors, Long&Short, 20×100/10, SMA20x200 +230% -31% 830/989 0.13 -0.27
  1. Long — только длинные позиции. Long&Short — длинные и короткие позиции.
  2. Периоды индикаторов RSI и величина диапазона удержания. {Быстрый}x{Медленный}/{Удержание}.
  3. Кол-во покупок/ Кол-во продаж.

🎁Код в студию

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

🏁Вывод

Опять не удалось получить доходности при торговле в короткую. Тесты убыточны с большими просадками. Максимальная доходность схожа с предыдущей стратегией следования за индикатором RSI. Сегодняшние тесты показывают чуть меньшую просадку.

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

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

💬В комментариях напишите ваше мнение о стратегии. Что можно улучшить? Где есть ошибки?

🎓Обучение внутредневному трейдингу в United Traders👍.
Александр Румянцев aka "iamraa"
Автор Quantrum.me
Интересуетесь алготрейдингом на Python? Присоединяйтесь к команде. Пишите в личку или на email.