Честный негативный результат: десятки тысяч бэктестов, пять мажоров, никакого робастного edge
Статья из серии "Бэктесты без иллюзий".
Результат, которого мы не хотели
Эта серия несколько статей подряд строила инструменты для поимки лжи: look-ahead bias, который фабрикует Sharpe 15 из утечки в один бар, Deflated Sharpe Ratio, который оценивает победителя поиска, Probability of Backtest Overfitting, который оценивает сам поиск. Каждая из тех статей была, в некотором смысле, репетицией. Эта — само выступление: мы наводим весь аппарат на реальное семейство стратегий, которое действительно хотели торговать, и позволяем ему вынести вердикт, ради которого он строился, — даже когда этот вердикт нет.
Вот честная концовка сразу. Мы прогнали десятки тысяч бэктестов по пяти мажорным монетам, в конфигурациях с двумя и тремя таймфреймами, в поисках робастного edge. Мы его не нашли. Не в смысле "мы нашли маленький edge и урезали позицию". Мы не нашли ничего, что переживает контакт с машинерией — ни одной конфигурации, которая одновременно прибыльна на разных инструментах и защитима под поправкой на множественное тестирование. Это не провал эксперимента. Это эксперимент, который сработал.
Соблазнительная часть — та, что заставила бы хуже оснащенную команду выделить капитал, — в том, что наивное прочтение выглядело по-настоящему хорошо:
| Этап | Что мы увидели | Чем это было |
|---|---|---|
| Односимвольный поиск (ETHUSDT, dual-TF) | +16.35% на out-of-sample тесте, +2.62% на нетронутом holdout | соблазнительный победитель |
| Deflated Sharpe, ~37,000 испытаний | DSR = 0.00 | лучший-из-шума |
| Кросс-инструментально, 5 мажоров, dual-TF | DSR 0.24 / PBO 0.264 | провал |
| Кросс-инструментально, 5 мажоров, triple-TF | DSR 0.14 / PBO 0.327 | провал |
Прочитайте верхнюю строку так, как мы прочитали ее в первый раз: стратегия moving-average crossover, настроенная на ETHUSDT по сетке из двух таймфреймов, печатает +16.35% на данных, которые она ни разу не видела во время поиска, и удерживает положительные +2.62% на втором окне, которое мы отгородили стеной целиком. Если остановиться здесь — а большинство опубликованных бэктестов здесь и останавливаются, — вы отгружаете ее в прод. Остальная часть статьи — машинерия, которая сказала нам этого не делать, и объяснение, почему она была права.
Акт 1 — Соблазнительный победитель

Семейство стратегий намеренно заурядное: пересечение скользящих средних Халла, вычисляемое на закрытых барах, с честной моделью исполнения (решение на закрытии бара i, исполнение на открытии i+1 — та самая дисциплина одного бара, в которой эта серия не идет на компромиссы). "Двойной таймфрейм" означает, что сигнал фильтруется трендом более медленного таймфрейма; "тройной" добавляет третий, еще более медленный. Каждый таймфрейм добавляет свободные параметры, а свободные параметры — это ровно то, что поиск конвертирует в кажущуюся результативность.
Односимвольное исследование шло на ETHUSDT. Протокол уже был правильного сорта: скользящее walk-forward разбиение (окно прогрева, несколько in-sample фолдов, out-of-sample окно test), плюс финальное окно holdout, к которому поиску было запрещено прикасаться до самого конца. Пространство параметров исследовал Sobol/QMC-поиск; выжившим стала конфигурация с лучшим walk-forward скором, и ее вынесли на holdout один раз — ровно один.
Выживший выглядел как edge:
- +16.35% на out-of-sample окне test — данных, которые использовались только чтобы оценивать конфигурации, но никогда — чтобы их подгонять.
- +2.62% на нетронутом holdout — вторая стена, взятая.
Это момент, который решает, честный у вас исследовательский процесс или театральный. Out-of-sample прибыль реальна в узком смысле: числа не сфабрикованы и утечки look-ahead нет — мы проверили. Но "реальные числа, нет утечки" — куда более низкая планка, чем "реальный edge". Между ними сидит то, о чем вся эта серия: отбор. Мы не оценили одну стратегию и не обнаружили, что она делает 16%. Мы оценили огромное число стратегий и доложили 16% лучшей из них. Out-of-sample окно было чистым от look-ahead, но оно не было чистым от отбора — потому что мы выбирали победителя отчасти по тому, как он там себя показал. Единственный инструмент, способный различить эти две истории, — тот, который знает, сколько раз мы смотрели.
Акт 2 — Дефляция: ~37,000 испытаний, DSR = 0.00

