Машинное обучение против финансовой математики: проблемы и решения

Всем привет! Так получилось, что я уже около семи лет занимаюсь машинным обучением. В последние несколько из них я как исследователь и CTO Neurons Lab часто работаю с финансовыми данными в рамках проектов, связанных с инвестиционным менеджментом и алгоритмическим трейдингом. Чаще всего клиенты приходят с текущими стратегиями, которые нужно оптимизировать, или идеями с альтернативными данными, которые потенциально могут прогнозировать рынок. Конечно же, анализ данных в таких задачах — наше все. Наряду с большой ответственностью за капитал инвесторов :)

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

С одной стороны, в этой статье я хочу поделиться несколькими идеями о проблемах эконометрики и финансовой математики и рассказать, как машинное обучение могло бы помочь в их решении. С другой стороны, хочу показать пару примеров того, как «обычное» машинное обучение совершенно не справляется с финансовыми данными, и объяснить почему. Я надеюсь, что специалисты в финансовой области смогут переосмыслить свои подходы к моделированию финансовых процессов, а специалисты в анализе данных — увидеть кардинальную разницу между картинками/текстами и данными рынка.

На написание этой статьи меня вдохновили работы доктора Marcos Lopez de Prado. Для детального погружения в тему крайне рекомендую прочесть его публикации, презентации его семинаров и книги. Также ряд дополнительных полезных материалов по теме вы сможете найти в конце статьи.

Проблемы эконометрики

Реальные данные сложнее, чем «цены, спрос и предложение»

Стандартная процедура в финансовой математике — взять временной ряд каких-то цен, обработать его с помощью time series differentiation, после чего построить какие-то модели распределения и показать, что эта модель описывает эти данные (безотносительно того, будь это ARIMA или стохастическое дифференциальное уравнение Фоккера-Планка).

В чем тут проблема?

  • Данные на рынках изначально не структурированы (отдельные заявки на торги, упоминания в новостях, финансовые отчетности), а эконометрические модели используют красивую последовательность цен (интересно, откуда они взялись?).
  • Очень низкое отношение сигнала к шуму.
  • Удаление памяти временных рядов (да-да, это про дифференциацию временных рядов, см. книгу).

Финансовые модели в большинстве своем работают с максимально неинформативными данными, еще и обрабатывая их неправильно и объясняя паттерны in-sample (об этом — дальше).

Корреляции и линейные зависимости ничего не объясняют

Из университета мы знаем, что корреляция объясняет меру линейной зависимости между двумя случайными величинами. Более того, мы даже слышали о том, что корреляция != причинно-следственной связи.

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

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

Самый простой пример того, как корреляция «лажает», виден на картинке ниже: очевидная нелинейная зависимость справа показывает корреляцию −0.008.

Image Source

Эконометрические модели объясняют прошлое, но ничего не предсказывают

Преимущественная часть финансовых моделей основана на объяснении вариативности данных внутри выборки. Мы привыкли в машинном обучении всегда считать ошибку на out-of-sample данных, и об этом создано много мемов, но в эконометрике, которая изначально позаимствовала свои методы из биологии, это просто не принято!

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

Только не показывайте этот мем эконометрикам

«Статистическая достоверность» недостоверна

Опять-таки, из университетского курса статистики мы знаем, что если мы получили p-value, достаточно низкое для какой-то переменной, то это значит, что мы отбрасываем нулевую гипотезу о неважности этой переменной и считаем ее «достоверной». Для того чтобы увеличить уровень достоверности, мы можем ставить границу для этого p-value. Часто оно равно 0.01 или 0.05.

Вот только это не совсем то, что нам нужно.

  • P-values требуют сильных предположений о данных и моделях (не коррелированные переменные, residuals распределены нормально, и так далее), которые практически не встречаются в реальном мире.
  • Нам вообще-то не так интересно опровержение гипотезы H0 in-sample, нас больше интересует подтверждение H1 out-of-sample.

Если что, то даже американская ассоциация статистиков не так-то положительно относится к этим p-values. Но расскажите об этом у себя на кафедре :)

Бэктестинг как способ исследований

Бэктестинг — это процедура проверки стратегии на исторических данных одного или нескольких финансовых инструментов, чтобы понять, как стратегия бы отработала «в прошлом», и на основе этого оценить риски ее поведения в будущем.

Начнем с того, что цены «в прошлом» — это всего лишь одна из реализаций сложного стохастического процесса, и даже если мы могли бы его смоделировать, то проверять надо было бы не на одной случайной реализации, а на сотнях тысяч (см. Монте-Карло).

Более того, бэктестинг — это все один большой и красивый набор данных in-sample. Сделать модель, которая хорошо заработает в прошлом, — проще простого, вопрос только в том, как она отработает на живых деньгах.

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

