Бэктестинг: ловим развороты по RSI

В этот раз мы протестируем⏱ стратегию торговли уровней перекупленности и перепроданности. Разворачивать🔃 нас будет индикатор RSI (Индекс относительной силы). Тестировать будем в Quantopian, а код писать на Python🐍.

На повестке дня:

  • Результаты разворотов🔃 на уровнях перекупленности/перепроданности.
  • Влияние срока⏰ удержания позиции.
  • Сравнение⚖ разных периодов индикаторов.

RSI — индикатор индекса относительной силы. В его основе лежит отношение среднего роста цены за период к среднему падению цены за период. Если индикатор выше 50-ти, значит в среднем цена выросла и, наоборот. Многие трейдеры используют данный индикатор для определения потенциальных разворотов цены.

Автор индикатора предлагает использовать 14-ти дневный период. Уровень перекупленности актива находится на 70-ти. От него может начаться откат. На 30-ти — уровень перепроданности, и мы ожидаем подъём. Но, на графике видно, что данные уровни (30/70) отрабатывают не всегда.

Однако, мы это проверим на исторических данных с 2004 года.

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

RSI показывает развороты. Значит мы будем открывать длинную позицию при достижении 30-го уровня, а короткую при достижении 70-го уровня.

Проверим следующее:

  • На входе: открываем длинные позиции, когда RSI(14) пересек 30 сверху вниз и короткие, когда RSI(14) пересек 70 снизу вверх.
  • На выходе: открываем длинные позиции на пересечении 30-ти снизу вверх и короткие на 70-ти сверху вниз.
  • Ограничим удержание открытой позиции 20-тью днями.
  • Сравним результаты за разные периоды RSI(10/14/18).

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

👆Условия

  • Торгуем SPY или фондами основных секторов — XLY, XLK, XLI, XLB, XLE, XLP, XLV, XLU, XLF, XLRE.
  • Капитал $100 000.
  • Торгуем с 2004 до 2017 года.
  • Торгуем на открытии рынка.
  • Без стопов.

🔃Торгуем развороты

В первую очередь тестируем при входе в уровни перекупленности/перепроданности. Сигналы при пересечении 70-ти снизу и 30-ти сверху.

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

При торговле по RSI необходимо учитывать тренд актива.

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

# ...
arr_rsi = talib.RSI(prices[stock], timeperiod=context.RSI_PERIOD)
# use RSI of daily close
rsi = arr_rsi[-2]
rsi_prev = arr_rsi[-3]

# signal to open on enter
long_allow = rsi < context.RSI_LOW and rsi_prev > context.RSI_LOW
short_allow = rsi > context.RSI_HIGH and rsi_prev < context.RSI_HIGH

# signal to open on exit
#long_allow = rsi > context.RSI_LOW and rsi_prev < context.RSI_LOW
#short_allow = rsi < context.RSI_HIGH and rsi_prev > context.RSI_HIGH

# signal to hold
long_hold = rsi < context.RSI_HIGH # hold under high
short_hold = rsi > context.RSI_LOW # hold above low
# ...

Внизу график при открытии позиций на выходе из уровней перекупленности/перепроданности. Сигнал на пересечении 70-ти сверху и 30-ти снизу. Количество сделок практически не поменялось. Результаты могли ухудшиться из-за поздней реакции.

⏰Ограничение времени удержания

Ограничение времени удержания позиции позволило сократить просадку. Доходность практически не изменилась. Упешные развороты обычно коротки. Сигналов мало, что позволяет совместить их с другим алгоритмом. Например, торговать SPY по средним, а по сигналу использовать маржу для удваивания позиции на ограниченное время.

Ниже выдержка из кода, как можно управлять ограничением удержания позиции:

# ...
# decrease hold period
if stock in context.hold_symbols:
    context.hold_symbols[stock] -= 1
 
# buy to long stock
if stock in trades['long']:
    order_target_percent(stock, coef_long) 
    context.hold_symbols[stock] = context.CLOSE_PERIOD
# ...

⚖Сравнение разных периодов

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

Меньше период RSI, больше сигналов. Больше период RSI, меньше сигналов.

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

Стратегия Доход Просадка Кол-во сделок Alpha Beta
SPY, Вход*, Лонг** +75% -51% 16/12 -0.01 0.65
SPY, Вход, Шорт** +5% -4% 66/66 0.00 -0.00
SPY, Вход, Лонг&Шорт** +84% -51% 82/67 -0.00 0.65
SPY, Выход, Лонг +60% -51% 15/11 -0.01 0.63
SPY, Выход, Шорт -6% -6% 67/67 -0.00 -0.01
SPY, Выход, Лонг&Шорт  +54% -51% 84/67 -0.01 0.62
SPY, Вход, 20 дней***, Лонг +73% -16% 15/18 0.02 0.28
SPY, Вход, 20 дней, Шорт +5% -4% 66/66 0.00 -0.00
SPY, Вход, 20 дней, Лонг&Шорт +81% -16% 81/82 0.02 0.27
Sectors****, Вход, Лонг&Шорт +123% -56% 762/667 -0.01 0.95
Sectors, Вход, 20 дней, Лонг&Шорт +1% -60% 766/795 -0.05 0.83
SPY,RSI(10), Вход, Лонг&Шорт +77% -54% 149/115 -0.01 0.73
SPY,RSI(14), Вход, Лонг&Шорт +84% -51% 82/67 -0.00 0.65
SPY, RSI(18), Вход, Лонг&Шорт -9% -51% 39/35 -0.04 0.68
  1. Вход — сигнал при входе в зону перекупленности/перепроданности (например, при пересечении 70-ти снизу вверх). Выход — сигнал при выходе (например, при пересечении 70-ти сверху вниз).
  2. Лонг — только длинные сделки. Шорт — только короткие сделки. Или в обоих направлениях.
  3. 20 дней — максимальное количество дней удержания открытой позиции.
  4. Тест на основных секторах: XLY, XLK, XLI, XLB, XLE, XLP, XLV, XLU, XLF, XLRE. Капитал распределяется равными долями между активами на открытие и удержание.

🎁Код в студию

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

🏁Вывод

На основании результатов видно, что чаще и лучше работают сигналы по тренду. За анализируемый период рынок большую часть времени рос. Лучшая доходность на сигналах покупки от 30-го уровня.

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

Соглашусь, что это будет подгонка под прошлое. Но кто мешает разработать алгоритм подбора параметров и проверить его на разных периодах? Подобрать оптимальные параметры на одном периоде и проверить результаты на других.

В следующий раз рассмотрим стратегию следования за RSI на разных таймфреймах. Также добавим проверку тренда актива.

💬В комментариях оставляйте ваше мнение. Может, где ошибка или что можно улучшить? Предлагайте, что еще можно протестировать.

Александр Румянцев aka "i.am.raa"
Автор Quantrum.me
Интересуетесь алготрейдингом на Python? Присоединяйтесь к команде. Пишите в личку или на email.
☝Вам интересны криптовалюты? 🎓Учитесь ими торговать здесь👍.