Бэктест без самообмана
Пошаговый путь: от того, что на самом деле оптимизирует ваш бэктест, до доказательства, что преимущество переживет переобучение, множественное тестирование и реальное исполнение. Читайте сверху вниз - каждая часть опирается на предыдущую.
Дизайн целевой функции: метрика, которую вы оптимизируете, тайно выбирает вашу стратегию
Чтобы искать "лучшую" стратегию, нужно сначала определить "лучшее" - и этот скаляр тайно выбирает победителя. На синтетических данных с известным edge (600 seeds, T=2000, 80 порогов) наивный per-trade Sharpe коронует лотерею: он выбирает победителя с exposure ниже 5% в 56% seeds и вырождается в 57% случаев - на самом ярком seed 8 сделок дают in-sample Sharpe 21.09, который схлопывается до 0.13 out of sample. Честное исправление почти скучно: измерять на полном таймлайне, который никогда не вырождается (out-of-sample 1.71). Trade-count shrinkage (conf_k) и exposure floor способны доработать per-trade метрику, но даже полностью исправленные они лишь сравниваются с full-timeline Sharpe (1.70 против 1.71) - никогда не превосходят его. Закон Гудхарта в бэктесте, с контролируемой истиной.
Доказываем отсутствие look-ahead в мультитаймфреймовых бэктестах: возмущаем будущее, доказываем, что прошлое его не видит
Мультитаймфреймовые бэктесты пропускают будущее через формирующийся бар старшего таймфрейма, чей финальный close еще не существует. Уверенность нельзя получить одним лишь ревью кода - это надо тестировать. Мы воспроизводим правило closed-bar живого бота один в один, а затем доказываем отсутствие утечки с помощью пробы со сдвинутым будущим: возмущаем каждый будущий бар и проверяем, что каждый прошлый сигнал и сделка побитово не изменились. 25 из 25 проверок паритета, и проба не беззубая.
Look-Ahead Bias: как ошибка в один бар фабрикует Sharpe 15 из чистого шума
Контролируемое исследование скрытых look-ahead утечек, которые незаметно раздувают бэктесты. При полном отсутствии реального edge исполнение на баре сигнала фабрикует годовой Sharpe +14.8 из чистого шума; подглядывание индикатора на один бар вперед - +4.8. Таксономия, измеренные величины и как обнаружить каждую утечку до того, как она обойдется вам в деньги.
Walk-Forward Optimization: единственный честный тест стратегии
Почему single train/test split не защищает от overfitting, как walk-forward optimization системно проверяет робастность параметров, и почему стратегия с +3342% PnL@ML на 21 параметре - бомба замедленного действия без WFO.
Plateau analysis: как отличить робастный оптимум от overfitting
Почему найти лучшие параметры стратегии - только половина работы. Как визуально и количественно отличить устойчивое плато от хрупкого пика, и почему Optuna contour plots - обязательный шаг перед запуском оптимизированной стратегии в продакшен.
Multi-symbol валидация: проверяйте стратегию на всех парах
Почему стратегия, оптимизированная на ETHUSDT, может провалиться на альткоинах. Как правильно тестировать по группам пар (blue chips, large caps, шиткоины) и какой cross-symbol robustness score считать достаточным.
Monte Carlo Bootstrap: как получить confidence intervals для бэктеста за 10 строк кода
Почему single-point estimate из бэктеста - опасная иллюзия. Как Monte Carlo bootstrap за 2 секунды вычислений даёт 95% confidence interval для PnL и MaxDD, и почему это обязательный шаг перед запуском стратегии в продакшен.
Probability of Backtest Overfitting: обыграл ли ваш поиск подбрасывание монеты?
Deflated Sharpe Ratio оценивает победившую стратегию; PBO оценивает сам поиск, который ее выбрал. Combinatorially Symmetric Cross-Validation прогоняет C(16,8) = 12,870 train/test-разбиений по матрице результатов 1000x200 и спрашивает: попадает ли in-sample победитель в нижнюю половину out of sample? Ловушка, которую почти все упускают, - ноль PBO равен 0.5, а не 1. На 200 стратегиях с нулевым edge лучший in-sample годовой Sharpe 1.98 схлопывается до 0.06 out of sample, а PBO = 0.476: подбрасывание монеты, полный оверфит. Заложите реальный edge (годовой Sharpe 2.38) - и PBO падает до 0.001, а in-sample 3.73 сохраняется до out-of-sample 2.34. У сетки moving average на чистом случайном блуждании тоже нет out-of-sample мастерства - PBO 0.463 в среднем по 60 матрицам, статистически неотличимо от нуля, - а на одной представительной матрице мираж особенно нагляден: лучший in-sample Sharpe 2.33 схлопывается до медианного out-of-sample -0.22, PBO 0.573, 63% шанс убытка.
Deflated Sharpe Ratio: сколько "победителей" бэктеста переживают множественное тестирование?
Поиск параметров - это машина по производству удачи. На чистом шуме - 1,000 стратегий с нулевым истинным edge - лучший годовой Sharpe в среднем составляет 1.63, а наивный тест значимости фиксирует открытие в 100% случаев. Мы строим контролируемую истину и показываем, что Deflated Sharpe Ratio, haircut Harvey-Liu и Reality Check Уайта восстанавливают честность: доля ложных открытий падает с 1.000 до 0.001-0.057, настоящие edge выше потолка шума сохраняются с power ~1 - и одна реальная ловушка (коррелированные сетки), где сырой DSR передефлирует, а вердикт нужно читать по всей полосе оценок эффективного числа испытаний, а не по одной цифре.
Backtest-live parity: почему ваш бот торгует не так, как бэктест
Полная таксономия расхождений между бэктестом и live-торговлей: от slippage и partial fills до рассинхронизации кодовых баз. Архитектурные паттерны для достижения parity, Python-примеры shared core модуля и чек-лист мониторинга в продакшене.
Честный негативный результат: десятки тысяч бэктестов, пять мажоров, никакого робастного edge
Финал арки про поиск и оверфиттинг - и он заканчивается негативным результатом, то есть правильным. Односимвольный поиск на ETHUSDT с двумя таймфреймами нашел конфигурацию на +16.35% out-of-sample и +2.62% на нетронутом holdout; Deflated Sharpe Ratio, учитывающий ~37,000 испытаний, дефлировал ее до 0.00. Кросс-инструментальный проход по пяти мажорам (ETH/BTC/SOL/BNB/XRP, ~1.18M минутных баров каждый) с отбором по медиане out-of-sample добивает окончательно: двойной таймфрейм DSR 0.24 / PBO 0.264, тройной DSR 0.14 / PBO 0.327 - оба не проходят гейты. Чемпион прибылен на 1 из 5 символов и убыточен на остальных. Именно для этого анти-оверфит аппарат и существует: чтобы не дать вам отгрузить лучший из шума как альфу.
Cascade-стратегии: приоритетное исполнение с fallback-заполнением
Финал серии «Бэктесты без иллюзий». Как построить оркестратор из N стратегий × M пар, реализовать каскадный режим с приоритетным и fallback-заполнением, выбрать dual_size, и почему портфель стратегий нельзя бэктестить суммированием PnL.