Посчитаем взгляды. По фолдам, комбинациям таймфреймов и сетке параметров двухтаймфреймовый поиск оценил порядка 37,000 различных конфигураций. Каждая из них — вытянутый билет из пространства стратегий, и поиск оставил себе максимум. Полный вывод есть в статье про Deflated Sharpe Ratio, но здесь нужен один факт — False Strategy Theorem (теорема о ложной стратегии, Bailey & López de Prado): ожидаемый максимальный Sharpe среди N стратегий с нулевым истинным edge растет с N. При N ≈ 30,000 лучший из чистого шума сидит примерно на четыре стандартных отклонения выше нуля чисто за счет отбора. Четыре сигмы выглядят как открытие. Это тень поиска.
Так что правильный вопрос — не "положителен ли Sharpe победителя?" — конечно положителен, вы же выбрали максимум. Правильный вопрос: "выше ли Sharpe победителя того, что напечатал бы самый везучий из 37,000 подбрасывателей монеты?" Ровно это и вычисляет DSR: он поднимает планку сравнения с нуля до потолка шума, заданного числом испытаний, и сообщает вероятность, что истинный Sharpe берет эту планку.
Out-of-sample трек победителя на ETHUSDT соответствует дневному Sharpe около 0.19. Сам по себе дневной SR 0.19 на длинном окне — вполне приличное число. Дефлированный против ~37,000 испытаний, он испаряется:
Ноль. Не "на грани", не "0.4, присматривайте". DSR говорит: с учетом того, как усердно мы искали, дневной Sharpe 0.19 неотличим от лучшего билета чистого шума. И +16.35% out-of-sample, и +2.62% на holdout совместимы — с той точностью, которую этот тест способен разрешить, — со стратегией, у которой вообще нет edge и которая просто выиграла лотерею с 37,000 билетов.
Тонкость, которую стоит проговорить, потому что мы не хотим преувеличить дефляцию: соседние точки на сетке параметров — почти дубликаты, так что сырое число испытаний завышает количество независимых взглядов. Наш гейт использует эффективное число испытаний — испытания кластеризуются по корреляции доходностей через ONC (López de Prado & Lewis) перед дефляцией — именно чтобы не отвергнуть реальный edge по бухгалтерской причине. Даже с этой поправкой победитель на ETHUSDT не выживает. Когда результат читается как DSR 0.00, нюанс эффективного N его не спасет: он глубоко внутри шума.
На этом можно было бы закончить. Один символ, один поиск, дефлировано в ноль. Но провал DSR на одном символе оставляет лазейку, в которую решительный оптимизатор всегда попробует протиснуться: может, ETHUSDT просто трудный символ, а конфигурация реальна где-то еще. Чтобы закрыть эту лазейку, надо сменить ось теста.
Акт 3 — Решающий тест: робастность живет на оси инструментов

