Простой event-driven бэктестер, или как быстро потерять деньги на бинарных опционах

В этот раз сделаем простой бэктестер. Начнём с бинарных опционов, так как у них примитивный принцип работы. Мы делаем ставку, а она на следующей свече выиграет или проиграет.

Также посмотрим на работу стратегии с Мартингейлом и опасность, которую она несёт. Часто, есть периоды, когда подобные стратегии рисуют красивый график с прибылью. Но заканчиваются чудеса молниеносно быстро, несколькими ставками в максимальный убыток.

Для проверки, проведём тесты на минутном таймфрейме за июль 2018 года на паре EUR/USD. Поможет нам в этом Jupyter и Python 3.6.

Событийно-ориентированный бэктестер

Это относительно медленный бэктестер, который позволяет тестировать историю цен исключая заглядывание в будущее. Для его работы нам требуется:

  • Класс (Account), отвечающий за баланс и обработку ставки.
  • Функция (стратегия), вызываемая на каждой свече, работающая с прошлой историей.
  • Pandas датафрейм с OHLC историей цен и цикл перебора тиков.

Account

Здесь всё просто. Следим за балансом, принимаем и проверяем ставки. А также накапливаем последовательный убыток.

Стратегии

Эти функции мы будем использовать в цикле, чтобы через одну из них прошли все имеющиеся ценовые бары. Дополнительно, сопроводим каждый бар объектом account и историей цен без будущего. Тест останавливается при потере капитала.

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

Стратегия, фильтрующая тренд:

Стратегия возврата к среднему:

Цикл перебора истории

Осталось подготовить данные и запустить. Используем цикл, так как скорость его работы равна скорости использования метода pd.DataFrame().apply(). И, в отличии от метода, нам будут видны возникающие ошибки. Дополнительно добавим остановку при получении ошибки.

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

Брокер бинарных опционов всегда накладывает дополнительные ограничения на игроков. Мы учтём только часть.

  • Начальный капитал 100К руб.
  • Минимальная ставка 1000 руб.
  • Коэффициент прибыли 0.82%.
  • Пара EUR/USD.
  • Принимаем решение каждую минуту.
  • Дожи фильтруем при разнице менее 0,005%.
  • Когда используем Мартингейл, то должны покрыть убыток и получить прибыль первой ставки.
  • Максимальная ставка при Мартингейле — 20К руб. Если больше, то обнуляем накопленный убыток и начинаем с минимальной ставки.
  • Ограничим время ставок. Будем играть в рабочие дни с понедельника до пятницы в рабочие часы с 10 до 18 (8 часов).

Что мы не можем учесть:

  • Остановку приема ставок в любое время, если брокеру не выгодна ситуация на рынке.
  • Изменение коэффициента прибыли с течением времени.

Простые тесты

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

Для проверки запустим тест без Мартингейла с самой простой стратегией, и посмотрим, как капитал растает к концу третьего дня.

Добавление мартингейла позволяет слить капитал к середине первого дня.

Удача была на стороне брокера. Попробуем усложнить себе жизнь.

Фильтр по минутному тренду

Теперь добавим простые технические индикаторы, показывающие направление тренда. Они запаздывают, но должны помочь отфильтровать неблагоприятные моменты.

Как мы видим, с мартингейлом удалось протянуть два дня. Без него — четыре. Но тренд на средних нам не помог.

Возврат к среднему

В заключение рассмотрим ставки по стратегии возврата к среднему. Проверяем максимум и минимум за последние 200 минут. Для ставки на рост проверяем, чтобы цена была не далее 15% от максимума, а RSI(3) показывал перепроданность. И что мы видим? Мы продержались 22 торговые сессии и даже вышли в плюс.

Добавление мартингейла с ограничением максимальной ставки до 20К руб. приносит нам 80% прибыли.

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

Все наблюдения

Ниже таблица со всеми результатами:

Колонки:

  • balance — итоговый результат.
  • max drawdown, % — максимальная просадка в процентах.
  • max win — максимальный выигрыш.
  • max loss — максимальный проигрыш.
  • bets — количество ставок.
  • wins — количество выигрышных ставок.
  • loss — количество проигрышных ставок.
  • lifetime — количество часов жизни капитала.

Сокращения:

  • RSI, SMA, MACD — названия индикаторов.
  • Reversal — возврат к среднему.
  • Min/Max — торговля рядом с минимумами и максимумами.
  • Mart — мартингейл.
  • Reverse candle — разворот сигнала на противоположный.

Заключение

Тесты показали, что стабильность тренда на минутках предсказать очень тяжело. А вот развороты дались легче. Возврат к среднему рядом с максимумами/минимумами позволил даже заработать. Мартингейл даёт возможность быстро вернуться к прибыли, но на длинных дистанциях стабильно ведёт к полной потере счёта.

Бэктестер доработаем в следующих статьях и реализуем механизм торговли акциями.

В комментариях задавайте вопросы и выражайте своё мнение.

Александр Румянцев
Автор на Quantrum.me
Telegram-канал📣: @quantiki

Экспертиза торговых стратегий и алгоритмов, оптимизация среднесрочных портфелей.
📈 Участвуйте в IPO американских компаний c UT👍.