Одна из частых причин, почему бэктест отличается от реальной торговли, заключается не в поломке торговой логики, а в неверной модели издержек. В тестере стратегия может показывать привлекательную прибыль, но после запуска на реальном счете доходность снижается, средняя сделка уменьшается, просадка растет, часть сигналов исполняется по худшей цене, а некоторые лимитные ордера не исполняются вообще.
Разница возникает из-за комиссии, спреда, проскальзывания, задержки исполнения, ликвидности, способа моделирования ордеров, отличий котировок, свопов, платы за перенос позиции и других расходов. Бэктест без реалистичных торговых издержек показывает потенциальную логику входов и выходов, но не подтверждает, что эту прибыль можно получить после реального исполнения.
Профессиональная проверка торгового робота должна отвечать на простой вопрос: сохраняет ли стратегия преимущество после учета реалистичных комиссий, спреда и проскальзывания. Если прибыль исчезает после небольшого увеличения расходов, исторический результат не имеет достаточного запаса прочности.
Что входит в торговые издержки
Торговые издержки - это все расходы и потери, которые возникают при открытии, удержании и закрытии позиции. Часть расходов видна в отчете отдельной строкой, а часть скрыта внутри цены исполнения. Комиссия может списываться явно, спред включается в разницу между ценой покупки и продажи, а проскальзывание проявляется как отличие ожидаемой цены от фактической.
Плата брокеру или бирже.
Отдельное списание.
Единица: сторона, цикл, ордер, контракт.
Разница между ценой покупки и продажи.
Включен в цену входа и выхода.
Фиксированный или исторический спред.
Цена меняется до исполнения.
Фактическая цена хуже ожидаемой.
Модель для разных ордеров.
Перенос позиции или заем.
Периодическое начисление или списание.
Дни удержания и направление позиции.
Исполнение биржевого контракта.
Отдельная плата.
Тариф биржи, клиринг, регуляторные сборы.
Типичная ошибка - учитывать только комиссию и забывать, что стратегия платит еще и спредом, худшим исполнением, свопами, конвертацией валюты, частичными исполнениями и задержкой передачи приказа. Для частых стратегий каждая мелочь накапливается в существенную величину.
Издержки полезно делить на явные и неявные. Явные расходы легко увидеть в отчете: комиссия брокера, биржевой сбор, клиринг, своп или плата за перенос позиции. Неявные расходы сложнее: сделка открылась на 0,4 пункта хуже, лимитный приказ не исполнился, стоп сработал в момент расширения спреда, а часть позиции закрылась по менее выгодной цене. Если тестер учитывает только явные расходы, результат может выглядеть лучше, чем реальная торговля.
Еще одна ошибка - считать издержки постоянными. В спокойные часы стратегия может работать почти по модели, но во время выхода статистики, открытия сессии, низкой ночной ликвидности или сильного движения расходы резко меняются. Поэтому качественный бэктест должен отражать не только средние условия, но и периоды, где исполнение становится хуже.
Как учитывать комиссию в бэктесте
Комиссия в бэктесте должна вычитаться из результата каждой сделки в соответствии с реальными тарифами брокера, биржи и платформы. Модель комиссии может быть фиксированной суммой за сделку, суммой за контракт, суммой за лот, процентом от оборота, процентом от номинальной стоимости, минимальной комиссией или многоуровневым тарифом в зависимости от объема.
Одна и та же цифра в настройках разных тестеров может означать разные вещи. Комиссия может применяться за вход, за выход, за полный цикл вход-выход, за ордер, за каждое фактическое исполнение, за контракт или за весь объем позиции. Нельзя переносить значение из отчета брокера в тестер, не проверив единицу измерения и момент применения.
Для фьючерсов комиссия часто задается на контракт, а не на всю сделку. Если стратегия торгует пять контрактов, расходы умножаются на пять. Для CFD и валютных инструментов комиссия может задаваться на лот, миллион оборота или процент от номинала. Для акций встречается комиссия за акцию и минимальная сумма за ордер. В криптовалютах тариф может зависеть от того, был приказ maker или taker, то есть добавлял ликвидность или забирал ее из стакана.
Перед запуском серии тестов полезно вручную проверить одну сделку. Откройте отчет, возьмите конкретный вход и выход, рассчитайте комиссию по тарифу брокера и сравните с тем, что списал тестер. Если на одной сделке расчет не совпадает, весь бэктест будет искажен. Такая проверка скучная, но она часто находит ошибки, которые меняют вывод о стратегии.
Проверьте модель тестера
Комиссия может применяться отдельно на входе и выходе. Перед настройкой проверьте модель конкретного тестера.
Комиссия за одну сторону и полный цикл
Комиссия за одну сторону списывается отдельно при открытии и закрытии позиции. Если тариф составляет 1 доллар за контракт за одну сторону, полный цикл будет стоить 2 доллара: 1 доллар на входе и 1 доллар на выходе. Комиссия за полный цикл уже включает вход и выход, поэтому дополнительно удваивать ее не нужно.
Типичная ошибка: реальные условия дают 0,01 комиссии на вход и 0,01 на выход, полный цикл 0,02. Если тестер применяет параметр отдельно на вход и выход, нужно указать 0,01. Если указать 0,02, итоговая комиссия станет 0,04, то есть в два раза больше реальной. Обратная ошибка возникает, когда платформа ожидает комиссию за полный цикл, а пользователь указывает только значение одной стороны.
Минимальная комиссия и частичные исполнения
Некоторые брокеры применяют минимальную сумму за ордер. Если тариф 0,005 доллара за акцию, но минимум 1 доллар, сделка на 100 акций по тарифу стоила бы 0,50 доллара, а фактически будет списан 1 доллар. Для небольших объемов минимальная комиссия резко увеличивает относительные расходы.
Стратегия может входить несколькими ордерами, частично закрывать позицию, добавлять объем, использовать несколько целей прибыли или переворачивать позицию. Логическая сделка стратегии, торговый ордер и фактическое исполнение - разные вещи. Если вход был выполнен двумя ордерами, а выход двумя частями, модель с одной комиссией на всю сделку может занизить расходы.
Особенно внимательно нужно проверять стратегии с масштабированием. Например, робот открывает первую часть позиции, добавляет вторую при подтверждении сигнала, закрывает половину по первой цели и остаток по трейлинг-стопу. С точки зрения торговой идеи это одна сделка, но с точки зрения брокера это несколько исполнений. Если комиссия списывается за каждое исполнение, итоговые расходы выше, чем при простом входе и выходе одним приказом.
Переворот позиции также может быть сложнее, чем кажется. Если стратегия закрывает длинную позицию и сразу открывает короткую, тестер может отразить это как одну операцию изменения направления, а брокер - как закрытие одной сделки и открытие другой. Комиссия, спред и проскальзывание в таком случае должны учитываться для обеих частей процесса.
Как работает спред в тестере стратегий
Спред - это разница между ценой покупки и ценой продажи. Покупка обычно открывается по более высокой цене предложения продавца, а продажа - по более низкой цене предложения покупателя. Поэтому позиция сразу после открытия обычно имеет небольшой отрицательный результат: цене нужно пройти величину спреда, прежде чем сделка выйдет в ноль.
Пример: цена покупки 1,1002, цена продажи 1,1000, спред 0,0002. Покупка открывается по 1,1002, а при немедленном закрытии продажа произойдет около 1,1000. Спред не списывается отдельной строкой, но фактически уменьшает результат через цену исполнения.
Bid, Ask и тестирование по одной цене
Bid - цена, по которой участник может продать. Ask - цена, по которой участник может купить. Если исторические данные содержат только одну цену, например цену продажи или условную среднюю цену, вторую сторону приходится моделировать добавлением спреда. Это создает риск неточного исполнения в тестере.
На графике может казаться, что цена не достигла стоп-лосса, но противоположная сторона котировки могла активировать его. Обратная ситуация возможна с тейк-профитом: уровень визуально был близко, но фактическая сторона цены не дошла до исполнения. Поэтому спред в тестере стратегий должен применяться к правильной стороне котировки, а не просто вычитаться из итоговой прибыли.
Фиксированный и плавающий спред
Фиксированный спред удобен для грубой оценки, но часто делает тест слишком оптимистичным. В реальной торговле спред меняется: расширяется на новостях, ночью, при низкой ликвидности, во время гэпов и резких движений. Стратегия, которая хорошо выглядит при постоянном минимальном спреде, может потерять преимущество при более реалистичной модели.
Плавающий спред лучше отражает реальные торговые условия, если данные действительно содержат историю bid/ask или надежную модель изменения спреда. Его ограничение в том, что не каждая платформа хранит качественные тиковые данные, а плохая история спреда может создать как чрезмерно оптимистичный, так и чрезмерно пессимистичный результат.
Постоянный спред особенно опасен для стратегий, которые входят в периоды низкой ликвидности. Например, ночной советник на валютном рынке может открывать сделки именно тогда, когда средний дневной спред уже не отражает реальность. Если тест использует спред 0,8 пункта, а в момент реальных входов он часто расширяется до 2-4 пунктов, средняя сделка может исчезнуть.
Практический способ проверки - прогнать несколько вариантов спреда: базовый, средний исторический, повышенный и стрессовый. Если стратегия устойчива только при минимальном рекламном спреде, а при умеренном ухудшении становится убыточной, ее нельзя считать готовой к реальному счету без дополнительной фильтрации условий входа.
Что такое проскальзывание торгового робота
Проскальзывание торгового робота - это разница между ожидаемой ценой приказа и фактической ценой исполнения. Оно возникает из-за задержки отправки приказа, изменения цены до исполнения, недостаточной ликвидности, частичного исполнения или движения рынка в момент выхода новости. Проскальзывание отличается от задержки: задержка - причина, проскальзывание - результат в цене.
Рыночный ордер обычно исполняется быстро, но не гарантирует цену. Стоп-ордер после активации часто превращается в рыночный приказ и может исполниться хуже уровня стопа. Лимитный ордер ограничивает цену, но не гарантирует исполнение: если рынок только коснулся уровня на свече, это не означает, что в очереди заявок хватило ликвидности именно для вашего объема.
Проскальзывание может быть положительным и отрицательным, но в стрессовых ситуациях чаще интересует именно отрицательная сторона. Если робот ставит стоп-лосс на уровне 100,00, это не означает, что закрытие всегда произойдет ровно по 100,00. При гэпе, резком импульсе или тонком стакане фактическая цена может быть хуже. Поэтому утверждение «стоп-лосс всегда ограничивает убыток точной суммой» неверно.
Задержка исполнения - отдельный фактор. Сигнал может появиться в терминале, затем приказ отправляется на сервер, проходит обработку, попадает к брокеру или на биржу и исполняется по доступной цене. Даже задержка в доли секунды может быть существенной для скальпинга, но почти незаметной для долгосрочной стратегии. Поэтому модель проскальзывания должна соответствовать частоте торговли и типу ордеров.
Ограничение исторического графика
Касание цены на исторической свече не гарантирует исполнение лимитного ордера.
Исполнение рыночных, стоп- и лимитных ордеров
Рыночный ордер
Исполняется быстро по доступной цене. Риск - цена может быть хуже ожидаемой.
Стоп-ордер
Активируется при достижении уровня и может исполниться с проскальзыванием.
Лимитный ордер
Ограничивает цену, но может не исполниться полностью или вообще.
В тестере важно моделировать разные типы ордеров по-разному. Нулевое проскальзывание для всех сделок редко реалистично. Но и слишком грубое постоянное проскальзывание может исказить результат, если стратегия использует разные инструменты, часы торговли и типы приказов. Лучше проверять несколько сценариев и затем калибровать модель по фактическим сделкам.
Для лимитных ордеров важно различать касание уровня и реальное исполнение. Если свеча показала минимум 100,00, а лимит на покупку стоял по 100,00, это не доказывает, что заявка получила исполнение. Возможно, на этой цене прошел небольшой объем, очередь была впереди, или цена коснулась уровня только в котировке, не достаточной для фактической сделки. Консервативная модель может требовать прохождения цены дальше лимита или учитывать вероятность пропуска.
Для стоп-ордеров обратная проблема: исторический график может показать срабатывание стопа по уровню, но реальное исполнение произойдет хуже. В быстрых движениях стоп защищает от бесконечного удержания позиции, но не гарантирует точную цену выхода. Это особенно важно для стратегий, где один крупный стоп может существенно повлиять на месячный результат.
Свопы и финансирование позиции
Своп, финансирование и плата за перенос позиции важны для стратегий, которые держат сделки дольше одного дня. На валютном и CFD-рынках перенос может приводить к ежедневному начислению или списанию. Для акций может возникать стоимость заимствования при коротких позициях. Для криптовалютных деривативов существенным фактором может стать фандинг.
Типичная ошибка - считать эти расходы незначительными, потому что они малы в одной сделке. Если стратегия держит позиции неделями или месяцами, накопленный эффект может заметно снизить результат. Особенно это важно для систем, которые торгуют инструменты с высоким финансированием или часто удерживают позицию через дату тройного свопа.
В бэктесте нужно проверить, поддерживает ли платформа исторические ставки свопов или использует фиксированное значение. Фиксированная модель может быть достаточной для грубой оценки, но она не отражает периоды изменения ставок, кризисной ликвидности и разных условий у брокеров. Если стратегия чувствительна к удержанию, свопы нужно включать в стресс-тест вместе с комиссией и спредом.
Чем отличаются издержки на разных рынках
На валютном рынке основная нагрузка часто скрыта в спреде, комиссии и свопах. На фьючерсах важны комиссия за контракт, биржевые и клиринговые сборы, стоимость тика и ликвидность конкретного контракта. На фондовом рынке встречаются минимальные комиссии, плата за заимствование акций и частичные исполнения. На криптовалютном рынке нужно учитывать maker/taker комиссии, фандинг, разную глубину стакана и резкие изменения ликвидности.
Нельзя переносить тарифы одного брокера или рынка на все стратегии. Скальпинговый робот на CFD, внутридневная фьючерсная система и дневная стратегия на акциях имеют разные источники издержек. Чем меньше средняя сделка и чем выше частота торговли, тем сильнее влияние комиссии, спреда и проскальзывания.
Фьючерсная стратегия может иметь прозрачную комиссию и биржевые сборы, но столкнуться с ограниченной ликвидностью на дальних контрактах. Валютный робот может не видеть отдельной комиссии, но платить широким плавающим спредом. Акционная стратегия может быть прибыльной на крупных объемах, но терять эффективность при минимальных комиссиях на малых сделках. Криптовалютная система может хорошо работать на одной бирже и резко хуже на другой из-за глубины стакана и фандинга.
Поэтому в отчете важно указывать рынок, инструмент, брокера, тип счета, валюту счета, модель комиссии, источник котировок и режим исполнения. Без этого результат сложно перенести на другой счет. Даже если торговая логика одинакова, инфраструктурные условия могут сделать практический результат другим.
Как средняя сделка связана с издержками
Средняя сделка должна иметь запас относительно полных торговых расходов. Если стратегия в бэктесте зарабатывает в среднем 8 долларов на сделку, а комиссия, спред и реалистичное проскальзывание составляют 6 долларов, запас очень небольшой. Небольшое ухудшение исполнения может превратить положительное математическое ожидание в нулевое или отрицательное.
Пример ручного расчета
Чистый результат = валовая прибыль - комиссия - спред - проскальзывание - свопы
- Валовая прибыль сделки: 40 долларов.
- Комиссия вход + выход: 6 долларов.
- Стоимость спреда: 8 долларов.
- Проскальзывание на входе и выходе: 10 долларов.
- Чистый результат: 40 - 6 - 8 - 10 = 16 долларов.
Запас прочности
Если средняя сделка сопоставима с торговыми издержками, реальное преимущество стратегии может исчезнуть.
Скальпинговые и высокочастотные стратегии особенно чувствительны к этому соотношению. Если робот берет короткие движения и быстро закрывает сделки, одна лишняя десятая пункта спреда или небольшое проскальзывание могут забрать значительную часть преимущества. Для таких систем важно тестировать не только средний результат, но и распределение сделок: сколько сделок остается прибыльными после ухудшения исполнения, как меняется серия убытков и не становится ли стратегия зависимой от идеальных условий.
Для среднесрочных и долгосрочных систем издержки обычно занимают меньшую долю от целевого движения, но полностью игнорировать их нельзя. Комиссия, свопы, финансирование и разница котировок могут накапливаться месяцами. Кроме того, редкие сделки дают меньше статистики, поэтому одна ошибка в модели исполнения может заметно изменить вывод по всей стратегии.
Типичные ошибки настройки тестера
Самая частая ошибка - включить комиссию, но неправильно выбрать единицу измерения. Например, пользователь вводит комиссию за полный цикл в поле, где платформа ожидает комиссию за одну сторону. Или наоборот: указывает значение одной стороны там, где тестер списывает сумму только один раз за вход и выход. В обоих случаях результат может значительно отличаться от реальных условий.
Вторая ошибка - использовать постоянный минимальный спред. Такой тест может быть полезен как оптимистичный ориентир, но его нельзя считать полноценной проверкой. Если стратегия торгует в периоды расширения спреда, фиксированное значение сглаживает именно те моменты, где реальные расходы наиболее болезненны.
Третья ошибка - считать лимитный ордер исполненным при любом касании цены. В реальной торговле есть очередь заявок, доступный объем и скорость движения рынка. Если тестер исполняет все лимиты идеально, он может завысить количество сделок, улучшить среднюю цену и сделать стратегию более стабильной, чем она будет на счете.
Четвертая ошибка - не проверять одну сделку вручную. Даже если настройки кажутся правильными, ручная сверка входа, выхода, комиссии, спреда и чистого результата быстро показывает, как именно платформа применяет расходы. Без такой проверки легко построить десятки отчетов на неверной базовой модели.
Стресс-тест комиссии, спреда и проскальзывания
Стратегия должна проверяться не только на базовых условиях, но и на умеренно ухудшенных сценариях. Это не попытка угадать точное будущее, а способ понять, есть ли у торговой логики запас прочности. Если небольшое увеличение спреда или проскальзывания полностью уничтожает прибыль, такую стратегию сложно надежно реализовать на реальном счете.
Текущий тариф
Средний исторический
Минимальное реалистичное
С учетом сборов
Плавающий
По типам ордеров
Выше базового
Расширенный
Хуже в быстрых рынках
Стресс-тест полезно сочетать с Монте-Карло для торговых стратегий: случайно менять порядок сделок, ухудшать отдельные исполнения, увеличивать спред в части сделок и смотреть, как меняются просадка, средняя сделка и итоговая доходность.
Не стоит делать стресс-тест заведомо абсурдным. Если издержки увеличены настолько, что ни одна реалистичная стратегия не может пройти проверку, тест перестает помогать. Его задача - оценить правдоподобное ухудшение: расширение спреда в активные часы, несколько тиков проскальзывания, частичный пропуск лимитных ордеров, рост комиссии или менее выгодный своп.
Хороший признак - стратегия сохраняет положительное ожидание в реалистичном сценарии и не разрушается мгновенно в умеренном стрессовом. Плохой признак - прибыль полностью зависит от нулевого проскальзывания, минимального спреда и идеального исполнения всех лимитных заявок. Такой результат может быть технически красивым, но практически хрупким.
Как сравнить бэктест с реальной торговлей
Даже качественный бэктест не должен полностью совпадать с реальной торговлей. Разница может возникать из-за котировок, очереди заявок, задержек, проскальзывания, частичного исполнения, различий между сервером брокера и тестовой историей. Задача не в идеальном совпадении, а в том, чтобы отклонения были понятны и не разрушали преимущество стратегии.
Сравнивайте модельные и реальные сделки по времени сигнала, цене входа, цене выхода, комиссии, спреду, проскальзыванию, типу ордера и причине закрытия. Если реальные сделки систематически хуже модели, бэктест нужно калибровать. Если часть лимитных входов в реальности не исполняется, нельзя считать тест, где все касания уровня дают сделку, достаточно консервативным.
Для калибровки полезно вести журнал исполнения. В нем фиксируются ожидаемая цена, фактическая цена, задержка, спред в момент входа, тип ордера, объем, частичное исполнение и причина отклонения. Через несколько десятков или сотен сделок можно оценить среднее проскальзывание, худшие случаи, долю пропущенных лимитных ордеров и фактическую комиссию.
После этого модель тестера нужно обновить. Если реальная средняя цена входа хуже на 0,6 пункта, а тест учитывает только 0,1, исторический результат слишком оптимистичен. Если лимитные заявки исполняются только в 70% случаев, тест с исполнением каждого касания уровня завышает количество сделок и может искажать всю статистику.
Эту проверку важно проводить вместе с анализом показателей торгового робота, максимальной просадки, переоптимизации и проверки вне выборки.
Как снизить влияние торговых издержек
Снизить влияние расходов можно несколькими способами: убрать слабые сигналы, повысить минимальное ожидаемое движение, избегать торговли при расширенном спреде, добавить фильтр ликвидности, не входить непосредственно перед новостями, выбирать более ликвидные часы, контролировать размер приказа и подобрать брокера с подходящей тарифной моделью.
Лимитный ордер не всегда лучше рыночного. Он уменьшает риск плохой цены, но увеличивает риск отсутствия исполнения. Рыночный ордер повышает вероятность входа, но может дать худшую цену. Выбор типа приказа должен соответствовать стратегии, ликвидности и допустимому риску пропуска сделки.
Как правильно настроить торговые издержки
- Определить все расходы. Не ограничиваться рекламным значением спреда или комиссии.
- Проверить единицы комиссии. Сторона, полный цикл, лот, контракт, ордер или исполнение.
- Настроить реалистичный спред. По возможности использовать исторические bid/ask данные.
- Добавить модель проскальзывания. Разделить рыночные, стоп- и лимитные ордера.
- Учесть свопы и финансирование. Особенно для долгосрочных позиций.
- Проверить одну сделку вручную. Убедиться, что тестер списывает расходы правильно.
- Сравнить сценарии. Базовый, реалистичный и стрессовый.
- Запустить форвард-тест. Собрать фактическую статистику исполнения.
- Откалибровать модель. Настроить тест по реальным сделкам, а не по надежде.
Итоговый проверочный список
- Учтена ли комиссия в бэктесте.
- Понятно ли, это одна сторона или полный цикл.
- Учтены ли минимальные комиссии и биржевые сборы.
- Учтены ли частичные входы и выходы.
- Используется ли реалистичный спред.
- Проверено ли расширение спреда.
- Используется ли правильная сторона котировки.
- Смоделировано ли проскальзывание.
- Различаются ли модели типов ордеров.
- Не считается ли лимитный ордер исполненным при любом касании.
- Учтены ли свопы и финансирование.
- Проверена ли стоимость пункта или тика.
- Превышает ли средняя сделка полные издержки.
- Проводился ли стресс-тест.
- Сравнивались ли тестовые и реальные исполнения.
Материалы по теме
Вывод
Комиссия, спред и проскальзывание уменьшают математическое ожидание стратегии. Неправильная настройка комиссии способна как занизить, так и завысить расходы, а постоянный минимальный спред часто делает тест слишком оптимистичным. Рыночные и стоп-ордера могут исполниться хуже ожидаемой цены, а лимитный ордер ограничивает цену, но не гарантирует сделку.
Скальпинговые и высокочастотные стратегии особенно чувствительны к издержкам, потому что их средняя сделка часто мала. Устойчивый робот должен выдерживать умеренное ухудшение торговых условий, а модель бэктеста необходимо калибровать по фактическим сделкам на демо или реальном минимальном объеме.
Профессиональная разработка торгового робота включает не только поиск прибыльной логики, но и проверку ее реализуемости после всех реальных торговых расходов. Качественный бэктест должен быть консервативным, реалистичным и достаточно строгим, чтобы слабая стратегия не выглядела сильной только из-за нулевых издержек.