Слогер Создать блог
Деньги

Как сделать бэктест торговой стратегии и не обмануть себя

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

Бэктест — это симуляция, а не калькулятор. Если вы прогоняете исторические цены через индикатор и смотрите на кривую доходности, вы почти наверняка обманываете себя. Знакомая история: стратегия идеальна на графике, а на живых деньгах разваливается за пару сделок. Я через это прошёл, поэтому предупреждаю без нравоучений.

Почему наивный бэктест врёт

Простейший бэктест — это цикл по строкам таблицы с ценами. Есть цена, есть скользящие средние, есть условие купить или продать. Но такой цикл игнорирует три вещи, которые превращают реальную торговлю в совсем другую игру.

Первая — look-ahead bias. Индикаторы считаются по всей истории сразу, хотя в каждой точке у вас есть только прошлые данные. Вторая — издержки. Нет комиссий, проскальзываний и влияния ордера на рынок. Третья — исполнение. В модели вы торгуете по цене закрытия, которую только что увидели, а в жизни заявка исполняется по другой цене.

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

Четыре принципа честного бэктеста

  1. Событийная симуляция. Вместо цикла по заранее посчитанной таблице — подача рыночных событий объекту стратегии в момент, когда они возникают. Решение принимается только на основе данных, доступных в этот момент времени.
  2. Явные издержки. Проскальзывание, комиссия и рыночное влияние закладываются в каждое исполнение ордера, а не добавляются потом.
  3. Изолированное состояние. Позиция, цена входа и прочие данные живут внутри объекта стратегии. Так будущее не протекает в прошлое.
  4. Векторизованная аналитика. Индикаторы считаются быстро и сразу для всего массива, но основной цикл остаётся событийным.

Когда я собрал такую версию, та же стратегия показала реалистичную просадку. И это было лучше, чем красивая кривая: наконец-то стало видно, где именно заканчивается грааль.

Сравнение двух подходов

ПараметрНаивный циклСобытийная модель
Данные для решенияВся история сразуТолько прошлые данные
ИздержкиНулевыеКомиссия и проскальзывание на каждый ордер
ИсполнениеПо цене закрытия текущей свечиС проскальзыванием против вас
Состояние стратегииГлобальные переменныеВнутри объекта стратегии
Кривая доходностиИдеальнаяПохожа на реальность

Как перейти на честный бэктест

Возьмите стратегию на пересечении скользящих средних 50 и 200 на дневных данных SPY и постройте её заново.

  1. Посчитайте индикаторы векторизованно для всего набора данных — это быстро и удобно.
  2. Создайте класс стратегии с полями cash, position, commission и slippage.
  3. В методе исполнения ордера добавляйте проскальзывание как процент от цены и комиссию с оборота.
  4. В главном цикле идите по строкам данных, но каждое решение передавайте объекту стратегии. Состояние живёт внутри объекта.
  5. После каждого бара пересчитывайте капитал как сумму денег и стоимости позиции по текущей цене.

Это не занимает много кода. Но именно эти несколько строк отделяют честную проверку идеи от рисования красивых картинок.

Типичные ошибки

  • Считать индикаторы на всей истории, а потом решать, будто знали будущее.
  • Забыть про комиссию и проскальзывание. Они съедают небольшую часть каждой сделки, а за год — ощутимый кусок доходности.
  • Торговать по цене закрытия текущего бара. В реальности придётся брать цену следующего бара или учитывать проскальзывание.

Вывод

Честный бэктест не гарантирует прибыль, но отсекает большую часть самообмана. Начинайте с простой событийной модели с издержками и изолированным состоянием. Код на Python для этого подходит, и через год такой подход не устареет.

По материалам: finance. Текст переработан редакцией Слогера.

← На главную

Рекламное место — Конец поста
Реклама · Слогер

Комментарии (0)

Войдите, чтобы комментировать.

Пока нет комментариев. Будьте первым.