У односимвольного поиска есть структурная слабость, даже когда все остальное в нем идеально: его единственная out-of-sample ось — время. Он может сказать, что конфигурация удержалась на более позднем окне ETHUSDT, но не может сказать, выучила ли конфигурация что-то о рынках или что-то о конкретно ETHUSDT. Оверфиттинг под один инструмент невидим для теста, который никогда этот инструмент не покидает.
Поэтому мы сменили целевую функцию. Вместо "лучший на ETHUSDT out-of-sample" кросс-инструментальная охота ищет универсалов: конфигурации, которые хороши одновременно на многих символах. Протокол:
- Пять ликвидных мажоров: ETHUSDT, BTCUSDT, SOLUSDT, BNBUSDT, XRPUSDT — примерно по 1.18 миллиона 1-минутных баров каждый, одно общее календарное окно, один общий набор разбиений (прогрев → K in-sample фолдов → test → нетронутый holdout).
- Робастная целевая функция: каждая конфигурация оценивается по walk-forward результату на каждом символе, а ранжирование идет по медиане по символам. Медиана — в этом весь смысл: конфигурация, которая блистательна на одной монете и ужасна на четырех, не может купить себе место одним выбросом. Чтобы быть отобранной, она должна быть хотя бы середняком на большинстве из них.
- Матрица портфельных доходностей для гейтов: дневные доходности каждого испытания — это равновзвешенный портфель по пяти символам (по 1/S капитала на каждый), что дает матрицу результативности T×N, которую потребляют гейты DSR и PBO-CSCV.
- Holdout трогается один раз — только робастным чемпионом каждого режима.
Это строго более трудный тест, чем односимвольный, и это сделано намеренно. Конфигурация может выиграть поиск на ETHUSDT, эксплуатируя идиосинкразию одной монеты; выиграть поиск по медиане из пяти таким способом она не может. Если в этом семействе стратегий существует робастный edge, эта постановка его найдет. Если не существует — эта постановка скажет об этом не дрогнув.
Акт 4 — Вердикт: оба режима проваливают гейты
Мы прогнали кросс-инструментальную охоту в обеих конфигурациях и провели каждого робастного чемпиона через гейты. Гейты — стандартная пара: DSR ≥ 0.95 (дефлированный против эффективного числа испытаний) и PBO ≤ 0.2 (из CSCV по матрице результативности). Вот весь вердикт, честно:
| Режим | DSR (эффективный N) | PBO (CSCV) | Гейт: DSR ≥ 0.95 | Гейт: PBO ≤ 0.2 | Вердикт |
|---|---|---|---|---|---|
| Двойной таймфрейм | 0.24 | 0.264 | провал | провал | нет робастного edge |
| Тройной таймфрейм | 0.14 | 0.327 | провал | провал | нет робастного edge |
Провал по обоим: оба гейта, оба режима. Читайте каждое число с калибровкой, которую установили предыдущие статьи, потому что два гейта говорят разные вещи — и сходятся в одном:
-
DSR 0.24 (двойной), 0.14 (тройной). DSR — это вероятность того, что истинный Sharpe превышает потолок шума, заданный поиском. Нам нужно 0.95. Мы получили 0.24 и 0.14 — едва ли один шанс из четырех и один из семи, что edge хотя бы положителен, если учесть, сколько конфигураций было перепробовано. Добавление третьего таймфрейма сделало хуже, а не лучше: больше параметров, больше способов подогнаться под выборку, меньше того, что обобщается. Эта инверсия — сама по себе отпечаток оверфиттинга.
-
PBO 0.264 (двойной), 0.327 (тройной). Вспомните факт, который все неправильно читают про PBO (полный разбор здесь): его ноль равен 0.5, а не 1. PBO — это вероятность того, что in-sample победитель окажется в нижней половине out of sample. Заслуживающий доверия отбор сидит около 0; чистое подбрасывание монеты — на 0.5. Наши 0.264 и 0.327 ниже 0.5 — отбор не буквально подбрасывание монеты, слабый шепот сигнала там есть, — но оба заметно выше 0.2, которые мы требуем, чтобы назвать отбор надежным. И снова тройной (0.327) ближе к линии подбрасывания монеты, чем двойной (0.264): больше сложности — меньше обобщения.
Эти два инструмента ортогональны — DSR параметричен и оценивает победителя, PBO непараметричен и оценивает процедуру — и они сходятся к одному ответу с противоположных сторон. Нет такого прочтения этой таблицы, при котором хоть одна из стратегий берет планку. У +16.35%, с которых началась вся эта охота, нет робастного кросс-инструментального родственника. Это было свойство одной монеты и одного поиска.
Акт 5 — Проследите за чемпионом, символ за символом
Агрегатные гейты говорят, что стратегия провалилась; по-символьная разбивка говорит, как — и это "как" — самая поучительная часть всего исследования. Возьмем чемпиона тройного таймфрейма — конфигурацию, которую реально короновала целевая функция медианы по пяти, — и посмотрим, что он сделал на out-of-sample окне test каждого символа:
| Символ | Тройной чемпион, OOS test |
|---|---|
| ETHUSDT | −0.39% |
| BTCUSDT | −0.38% |
| SOLUSDT | +14.74% |
| BNBUSDT | −8.58% |
| XRPUSDT | −4.13% |
Вот вся иллюзия, разложенная в пяти строках. Чемпион прибылен на ровно одном из пяти символов — SOLUSDT, с кричащими +14.74% — и убыточен на остальных четырех. Это не универсал, который местами слабоват. Это SOL-специалист в портфельной одежде. Один большой плюс делает всю работу; медианная целевая функция опустила его ниже сырого победителя на ETHUSDT ровно потому, что медиану нельзя обмануть одним выбросом, — но даже отобранный по медиане чемпион, если его распаковать, почти целиком опирается на одну монету.
Holdout — окно, против которого никому не разрешалось оптимизировать, — рассказывает ту же историю с самой чистой из возможных точек обзора: по пяти мажорам доходность чемпиона на holdout положительна только на 1 из 5 символов. Будь это реальный edge семейства стратегий, он проявился бы, хотя бы слабо, на нетронутых данных больше чем одного инструмента. Он проявляется на одном. Это подпись конфигурации, которая выучила символ, а не рынок.
Вот почему кросс-инструментальная ось была решающим тестом, а не просто приятным дополнением. Односимвольный DSR уже дефлировал ETHUSDT в ноль. Но потребовался дизайн с медианой по пяти, чтобы диагностировать провал — показать, что кажущийся edge с самого начала не был распределен по инструментам, что он был свойством той монеты, под которую поиску случилось переобучиться в конкретном прогоне. На ETHUSDT это была ETHUSDT; на медианной охоте он мигрировал на SOLUSDT. Edge переехал. Реальные edge так не переезжают.
Почему негативный результат — правильный результат

