Walk-forward оптимізація має репутацію чесного способу налаштувати стратегію, і вона на неї заслуговує — принаймні порівняно з оптимізацією на всіх даних і милуванням результатом. Але в цієї техніки є тихі режими відмови, і кожен з них лишає той самий артефакт: валідаційний звіт зі словом «робастна», підшитий до стратегії, яка такою не є. Ось три, проти яких нам довелося будувати захист, згруповані за руїнами, які вони по собі лишають.
Відмова перша: витік між вікнами
Як робити не треба: налаштувати на січні–червні, валідувати на липні, а тоді дозволити будь-чому з липня вплинути на другий прохід — перезапуск після того, як ви побачили out-of-sample число, «дрібне підкручування» сітки параметрів, ознака, нормалізована по всьому ряду. Кожне окремо виглядає невинно. Разом вони перетворюють out-of-sample вікно на in-sample дані із затримкою.
Руїни: out-of-sample Sharpe, який загадковим чином повторює in-sample Sharpe. Справжні out-of-sample результати шумні й розчаровують; підозріло гладкий зв'язок IS/OOS означає, що інформація тече назад. Ми стежимо за цим співвідношенням явно — in-sample більш ніж утричі вищий за out-of-sample позначає прогін як підозрілий, а out-of-sample на нулі чи нижче вбиває його незалежно від того, наскільки красиво виглядає in-sample.
Відмова друга: підбір метрики між вікнами
Проганяєте три walk-forward вікна, отримуєте три шумні результати, а тоді підсумовуєте: середній Sharpe? Медіанний? Викинути найгірше вікно через «зміну режиму»? Кожен вибір — це ступінь свободи, і наполегливий оптимізатор (людина чи баєсів) знайде те зведення, за яким ця стратегія виглядає найкраще. Сімдесят п'ять Optuna-трайлів на вікно — це сімдесят п'ять шансів підігнатися під шум, помножені на стільки зведень, скільки ви готові розглядати.
Руїни: стратегія, яка проходить валідацію, а потім у живій торгівлі видає результат найгіршого вікна — бо найгірше вікно було єдиним чесним. Наше правило: спосіб агрегації зафіксовано в конфізі до прогону, бюджет трайлів зафіксовано, а аналітик читає результати по кожному вікну разом із показаним розкидом. Стратегія, якій для проходження потрібне доброзичливе зведення, не проходить.
Відмова третя: holdout, який перестав ним бути
Holdout працює рівно один раз. Удруге, коли стратегію оцінюють на ньому — після підкручування параметра, зміни сигналу, «а давай просто перевіримо» — це вже не holdout; це повільна валідаційна вибірка. П'ятнадцять недоторканих днів здаються дрібницею, яку легко зберегти, доки не з'явиться тиск ітерацій і повторна перевірка не почне здаватися нешкідливою.
Руїни тут тонкі: результати holdout, які покращуються від ітерації до ітерації тієї самої стратегії. У свіжих out-of-sample даних немає жодних підстав винагороджувати третю ітерацію більше за першу, а коли вони це роблять — holdout уже вироблено. Ми забезпечуємо одноразовість механічно: holdout оцінюється один раз за прогін пайплайна, результат записується в запис, а стратегія, якій потрібна ще одна спроба, проходить увесь стрій наново — з новими вікнами включно. Вона має зберегти щонайменше 70% walk-forward out-of-sample Sharpe, і другого кидка цього кубика немає.
Ознака, яка переживає всі три
Перед усім цим ми проганяємо звичайний прохід на чутливість: зсуваємо кожен параметр на ±20% і дивимося на метрики. Справжня перевага деградує плавно; збіг зривається з обриву. Це найдешевший тест у пайплайні, і він накладає вето на стратегії, які інакше пропливли б крізь усе описане вище — бо обрив по параметру і є те, як виглядає перенавчання до того, як ви дали йому шанс сховатися у валідаційній машинерії.
Ніщо з цього не робить оптимізацію безпечною. Воно робить режими відмови гучними — а це максимум, що можна чесно вимагати від процесу валідації.
← Усі статті