Чем больше экспериментируем — тем лучше результат. Как удобно, да? (см. книгу)

Машинное обучение поможет?

С эконометрикой и финансовым моделированием вроде разобрались, понятны проблемы и как машинное обучение может помочь. Почему же тогда у многих попытки обучить модели на исторических данных ни к чему не приводят? Пройдемся по тем же пунктам, но уже с указанием проблем машинного обучения в них. Кому интересно углубиться в тему, 14 марта я буду проводить воркшоп по этой теме на конференции Data Science UA Conference.

Сложные данные надо еще приготовить

Неструктурированные данные сами по себе — еще не панацея. Даже с сырыми данными с рынка (ticks) или с альтернативными данными как sentiment нужно еще серьезно поработать.

Правильный семплинг данных

Зачем вы считаете свечи каждые N минут? Рынок ведь работает не по часам, а по ивентам: намного логичнее делать свечи каждые X долларов торгов или похожим образом (см. Bars).

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

Примеры сырых цен, временных, «объемных» и «долларовых» свечей

Также можно увидеть, что свечи, созданные на основе периодов времени, имеют намного меньше вариативности, чем другие:

Вариативность цен внутри разных свеч

Вы можете попробовать провести эксперименты со своими данными на основе кода отсюда. Во многих других задачах с нерегулярным семплингом ивентов (медицина, трекинг) похожие техники могут помочь сделать данные более пригодными для анализа.

Правильная нормализация данных

Известное нам дифференцирование временного ряда напрочь удаляет всю память об эволюции цен (см. Fractional differentiation).

На помощь приходит не особо известная в широких кругах техника fractional differentiation. Оператор разницы математически обычно представлен целым числом, что и стирает память с лагом этого целого числа. А что, если мы могли бы использовать дробное число от нуля до единицы?

Пример работы fractional differentiation. Image Source

Анализ ADF-статистики (о стационарности временных рядов) и разные параметры fractional differentiation: от 0 до 1. Как видим, оптимальные параметры всегда меньше или равны 0.5!

Как видно, это преобразование все еще делает временной ряд стационарным, но одновременно и оставляет информацию о предшествующих трендах. Детали по реализации смотрите в источнике 1 и источнике 2.

Поправка на IID-гипотезу

Машинное обучение работает тогда, когда обучающая выборка сгенерирована независимо друг от друга, чего нельзя сказать об окнах временных рядов, которые не только пересекаются друг с другом, но еще и фичи с лагом вносят зависимости, которые только мешают обучению (см. Sampling).

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

Скорее всего, получится так, что большая часть примеров в выборке будет «не уникальными».

Правильный выбор таргета для прогнозирования

В мире с stop losses и take targets прогнозировать цену через N часов — глупость. Наш таргет должен быть максимально похожим на принятие решения (см. Triple barrier labeling).

Техника triple barrier labeling позволяет размечать данные на основе «окна будущего». Например, если мы хотим открыть сделку в следующий час, нам нужно прогнозировать не что произойдет ровно через час, а каким будет максимальное движение цены и в какую сторону в течение этого часа (а вдруг ровно через час цена пойдет вверх на 1%, но в течение этого часа будет бОльший скачок на 5%?). Визуально эта техника представлена на иллюстрации ниже:

Пример того, как надо размечать данные в пределах одного окна «в будущем», Image source

Что делать с зависимостями?

Раз мы решили, что корреляция (или, что еще хуже, какие-то околоэвклидовые метрики) не подходит для определения зависимостей или меры схожести, что мы можем тут использовать? Я вижу два пути:

  • «Литературный»: использовать меры на основе теории информации (например, mutual information ratio) или статистические расстояния (KL divergence, EMD и так далее).
  • «ИИ-шный»: использовать подходы metric learning, возможно, на основе автоэнкодеров или сиамских нейронных сетей.

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

Как мы видим, метрики как information variation и max correlation, о которых можно детальнее прочесть тут, справляются намного лучше с выявлением нелинейных паттернов.

Кросс-валидацию тоже надо сделать правильно

Недостаточно просто тестировать работу алгоритмов на каком-то куске данных «в будущем». Стандартная K-Fold кросс-валидация будет точно прогнозировать «прошлое», а специализированная кросс-валидация для временных рядов будет нарушать IID-семплинг выборок, особенно если фичи считаются с лагом.

Есть несколько способов улучшить кросс-валидацию: например, чередовать окна для тренировки и тестирования в хронологическом порядке с «промежутками» между ними. Все для того, чтобы выборки были максимально независимы (пример на иллюстрации ниже). Второй способ — это комбинаторная кросс-валидация, о ней детальнее можно почитать в книге Dr. Lopez de Prado.

