Вы только что повторно запустили бэктест своей стратегии на бессрочном контракте BTC, и чистый Sharpe упал на треть. Сигналы те же. Исполнения те же. Вы изменили только одно: теперь тариф комиссии зависит от объёма торгов по счёту за последние 30 дней, а тест начинается с уровня ниже того, которого счёт достиг в реальной торговле.
Прежде чем переписывать сигнал, разделите два вопроса: сколько эта стратегия заплатила бы при фиксированной комиссии и какую комиссию этот счёт фактически платил бы в каждый момент времени? Это разные эксперименты. Если смешать их, стратегия может выглядеть лучше лишь потому, что торгует достаточно активно для получения скидки, а затем эту скидку учитывают так, будто она досталась бесплатно.
Начните с тарифной сетки, а не с одной ставки
На страницах большинства бирж с тарифами есть таблица ставок maker и taker для разных уровней объёма, иногда с отдельными правилами для спотового рынка и деривативов. В бэктесте нужны фактическая тарифная сетка и правило, по которому определяется уровень. Объём учитывается за 30 дней? За календарный месяц? Биржа суммирует объём спотовой и фьючерсной торговли? Скидка за баланс токенов суммируется со скидкой за объём?
Зафиксируйте эти правила как входные данные с датами. Для упрощённого примера предположим, что площадка назначает ставку на следующий день по объёму исполненных фьючерсных сделок за предыдущие 30 дней:
| Объём за последние 30 дней | Комиссия maker | Комиссия taker |
|---|---|---|
| Менее $1 миллиона | 0.020% | 0.050% |
| От $1 миллиона до $10 миллионов | 0.016% | 0.040% |
| Более $10 миллионов | 0.012% | 0.035% |
Цифры приведены для примера: тарифы бирж и правила доступа к ним меняются. Важно учитывать время применения ставок: вчерашние исполнения могут повлиять на комиссию завтра, но сегодняшние сделки не могут задним числом дать скидку на сегодняшние исполнения.
Для бэктеста нужна история объёма счёта
Предположим, стратегия ежедневно совершает сделки на $80,000, все по taker. На начальном уровне комиссия за сделку в обе стороны с номиналом $100,000 составит около $50: общий номинал входа и выхода — $100,000, умноженный на 0.050%. На среднем уровне это $40. Разница в $10 кажется небольшой, пока вы не повторите такую сделку 800 раз. Тогда за период тестирования набежит $8,000, а уровень комиссии мог измениться благодаря объёму, который создали те же самые сделки.
Такая обратная связь существует, но из-за неё легко допустить ошибку в модели. Если задать средний уровень комиссии с самого начала, потому что к концу бэктеста счёт его достиг, вы перенесёте будущую активность счёта в прошлое. Укажите начальный объём за предыдущий период, обновляйте скользящее окно после каждого подходящего исполнения и применяйте смену уровня только с момента, установленного правилами площадки.
Разделяйте три показателя: номинал сделок стратегии, объём счёта, учитываемый при расчёте уровня комиссии, и комиссию, фактически списанную за каждое исполнение. Они могут различаться, если площадка исключает отдельные продукты, учитывает только одну сторону некоторых сделок или предоставляет скидку за баланс, который вы не включили в модель.
Сравните тест с фиксированной ставкой и тест с учётом счёта
Нужны два результата. Сначала запустите бэктест всей стратегии с одной консервативной фиксированной ставкой taker. Так вы увидите, насколько идея чувствительна к издержкам исполнения, не позволяя её собственному обороту менять условия сравнения. Затем смоделируйте тарифную сетку с учётом состояния счёта, указав начальный баланс и историю объёма. Это позволит оценить, как мог развиваться именно этот счёт при заданных правилах.
Затем сравните сумму комиссий, оборот, чистый P&L и просадку. Если результат улучшается только в тесте с учётом счёта, выясните, какая часть улучшения объясняется правдоподобным переходом на другой уровень, а какая зависит от начальной истории, объёма по другим продуктам или скидки, на которую ваш счёт может не иметь права. Если преимущество исчезает в обоих тестах, дело, вероятно, не в уровне комиссии.
И не назначайте исполнениям maker самую низкую ставку, если ваша модель исполнения незаметно исходит из того, что каждый пассивный ордер был исполнен. Тарифы можно смоделировать точно, но допущения об исполнении при этом могут оставаться фантазией. Проверяйте эти вещи отдельно.
Обеспечьте воспроизводимость результата
Сохраните вместе с бэктестом версию тарифной сетки, период расчёта объёма, время пересчёта, учитываемые продукты и начальный объём. Добавьте небольшой ежедневный журнал: объём в начале дня за предыдущий период, добавленные исполнения, применённый уровень и списанные комиссии. Когда биржа изменит ставки и результат поменяется, вы поймёте, изменились ли стратегия, траектория счёта или допущения.
Вы пытаетесь ответить на конкретный полезный вопрос: сколько эта стратегия заплатила бы при тарифах и истории счёта, которые можно точно описать? Если вы не можете восстановить уровень комиссии за конкретный день, значит, вы пока не знаете, что означает чистый результат бэктеста.
← Все статьи