Стоит явно проговорить, что мы утверждаем, а что нет, потому что "мы не нашли edge" легко прочитать либо как ложную скромность, либо как признание некомпетентности. Это ни то, ни другое.
Мы не утверждаем, что пересечения HMA не могут работать никогда, что эти пять монет непредсказуемы или что не существует ни одной стратегии на двух или трех таймфреймах. Мы утверждаем нечто более узкое и куда более сильное: внутри этого семейства стратегий, на этих данных, при этой интенсивности поиска нет конфигурации, чья кажущаяся результативность переживает поправку на число перепробованных вариантов. Все, что выглядело как edge, лежит внутри доверительной полосы лучшего из шума. Это точное, фальсифицируемое, защитимое утверждение — и именно его правильно публиковать.
Искушение, которое побеждает эта машинерия, огромно, и в любой другой области у него есть имя: проблема ящика стола (file-drawer problem). Негативные результаты хоронят; позитивные — оформляют в публикации. В трейдинге стимул еще острее, потому что позитивный результат, который вы не дефлировали, — это не просто плохая статья: это капитал, размещенный против шума, реальные деньги, платящие реальные комиссии за торговлю лотерейным билетом, который вы приняли за сигнал. Статья про look-ahead показала, как утечка фабрикует Sharpe 15; статья про DSR показала, как поиск фабрикует Sharpe 1.63 из чистого шума вообще без утечки. Эта статья — то, как выглядит момент, когда эти инструменты наведены на вашу собственную любимую идею с требованием быть честными. Аппарат — DSR, PBO/CSCV, кластеризация эффективного N, кросс-инструментальный отбор — существует не для того, чтобы благословлять ваши стратегии. Он существует, чтобы не дать вам отгрузить лучший из шума как альфу, и единственное доказательство его работы — то, что иногда он говорит нет.
Команда без этого аппарата отгрузила бы +16.35%. У них был бы чисто выглядящий walk-forward, положительный holdout, никакой обнаружимой look-ahead утечки и правдоподобная история. Они были бы неправы — и не узнали бы об этом, пока живой P&L не разошелся бы с бэктестом: тот самый разрыв между бэктестом и лайвом, который негативному, но честному результату никогда не приходится объяснять, потому что он никогда не выходил в лайв. Ценность строгого нет измеряется просадками, которых вы не взяли.
Происхождение чисел
Каждое число в этой статье прослеживается до кода, а не до нарратива. Кросс-инструментальная охота за edge — загрузка пяти символов, общие разбиения, целевая функция медианы по символам, равновзвешенная портфельная матрица, подаваемая в гейты, — живет в scripts/edge_hunt_multitf.py (коммит acd84e8) в репозитории бэктестера. Статистические гейты, которые она вызывает, — вероятностный и дефлированный Sharpe, минимальная длина трек-рекорда, эффективный N через кластеризацию ONC и PBO через CSCV, все реализовано с нуля на NumPy/SciPy по первоисточникам, а не через библиотеку-черный ящик, — находятся в scripts/overfit_gates.py (коммит 7b966e1), который поставляется с самотестом: тот закладывает известный edge в чистый шум и подтверждает, что гейты пропускают edge и отвергают шум. Односимвольное исследование ETHUSDT, породившее соблазнительные +16.35%, пришло из более раннего харнесса bench_search_multitf, который охота импортирует только на чтение. Здесь нет ни одной цифры, посчитанной руками; гейты — один и тот же путь в коде независимо от того, "да" ответ или "нет".
Выводы
- Мы прогнали десятки тысяч бэктестов по пяти мажорам, с двумя и тремя таймфреймами, и не нашли робастного edge — и это тот результат, ради которого машинерия и строилась. Строго установленный негативный результат — это находка, а не провал.
- Чисто выглядящее out-of-sample число — это не edge. Победитель на ETHUSDT напечатал +16.35% out-of-sample и +2.62% на нетронутом holdout, без всякой look-ahead утечки — и дефлировался до DSR 0.00, стоило посчитать стоящие за ним ~37,000 испытаний. Out-of-sample снимает look-ahead; отбор снимает только дефляция.
- Причина — False Strategy Theorem. При ~30,000 испытаний лучший из чистого шума сидит примерно на четыре сигмы выше нуля за счет одного лишь отбора. Дневной Sharpe 0.19 — ровно столько платит эта лотерея. Сравнивать победителя надо с потолком шума и никогда — с нулем.
- Робастность живет на оси инструментов, а не только на оси времени. Отбор по медиане по пяти символам превратил иллюзию одной монеты в диагностируемую: двойной DSR 0.24 / PBO 0.264, тройной DSR 0.14 / PBO 0.327 — оба проваливают оба гейта, и тройной (больше параметров) хуже двойного по каждой метрике.
- Распакуйте чемпиона, прежде чем ему доверять. "Портфельный" чемпион тройного таймфрейма был прибылен на 1 из 5 символов (SOL +14.74%; ETH −0.39%, BTC −0.38%, BNB −8.58%, XRP −4.13%) и положителен на holdout только на 1 из 5. Edge, который живет на одном инструменте и переезжает при повторном поиске, — не edge, а оверфит в портфельной одежде.
- Публикуйте негативный результат. Анти-оверфит аппарат — DSR, PBO/CSCV, эффективный N, кросс-инструментальный отбор — ценен именно тем, что иногда говорит вам нет, и дисциплина состоит в том, чтобы слушать, когда он это говорит.
Стратегия, которую мы больше всего хотели заставить работать, не работает. Инструменты, которые мы построили, чтобы это ловить, сказали нам об этом четырьмя независимыми способами — до того, как хоть один доллар оказался под риском. В этом весь смысл серии, и это статья, где смысл обналичивается: машинерия окупается в тот день, когда она вас останавливает, — а не в тот, когда она вам льстит.
Авторы
Инженер торговых систем
Разработка торговых ботов с 2017 года: межбиржевой арбитраж (подключал до 30 бирж), парный арбитраж на коинтеграции между спотом и фьючерсами, скальпинг, фронтраннинг, торговля по новостям, сентиментный анализ, трендовые алгоритмы, а также алгоритмы управления и балансировки портфелей. Делает выставление ордеров до 1 мс, warehouse для big data, бэктестинг-движки, AI-агентов и интерфейсы для ботов (в т.ч. open-source profitmaker.cc). Стек: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, архитектура.