Image Source

Значимость факторов out-of-sample

Да, feature importance — это выход для замены p-values. Но его тоже нужно использовать out-of-sample. В идеале — совместить с вышеописанными методами кросс-валидации и считать распределение важностей на кусочках кросс-валидации. Таким образом мы сможем понять предсказательную значимость фич «по-настоящему». Более детально метод можно изучить и запустить код в этой статье.

Пример важности факторов для настоящего датасета с несколькими искусственными шумами для валидации метода

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

Бэктестинг — это не способ исследований

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

Мы поговорили о том, как выбирать переменные, между которыми может быть зависимость, как ее считать и как проверять out-of-sample. Где-то посерединке будет алгоритм машинного обучения, который при адекватной постановке задачи и данных будет что-то прогнозировать. Бэктестинга в исследованиях нет!

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

Не надо подгонять модельки под бэктест. Сначала — исследования гипотез о зависимостях (то есть правильное машинное обучение), а потом постройка торговых стратегий. Плохой бэктест? Начинаем исследования сначала, и никак иначе.

Выводы

Я надеюсь, что теперь немного понятнее, почему машинное обучение «в лоб» в финансах не работает, но легче от этого точно не стало.

С другой стороны, вполне очевиден вектор исследований и улучшения компетенций.

Правильная «финансовая» постановка задачи:

  • По возможности, используйте сырые данные о торгах, а не подготовленные «свечи» из публичных источников — они статистически содержат меньше ценной информации.
  • Нормализуйте ваши данные так, чтобы они не удалили память и паттерны (касается не только финансов, но и всех других областей).
  • Следите за тем, чтобы выборка была действительно независима, и не нарушалась ключевая IID-гипотеза о распределении данных.
  • Подготовьте целевую переменную соответственно вашей торговой логике, а не на основе «что будет через N времени».

Более глубокое понимание входных и выходных данных и выбор метрик:

  • Когда делаете изначальный exploratory data analysis, визуализируйте зависимости не на основе корреляций, а на основе более сложных метрик: корреляции не отображают ничего сложнее простых линейных взаимосвязей, которые в реальной жизни практически не встречаются.
  • Эта же идея важна и в других задачах, связанных с временными рядами: корреляция и эвклидовы метрики не оптимальны, попробуйте другие метрики, указанные в этой статье, или же специализированные, такие как dynamic time warping.

Детальный анализ обученных моделей:

  • Обязательно исследуйте значимость факторов на кросс-валидации — это поможет понять настоящие драйверы рынка и очистить датасет от слабых или вообще случайных признаков.
  • Точно такая же логика работает и в других задачах, особенно учитывая ремарку о том, что p-values в реальной жизни не могут определить качество переменных из-за нереалистичных ограничений к задаче.

Правильная валидация гипотез и разделение с бэктестингом:

  • Не делайте ошибки эконометрического моделирования: ваши модели должны прогнозировать будущее, а не объяснять прошлое. Объяснение ваших моделей оставьте feature importance и детальному анализу обученных моделей.
  • Правильная кросс-валидация: она должна учитывать IID-семплинг выборок и реалистичность постановки эксперимента (не предсказываем прошлое, и так далее). Обязательно попробуйте combinatorial cross-validation в других задачах, она дает более точную оценку точности сравнительно с K-Fold.
  • Бэктестинг вообще не входит в исследование. Если ваши модели не могут торговать в плюс — не экспериментируйте с бэктестингом, проверяйте все описанные выше шаги, которые касаются только машинного обучения.

И да, все это — только об исследованиях, которые составляют от силы 10% работы над торговыми стратегиями. Еще более сложная работа вас будет ждать при внедрении и живых торгах, оптимизации, обновлении и поддержке, но об этом — в другой раз.

Список литературы

Базовая литература:

Прикладная литература:

Похожие статьи:
Меня зовут Максим, я работаю тестировщиком ПО, с интересом слежу за событиями в мире тестирования и IT. Самое полезное собираю вместе...
Продолжаем знакомство с Go. Первая статья должна была заставить читателей начать писать веб-приложения на Go. В этой статье будет...
От редакции:В рубрике DOU Проектор все желающие могут презентовать свой продукт (как стартап, так и ламповый pet-проект). Если вам...
.NET C# Design Notes: object initializers, with-expressions, positional deconstruction. Портирование MSBuild на .NET Core ASP.NET Построение multi-tenant приложения (кто подскажет,...
Южнокорейская компания LG Electronics, в рамках предстоящей выставки CES 2016, объявила о пополнении её фирменной линейки умных аудио...
Яндекс.Метрика