Бэктестинг: следуем за RSI

В прошлый раз мы рассмотрели👀 алгоритм торговли разворотов по сигналам RSI. В этой статье посмотрим, можно ли следовать в направлении↗ движения RSI. Ведь индикатор показывает именно направление изменения цены💵. Алгоритмы пишем в Quantopian на Python🐍.

В этот раз:

  • Следуем в направлении RSI на одном таймфрейме (день).
  • Следуем в направлении RSI на разных таймфреймах (час, день).
  • Отфильтруем тренд актива средними.

Чуть подробнее об RSI можно прочитать в прошлой статье. Индикатор показывает отношение средних роста и падения цены. Значение выше 50 указывает на рост цены, ниже — на падение.

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

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

RSI учитывает движение цены и показывает общую тенденцию в прошлом. Обычно тенденция сохраняется некоторое время, на что мы и сделаем ставку.

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

  • Откроем длинные позиции, когда RSI пересек 55 снизу вверх и короткие позиции, когда RSI пересек 45 сверху вниз. Закроем длинные ниже 45, а короткие выше 55.
  • Совместим разные таймфреймы. Будем открываться выше 70 на часовом графике и закрываться выше 70 на дневном. Дополнительный сигнал закрытия будет ниже 30 на часовом графике.
  • Проверим, помогут ли нам скользящие средние для улучшения результатов.

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

👆Условия

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

👌Стратегия следования

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

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

#...
# signal to open on enter
long_allow = rsi > context.RSI_HIGH and rsi_prev < context.RSI_HIGH
short_allow = rsi < context.RSI_LOW and rsi_prev > context.RSI_LOW
 
# signal to hold
long_hold = rsi > context.RSI_HIGH - context.RSI_HOLD_DEVIATION
short_hold = rsi < context.RSI_LOW + context.RSI_HOLD_DEVIATION
#...

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

Секторы показывают просадку в -46%, которую попробуем победить далее.

Открываемся на часовиках, закрываемся на днях

На графике торгуем SPY. Лучшие результаты снова только на длинных позициях и 20-ти периодном индикаторе. На уровне 70-ти на часовом графике мы открывали позицию. Закрывали ее на 70-ом уровне на дневном графике или на 30-ом уровне часового графика, если цена развернулась. Просадка на приемлемом уровне в -16%. До 2009 года алгоритм «спал».

Подготовка часовой истории описана в этой статье. Ниже примеры сигналов из кода:

#...
# calculate hourly RSI
arr_rsi = talib.RSI(prices_hour[stock], timeperiod=context.RSI_PERIOD)
# use RSI of hourly close
rsi = arr_rsi[-1]
rsi_prev = arr_rsi[-2]

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

# signal to hold
long_hold = rsi > context.RSI_LOW
short_hold = rsi < context.RSI_HIGH

# calculate daily RSI
arr_daily_rsi = talib.RSI(prices[stock], timeperiod=context.RSI_PERIOD)
daily_rsi = arr_daily_rsi[-2] # yesterday close price OR may check last
# add daily pos
long_allow = long_allow and daily_rsi < context.RSI_HIGH
short_allow = short_allow and daily_rsi > context.RSI_LOW
# add daily pos
long_hold = long_hold and daily_rsi < context.RSI_HIGH
short_hold = short_hold and daily_rsi > context.RSI_LOW

#...

Данная стратегия тестируется значительно дольше по сравнению с дневной историей. Это усложняет ее изучение.

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

 

Победителем сегодняшних тестов является алгоритм торговли секторами в длинную по 20-дневному RSI. Дополнительно тренд активов фильтруется пересечением SMA(20) и SMA(200). Алгоритм обгоняет SPY по стратегии «Купи и держи«, имея уровень просадки в -27%.

Выдержки из кода:

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

# signal to hold
long_hold = rsi > context.RSI_HIGH - context.RSI_HOLD_DEVIATION
short_hold = rsi < context.RSI_LOW + context.RSI_HOLD_DEVIATION

# filter signals by sma200
sma_short = talib.SMA(prices[stock], timeperiod=20)
sma_long = talib.SMA(prices[stock], timeperiod=200)
# filter open
long_allow = long_allow and sma_short[-1] > sma_long[-1]
short_allow = short_allow and sma_short[-1] < sma_long[-1]
# filter hold
long_hold = long_hold and sma_short[-1] > sma_long[-1]
short_hold = short_hold and sma_short[-1] < sma_long[-1]

#...

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

Стратегия Доход Просадка Кол-во сделок Alpha Beta
SPY, Long*, 10** +19% -37% 133/113 -0.01 0.34
SPY, Short, 10 -46% -49% 154/154 -0.01 -0.44
SPY, Long&Short, 10 -10% -52% 272/197 -0.02 0.22
SPY, Long, 14 +50% -30% 100/74 0.01 0.31
SPY, Short, 14 -49% -50% 162/162 -0.00 -0.42
SPY, Long&Short, 14 -7% -54% 205/155 -0.02 0.19
Sectors, Long, 14 +223% -45% 860/898 0.04 0.60
SPY, Long, 20 +102% -15% 71/44 0.03 0.30
SPY, Short, 20 -47% -49% 123/123 -0.00 -0.42
SPY, Long&Short, 20 +28% -42% 93/108 0.07 -0.33
Sectors, Long, 20 +269% -46% 927/1011 0.06 0.58
Разные таймфреймы
SPY, Long, H/D***, 14 +44% -44% 153/139 0.00 0.30
SPY, Short, H/D, 14 -22% -28% 356/358 -0.01 -0.06
SPY, Long&Short, H/D, 14 -33% -53% 176/379 0.01 -0.22
SPY, Long, H/D, 20 +155% -16% 71/58 0.05 0.24
Sectors, Long, H/D, 20 +6% -59% 946/1317 -0.03 0.50
Фильтр по SMA20 и SMA200
SPY, Long, SMA20x200, 14 +43% -21% 64/44 0.01 0.21
Sectors, Long, SMA20x200, 14 +208% -21% 918/1001 0.06 0.41
Sectors, Long&Short, SMA20x200, 14 +133% -41% 1167/1294 0.12 -0.32
SPY, Long, SMA20x200, 20 +53% -19% 57/40 0.02 0.20
Sectors, Long, SMA20x200, 20 +304% -27% 714/809 0.08 0.44
Sectors, Long&Short, SMA20x200, 20 +228% -49% 1078/1159 0.08 0.24
  1. Long — только длинные сделки. Short — только короткие сделки. Или в обоих направлениях.
  2. Период индикатора.
  3. Стратегия открытия на часовых, закрытия на дневных.

🎁Код в студию

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

🏁Вывод

Результаты подтверждают трендовую природу индикатора. Стратегия следования показывает лучшую доходность в сравнении со стратегией разворотов.

Лучшие результаты оказались при использовании сигналов за 2 недели, RSI(20). Сильное влияние оказывает диапазон просадки значения RSI при удержании позиции. Ниже изменение доходности при торговле секторами, которые были получены при разных уровнях RSI:

  • Открыли на 55, держим выше 45 — +304%
  • Открыли на 55, держим выше 44 — +340%
  • Открыли на 55, держим выше 43 — +322%
  • Открыли на 55, держим выше 42 — +278%
  • Открыли на 55, держим выше 41 — +265%

Уменьшить просадку в стратегиях позволил фильтр по положению скользящих средних, SMA(20) и SMA(200).

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

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

💬В комментариях напишите ваше мнение о статье. Укажите на недочеты и расскажите о вашем опыте использования RSI.

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