День, когда я поменял знак и назвал это озарением

Однажды бэктест вернул винрейт, который был почти в точности противоположен тому, на что я надеялся. Там, где я хотел, чтобы модель была по большей части права, она была по большей части неправа — и не случайно неправа, а чисто, симметрично неправа, как будто она пыталась проиграть.

Вместо того чтобы спросить почему, я сделал нечто, что примерно на час показалось мне гениальным. Я перевернул логику, чтобы она совпала. Если модель надёжно ошибается, рассуждал я, то делать противоположное тому, что она говорит, должно быть надёжно правильным. Одно небольшое изменение — и проигрышное правило стало, на бумаге, выигрышным. Я поздравил себя с открытием.

Это не было открытием. Это был момент, когда я начал лгать себе правкой в один символ.

Число, которое было в точности неправильным

Подозрительным было вовсе не то, что результат был плохим. Плохие результаты — это норма; это и есть бо́льшая часть работы. Подозрительным было то, что он был плох таким аккуратным, зеркальным образом — той разновидностью симметрии, которая, задним числом, может указывать на то, что внизу сломано что-то более прозаичное, а не на стратегию, которая действительно «наоборот».

Но симметрия соблазнительна, когда она указывает в сторону лёгкой победы. Грязный плохой результат заставляет тебя отлаживать. Аккуратно перевёрнутый шепчет о коротком пути: ты ближе, чем думаешь — просто разверни это.

Исправление в один символ

И я развернул это. Я обратил условие — перевернул неравенство — и та же логика, что проигрывала, теперь, в бэктесте, выигрывала. Я закоммитил изменение, чувствуя, что перехитрил проблему. Вся правка была меньше, чем это предложение.

Эта малость должна была стать предупреждением. Настоящее преимущество трудно найти и ещё труднее удержать. Когда один перевёрнутый символ, похоже, превращает провал в успех, честное предположение — не то, что ты нашёл скрытую истину. А то, что ты нашёл скрытый баг и всего лишь сменил сторону, на которой относительно него стоял.

Почему смена знака ощущалась как гениальность

Логика почти неотразима: если предиктор стабильно неправ, то его инверсия делает его стабильно правым. Обратный гений. Контрарианская золотая жила. Кто бы не взял модель, которая надёжно ошибается, и просто не прочитал бы её наоборот?

Изъян в этом рассуждении — слово стабильно. Оно предполагает, что модель на самом деле что-то предсказывает — просто в неправильном направлении. И это предположение было единственным, что я так и не проверил.

Что на самом деле было сломано

Модель не была перевёрнутой. Она едва вообще что-либо предсказывала. Её выходы были вырожденными — сжатыми в узкий, неинформативный диапазон, говорящими почти одно и то же, что бы ей ни показали. Она не выучила сигнал и не направила его не туда. Она не сумела выучить сигнал и выдавала нечто близкое к шуму с лёгким, бессмысленным уклоном.

Короткая серия по большей части решек не доказывает устойчивого, эксплуатируемого смещения — это с тем же успехом может быть сломанная или ненадёжная монета. Перевернуть то, как ты читаешь зашумлённый сигнал, не делает сигнал информативным. Это лишь переименовывает шум.

Инверсия сделала хуже

Это та часть, которую бэктест в итоге вынудил меня признать. После переворота логики результативность не отзеркалилась вверх во что-то хорошее. Она осталась плохой — а по некоторым меркам стала хуже. Переворачивать было нечего. Я взял шум, перевернул его и снова получил шум, теперь наряженный в костюм намеренности.

Тот короткий, прекрасный результат, от которого я почувствовал себя умным, был тем же миражом, о котором я писал раньше: числом, что льстит тебе ровно настолько, чтобы помешать задать единственный вопрос, который имел значение — выучила ли модель хоть что-нибудь вообще?

Настоящий баг был во мне

Переворот в один символ никогда не был на самом деле изменением кода. Это была категориальная ошибка. Я обошёлся с симптомом — плохим винрейтом — так, словно это была стратегия, которую я мог настроить, тогда как на самом деле это был диагноз, который я отказался поставить. Вместо того чтобы спросить, почему выход модели выглядит именно так, я оптимизировал неравенство против бэктеста, пока число не позеленело.

Это и есть переобучение в его чистейшей, самой человеческой форме. Тебе не нужна тысяча параметров, чтобы переобучиться. Это можно сделать одним-единственным знаком, если ты готов выбрать его исходя из результата, который хочешь, а не из причины, которую понимаешь.

Неожиданный результат — это вопрос, а не ответ

Дисциплина, которую я из этого вынес, проста на словах и по-настоящему трудна на практике: когда результат выходит противоположным тому, что ты ожидал, это вопрос, а не ответ. Соблазн — потянуться к наименьшему изменению, которое заставит число выглядеть правильным: поменять знак, инвертировать правило, поменять местами сравнение. Это наименьшее изменение часто самое опасное, потому что оно чинит видимость, оставляя причину совершенно нетронутой.

Теперь, когда что-то у меня переворачивается, я стараюсь сопротивляться изящному развороту и вместо этого задать уродливый вопрос: не «как мне заставить это число указывать в правильную сторону?», а «есть ли здесь вообще реальный сигнал, указывающий хоть в каком-нибудь направлении?». Часто его пока нет. И перевёрнутый знак не может его изготовить.

Проигрышная модель, прочитанная наоборот, по-прежнему проигрышная модель. Единственное, что меняет инверсия, — это сколько времени тебе нужно, чтобы это выяснить.

— Никаких сигналов, никакой доходности, не инвестиционный совет.