Бот, гонявшийся за собственным хвостом

Однажды я наделил своего боевого торгового бота тем, что казалось проблеском разума: способностью адаптироваться. После череды убытков он становился осторожнее; после череды побед — агрессивнее. Он выглядел отзывчивым, почти живым — системой, которая следит за тем, как у неё идут дела, и соответственно подстраивается.

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

Функция, которая казалась разумной

Идея была соблазнительна своей разумностью. Если бот только что несколько раз подряд проиграл, то наверняка условия неблагоприятны, и ему следует поднять планку, прежде чем рисковать дальше. Если же он на серии побед, значит, условия хороши, и он может позволить себе действовать смелее. Адаптируйся к среде. Реагируй на обратную связь. Что может быть разумнее системы, которая подстраивается под то, как у неё идут дела?

Помню, как я был доволен этим. Из-за этого бот ощущался не как фиксированный набор правил, а как нечто, обладающее суждением.

К чему он на самом деле адаптировался

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

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

Реакция на шум ощущается в точности как обучение

Изнутри сверхреакцию трудно отличить от адаптации. Бот в узком смысле «реагировал на рынок». Но на самом деле он реагировал на дисперсию — случайное скучивание побед и убытков, возникающее в любом процессе с элементом случайности, — и переименовывал эту дисперсию в озарение.

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

Самоусиливающаяся часть

Становилось хуже, потому что корректировки скармливались обратно в ту самую величину, которую измеряли. Рост осторожности после убытков означал меньше сделок, что означало, что следующая горстка исходов была ещё меньше и ещё более беспорядочной, что означало бо́льшие колебания в сигнале, на который реагировал бот, что означало более резкие корректировки. Система реагировала на число, которое сама же и искажала, — петля, которую почти нечему было заякорить извне.

Петля обратной связи устойчива ровно настолько, насколько устойчиво то, к чему она привязана. Моя была привязана в основном к собственной недавней удаче, то есть привязана почти ни к чему. Поэтому она колебалась: осторожно, затем смело, затем снова осторожно, и каждое колебание было реакцией на предыдущее колебание, а не на мир.

Почему малые выборки лгут

В основе всего этого лежит один невзрачный статистический факт: малые выборки не усредняются, они колеблются. Всё утешение от «цифры мне подскажут» держится на том, что цифр достаточно, чтобы удача взаимно сократилась. Горстка сделок — режим противоположный: на него сильно влияет случай, где несколько хороших или плохих исходов могут утащить среднее почти куда угодно.

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

Решение: реагировать медленнее или вовсе не реагировать

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

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

Не всякая адаптация — это разум

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

«Она адаптируется к условиям» звучит как функция. Порой это вежливое описание системы, гоняющейся за собственным хвостом. Вопрос никогда не только в том, адаптируется ли нечто. Он в том, было ли вообще реальным то, к чему оно адаптировалось.

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