Бэктестинг: торговля на импульсе с помощью ATR

Индикатор ATR (Average True Range) показывает среднюю⚖ величину изменения цены внутри дня за указанный период. Отлично подходит для выбора уровней стопов📉. Также индикатор показывает рост волатильности📊 в активе, когда сохраняет высокие значения.

Работаем на Quantopian (см. сюда), код пишем на Python🐍. Проверяем стратегии:

  • Как есть.
  • Фильтр по SMA200.
  • Торговля в двух направлениях.
  • Аналог стоп-приказа.
  • Фильтр по объему.

Немного об ATR

ATR (Average True Range) широко известен среди трейдеров, использующих технический анализ. Индикатор рассчитывается на заданный период и использует значения максимума цены, минимума цены и цены закрытия. Является прекрасным фильтром для отбора акций для внутридневной торговли. Подходит для определения уровня установки стоп-приказа, обычно это 1-3 ATR от цены входа.

По ATR можно определить рост волатильности (изменчивости) цены, что в свою очередь указывает на волнения на рынке. Высокая волатильность является индикатором роста цен на опционы.

Стандартный период ATR: 14

🎓Гипотеза

Стратегия взята из примеров на Quantopian.

ATR — это средний диапазон изменения цены учитывающий максимум и минимум. Основываясь на этом, предположим, что при резком изменении цены более 1х ATR, мы получаем сигнал об импульсе на рынке в определенном направлении. Импульс возможен, когда рынок что-то узнал и начинает двигаться в направлении своих ожиданий. Если цена изменилась вверх — время покупать, если вниз — закрывать позицию.

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

Если после открытия позиции цена начнет снижаться маленькими свечками (такое бывает после гапов) — это для нас большая проблема, мы терпим убытки и не получаем сигнал на выход. Это против нас.

При росте волатильности мы можем не получить сигнал на закрытие, так как цена может снижаться меньшими свечами, чем текущий ATR. Это против нас.

Условия тестирования:

  • SPY, IWM.
  • c 01/01/2004 до 13/01/2017 (13 лет).
  • торгуем спустя 1 час после открытия рынка.

☔Что надо знать

Библиотека TA-Lib на индикаторе ATR снова проявила свои проблемы и мы получаем разные сигналы при обработке разных периодов. Постоянство появилось после увеличения анализируемого периода выше 100 дней. Ниже графики с пометками о величине истории. Размах отклонений впечатляет, не так ли?

👌Как есть

В этом тесте проверим, как индикатор работает сам по себе, без настройки и подкрутки. Посмотрим, как на него влияет время начала торговли: на открытии рынка или спустя 1 час. ATR считаем за последние 14 дней, помним, что величина истории для анализа должна быть более 100 дней.

На графиках видно, что стратегия сама по себе работает очень прилично — 141% доходности против -11% просадки на SPY. Результаты восхитительны. Проверять сигналы надо через 1 час после открытия, иначе волатильность первого часа сведет на нет все старания. На рынке мы находимся всего 50% времени. Результаты внизу статьи. Дополнительно в результатах добавлены показатели тестов DIA и IWM.

👎Фильтр по SMA200

В этот раз будем фильтровать открытие позиций по положению цены над 200-дневной скользящей средней (SMA200). В техническом анализе принято так, что если цена над SMA200 — это бычий тренд, под ней — медвежий. Теперь мы будем открывать позиции только во время бычьего тренда.

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

Код запрашивайте в комментариях💬.

👎Торгуем в двух направлениях

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

Код запрашивайте в комментариях💬.

👍Может быть, стопы?

Я решил заменить стоп-приказы на сигнал увеличения ATR относительно значения на момент открытия позиции. Например, мы открываем позицию с ATR=$1, а закроем при ATR=$2. Почему? Потому что сигнал на закрытие при резком падении цены хорош, только вот незадача, если ATR вырастет до того как цена сделает резкое движение (широкий диапазон хода цены между максимумом и минимумом, при закрытии рядом с открытием), то мы так и останемся в позиции. Теперь сам рост волатильности для нас будет являться сигналом на выход.

Результаты оказались удивительными. SPY не показал изменений, предположу, по причине меньшей волатильности. А вот более изменчивый IWM показал улучшение доходности в 2,5 раза и незначительное снижение просадки.

Код запрашивайте в комментариях💬.

👎Фильтр по объему

Фильтровать по объему оказалось не так-то просто. Ведь сегодняшний объем мы еще не знаем, на текущий момент объема еще не достаточно, а вот вчерашний, с высокой вероятностью, будет не таким большим, как сегодня.

Попытка фильтровать по вчерашнему объему, чтобы он был выше среднего за последние 50 дней, привели к незначительным улучшениям/ухудшениям. По этой причине было решено фильтровать по росту объема, а именно вчерашний объем должен быть больше, чем в предыдущий день.

Итоговые результаты не впечатляют. Удалось отфильтровать просадку IWM и получить 9 прибыльных сделок из 11, что тоже результат.

Алгоритм имеет право на существование, но его необходимо дорабатывать. Например, открывать позиции на следующий день после сигнала, если объем в день сигнала был больше среднего в 2 раза.

Код запрашивайте в комментариях💬.

🏆Результаты

Стратегия Время торгов Кол-во сделок PnL дни PnL сделки Доходность Просадка
Купи-Держи Open 53/0 - 100% 160.1% -54.9%
Как есть: SPY Open+1 35/35 24% 71.4% 141% -10.7%
Как есть: DIA Open+1 45/45 23% 66.7% 99.8% -18.8%
Как есть: IWM Open+1 27/27 17% 70.3% 84% -54.7%
SMA200: SPY Open+1 32/32 24% 71.9% 73% -12.9%
SMA200: IWM Open+1 25/25 19% 72% 102.4% -14.1%
Обе стороны: SPY Open+1 35/35 2% 48.6% 72.8% -42.9%
Стоп-лосс: SPY Open+1 35/35 24% 71.4% 141% -10.7%
Стоп-лосс: IWM Open+1 35/35 19% 71.4% 190% -34.3%
Объем: SPY Open+1 25/25 22% 64% 65.8% -12.6%
Объем: IWM Open+1 11/11 25% 81.8% 90.8% -14.1%
  • Время торгов — время, когда алгоритм начинает торговать: Open — открытие рынка, Open+1 — через 1 час после открытия рынка.
  • Кол-во сделок — количество сделок на покупку и продажу. В поле указаны Покупки/Продажи.
  • PnL дни — отношение прибыльных дней к убыточным. Если прибыльных больше — значение положительное.
  • PnL сделки — процент прибыльных сделок к общему количеству.

🎁Код в студию

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

🏁Заключение

Индикатор ATR на удивление дает очень хорошие результаты и позволяет своевременно открывать прибыльные позиции. Отлично показал себя в голом виде на SPY и при фильтрации относительно SMA200 и объема на IWM. Более 70% прибыльных сделок — это отличный результат.

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

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

💬Напишите в комментариях, как еще можно улучшить алгоритм с ATR. Что необходимо учесть? Или предложите, какие стратегии стоит рассмотреть в будущем.

Александр Румянцев aka "iamraa"
Автор Quantrum.me
Интересуетесь алготрейдингом на Python? Присоединяйтесь к команде. Пишите в личку или на email.
Готовы начать торговать💰? Тогда открывайте счет поближе к профессионалам👍.