В этот раз мы протестируем⏱ стратегию торговли уровней перекупленности и перепроданности. Разворачивать🔃 нас будет индикатор 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 или фондами основных секторов —
- Капитал $100 000.
- Торгуем с 2004 до 2017 года.
- Торгуем на открытии рынка.
- Без стопов.
🔃Торгуем развороты
В первую очередь тестируем при входе в уровни перекупленности/перепроданности. Сигналы при пересечении 70-ти снизу и 30-ти сверху.
Имеется сильная просадка, которая связана с отсутствием ограничителей и стопов. У нас есть сигнал только на открытие. Открывшись раз, мы закроемся только на противоположном уровне. Если на рынке сохраняется тренд, то до противоположного уровня мы можем быстро и не добраться.
При торговле по RSI необходимо учитывать тренд актива.
В коде мы должны проверять сигнал на вход, сигнал на выход и условия удержания позиции. Ниже выдержки из кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# ... 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 по средним, а по сигналу использовать маржу для удваивания позиции на ограниченное время.
Ниже выдержка из кода, как можно управлять ограничением удержания позиции:
1 2 3 4 5 6 7 8 9 10 |
# ... # 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 |
- Вход — сигнал при входе в зону перекупленности/перепроданности (например, при пересечении 70-ти снизу вверх). Выход — сигнал при выходе (например, при пересечении 70-ти сверху вниз).
- Лонг — только длинные сделки. Шорт — только короткие сделки. Или в обоих направлениях.
- 20 дней — максимальное количество дней удержания открытой позиции.
- Тест на основных секторах: XLY, XLK, XLI, XLB, XLE, XLP, XLV, XLU, XLF, XLRE. Капитал распределяется равными долями между активами на открытие и удержание.
🎁Код в студию
Вопросы по коду пишите в комментариях💬.
Исходный код доступен в репозитории.
🏁Вывод
На основании результатов видно, что чаще и лучше работают сигналы по тренду. За анализируемый период рынок большую часть времени рос. Лучшая доходность на сигналах покупки от 30-го уровня.
Можно увеличить или уменьшить количество сигналов изменением периода индикатора. Оптимальным решением является предварительный анализ актива. Подбор уровней и периода для достижения наилучших показателей. Также важно учитывать тренд актива.
Соглашусь, что это будет подгонка под прошлое. Но кто мешает разработать алгоритм подбора параметров и проверить его на разных периодах? Подобрать оптимальные параметры на одном периоде и проверить результаты на других.
В следующий раз рассмотрим стратегию следования за RSI на разных таймфреймах. Также добавим проверку тренда актива.
💬В комментариях оставляйте ваше мнение. Может, где ошибка или что можно улучшить? Предлагайте, что еще можно протестировать.
Автор Quantrum.me
Telegram-канал📣: @quantiki
Подбор и тестирование портфелей. Подключение стратегий к IB.