Блог им. Kot_Begemot
В классических задачах прогнозирования используются в основном различные Fold тесты. Их логика весьма понятна и прозрачна – защитить алгоритм от переобучения и получить лучшие стационарные параметры регуляризации. Например, такие, как лямбда Тихонова, или, если речь идёт о бустинге на деревьях решений – минимальное количество листьев. Однако сообщество Smart Lab настоятельно рекомендовало нам провести Walk Forward тесты, логика которых нам мало понятна.
А если логика не понятна, то можно детально рассмотреть какой-нибудь простой пример.
Пусть в качестве объекта прогнозирования у нас будет выступать простая синусоида с частотой ω и амплитудой А. Без применения сложных математических методов эта задача решается следующим образом:
Подбор этих параметров происходит в скользящем окне – по ходу возникновения новых данных, и потому фаза модельного процесса непрерывно изменяется.
Предположим, теперь, что пользователь не желает пользоваться столь сложным алгоритмом подбора фазы, частоты и амплитуды, которые он решает задать самостоятельно в виде некоторых пользовательских параметров.
Естественно, если он задаёт переменные в виде постоянных параметров (в первую очередь фазу), то его алгоритм начинает обладать нулевой предсказательной силой.
В итоге, пользователь решает, что некоторые «параметры» всё-таки изменяются во времени и их нужно постоянно «переоптимизировать» – чтобы модельный синус всё-таки описывал динамику исследуемого синусоидального процесса.
Эта постоянная «переоптимизация», возникшая из-за того, что пользователь изначально включил в модель изменяющиеся во времени переменные как статичные параметры, и которые по ходу движения окна алгоритм все время переподбирает – называется Идущим Вперёд Тестом — Walk Forward Test .
При описанной выше переоптимизации фаза, подобранная в предыдущем окне как оптимальная (в смысле правильности предсказания на предыдущем шаге), очевидно, будет неправильной в следующем окне – сдвиг окна приводит к новому значению фазы. Потому такой алгоритм пререоптимизации все время будет запаздывать по времени в плане вычисления правильной фазы.
По указанной причине алгоритм вычисления переменных зашивается в модель сразу – в этом и есть суть моделирования. В этом и состоит сама модель – в предложении, как моделировать переменные, чтобы не происходило запаздывания предсказаний. И в этом смысле Walk Forward Test теряет всякий смысл как тест вообще и как тест на переобучаемость модели в частности.
При этом, Walk Forward Test, в нашем примере, будет показывать намного лучшие результаты чем Back Test, так как в отличие от Back Test’a, в котором фаза процесса в окне принимается одной и той же на всей исторической выборке, Walk Forward модель действительно будет более-менее соответствовать действительности (хотя и с запаздывающей коррекцией фазы).
Существует ещё и другой вариант – когда исследуемый процесс абсолютно случаен (распределён по Гауссу с АКФ =0), а исследователь применяет к нему модель синуса. Тогда на любом ограниченном участке коричневого/белого шума он сможет выделить какой-то тот, или иной синус, возникший в объекте абсолютно случайно, но принимая его за закономерность, по сути, закладывает в модель апостериорно известный ему шум. В этом случае – полной неадекватности модели – результаты Back Test будут намного лучше результатов Walk Forward Test, но применять такую модель, даже если Walk Forward Test она пройдёт «успешно», всё равно нельзя в силу её полной неадекватности.
Подобное априорно закладываемое знание об апостериорном значении шума — не имеет к классически понимаемому переобучению модели вообще никакого отношения.
Так, в классическом моделировании всегда строится такая модель, которая адаптируется на текущем окне, не зная ничего о будущем. Такая модель изначально удовлетворяет требованию Walk Forward, и смысл проведения для нее Walk Forward теста абсурден изначально. Но каждая модель, «успешно» или «не успешно» прошедшая «Walk Forward» подвергается ещё Fold тестам, чтобы исключить или ограничить переобучение модели.
Поэтому, в ответ на предложение провести Walk Forward Test мы можем только поблагодарить участников дискуссии за стимул к обсуждению этого вопроса.
1. Ограничения
2. Класс функций
3. Дополнительную, внешнюю информацию.
Например, если при торговле облигациями или при формировании портфеля вы учитываете ставку ЦБ.
Если ваши параметры в явном или не явном виде задают переменные, то эта антиподгонка, будет как раз тем нежелательным эффектом, с которым вы боретесь.
Имеет смысл штрафовать модели за нелинейность или точность (задавать параметры фильтрации), что и делается при решении классических задач прогнозирования при помощи различных Fold тестов.
Ну и, поскольку, мы имеем дело со стохастическими процессами (если это предположить), то ещё имеет смысл штрафовать за количество признаков. Известно, например, что количество самоубийств сильно коррелирует с количеством пользователей Internet Explorer. Так, строя прогноз одного инструмента исходя из данных другого (многомерная регрессия) вы всегда сможете найти (с хорошей долей вероятности) некоторый случайный предиктор, дающий хороший результат на любом типе тестов.
Но даже в этом случае, вам нужно использовать другую систему штрафов за «переобучение», независимую от числа параметров. Например, штрафовать за сумму весов (Lasso) или какую-либо другую систему (в зависимости от метода).