Как я нашёл баг в своём бэктесте и потерял 30% прибыли (но спас депозит)
История о том, почему красивые цифры на истории — это ещё не повод запускать робота на реальные деньги.
Я разрабатываю торгового бота для форекса. Однажды я собрал стратегию, которая на истории в 2 года показывала Profit Factor 1.32 и винрейт 53%. Я был уверен, что нашёл грааль. Но когда я добавил в симулятор всего одну строчку — модель проскальзывания при гэпах — прибыль испарилась. Вот как это было.
Я тестировал стратегию азиатского пробоя. Логика простая: ночью рынок стоит в узком диапазоне, а утром, на открытии Лондона, цена часто пробивает границу. Мы ставим два стоп-ордера: выше максимума и ниже минимума ночи.
Первые прогоны на GBPUSD за два года показали:
- Profit Factor: 1.32
- Win Rate: 53.1%
- Чистая прибыль: +1925 пипсов
- Walk-Forward: 7 из 8 окон прибыльные.
Цифры выглядели настолько стабильными, что я почти поверил в успех. В бэктесте стратегия входила в рынок по цене стоп-ордера.
Где был подвох.
Проблема в том, как симулятор обрабатывал «гэпы» — ситуации, когда цена открытия бара уже находится за уровнем моего стоп-ордера. В реальной торговле брокер исполнил бы мой ордер по текущей рыночной цене, которая может быть хуже. А мой старый код «рисовал» идеальный вход по цене ордера.
Я добавил в движок честную проверку: «Если открытие бара уже за уровнем входа, исполняй по открытию, а не по уровню».
Результат того же самого прогона:
- EURUSD: PF упал с 1.18 до 0.96
- GBPUSD: PF упал с 1.32 до 1.02
- USDJPY: PF упал с 1.40 до 1.10
- EURJPY: PF упал с 1.29 до 0.98
Вся «прибыль» оказалась артефактом. В 37% дней цена уже выходила за границы диапазона до момента постановки ордеров. Старый бэктест входил по цене, которой на рынке уже не было.
Что я понял.
Этот случай научил меня трём вещам:
- Любая модель гэпов врёт в свою пользу, пока не доказано обратное. Если ваш бэктест не учитывает проскальзывание, он показывает вам сказку.
- Проверять нужно не «сработала ли стратегия», а «что именно произошло на конкретном баре в момент входа».
- PF 1.3 без walk-forward и проверки на устойчивость к спреду — это ещё не edge, а просто оптимистичная симуляция.
Я не запустил этого бота на реальные деньги. И это было лучшим решением. Теперь я переписал движок с нуля и добавил в него честную модель исполнения. И знаете что? Теперь я доверяю своим тестам гораздо больше, даже если цифры в них выглядят скромнее.
А если вы тоже пишете ботов или тестируете стратегии, заглядывайте в мой Telegram-канал «Грааль не найден». Там я разбираю чужие и свои стратегии, показываю код, цифры и провалы. Без инфоцыганства и обещаний «заработать за 3 дня».
#бэктест, #алготрейдинг, #python, #трейдинг, #личный_опыт