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

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

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

Другой подход - это случайный поиск, который может работать немного лучше, чем поиск по сетке.

Я нашел отличное объяснение на Quora:

Проблема. Цель состоит в том, чтобы найти приблизительный минимум для какой-нибудь «дорогой» функции. Такая функция принимает вектор с действительными значениями 𝐱 ∈ℝ, возвращает скаляр и делает это чертовски долго. Также недоступен расчет градиента. Итак, давайте представим простой одномерный случай:

Пунктирные линии означают, что мы не видим эту функцию - мы можем оценивать ее только в определенных точках.

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

С учетом этого, как бы вы могли найти наилучший из возможных минимумов?

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

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

Сплошная зеленая линия - это наше предположение об истинной функции. Каждая дополнительная полоса зеленого цвета представляет собой половину стандартного отклонения выходного распределения.

Итак, теперь возникает вопрос: учитывая всю эту полезную предполагаемую информацию, какой момент мы должны проверить дальше? Отвечая на этот вопрос, мы заботимся о двух вещах:

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

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

Уравновешивание этих двух факторов - это компромисс разведка-эксплуатация. Ищете ли вы новые места или эксплуатируете золотые прииски, которые вы уже открыли? Мы явно указываем наши предпочтения с помощью функции сбора. Это функция от 𝑥x, которая дает число, которое говорит нам, насколько хорошо мы достигаем этих двух целей. Эта функция дешевая, поэтому мы можем оптимизировать ее и использовать этот 𝑥x в качестве следующей точки для следующего поиска.

Итак, какая функция приобретения? Что ж, есть несколько вариантов, но я буду ожидать улучшения. То есть оцените следующую точку, в которой ожидаемое улучшение является максимальным.

So if:

𝜇 (𝑥) μ (x) - предполагаемое значение функции в x (зеленая линия).

𝜎 (𝑥) σ (x) - стандартное отклонение вывода при 𝑥x (пропорционально зеленым полосам).

Тогда наше приобретение / ожидание улучшения (назовем это 𝐴 (𝑥) A (x)):

где Φ (⋅) и N (⋅) относятся к CDF и PDF стандартного нормального распределения соответственно. Не важно точно понимать эту формулу - просто знайте, что это некий баланс низкого (𝑥) μ (x) и высокого 𝜎 (𝑥) σ (x).

Чтобы увидеть, как это работает, посмотрите на наш предыдущий график:

Таким образом, это говорит нам о необходимости проверки при 𝑥 = 1, поскольку эта точка имеет самую высокую активацию.

А потом повторить. Вот и все! Как я сказал ранее, если GP способен угадать истинную функцию, он побьет случайную выборку.

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

Байесовская оптимизация

В этом видео Сираджа Равала также есть хорошее объяснение:

Если вы хотите глубже погрузиться в эту тему, прочтите эту статью.

Практический пример

Мы рассмотрим одну стратегию, о которой я говорил ранее. Эта стратегия имеет 4 гиперпараметра, давайте определим необходимые библиотеки:

Байесовская оптимизация реализована в пакете hyperopt. Вы можете найти введение в этот пакет в замечательной статье Уилла Кёрсена.

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

Когда кратность ближе к периоду вне выборки, тогда складка имеет больший вес в окончательной взвешенной оценке.

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

В этом примере мы будем использовать:

  • Пятикратное увеличение на один месяц за этап обучения (оптимизации)
  • Один месяц на период тестирования и три недели на валидацию (период вне выборки)

Период тестирования позволяет выбрать пары, которые будут протестированы в период валидации.

  • Период обучения: с 2018–06–01 по 2018–10–31.
  • Период тестирования: с 1 ноября 2018 г. по 30 ноября 2018 г.
  • Период валидации: с 1 декабря 2018 г. по 21 декабря 2018 г.

Давайте определим периоды, пространство гиперпараметров и функцию weighted_mean. Этот код позволяет определять различную длину складок по period_weights.

Следующим шагом является определение функции оценки, которая запускает алгоритм и измеряет производительность (в данном случае - коэффициент Сортино).

Эта функция слишком длинная, потому что также содержит вложенные функции алгоритма из предыдущей статьи. Альтернативный вариант передачи параметров из пакета hyperopt в платформу Catalyst - использование os.environ модуль. Дайте мне знать в комментариях, если знаете, как лучше. Может быть, ребята из Enigma Project посоветуют правильный ответ.

Ядром является функция objective, которая измеряет эффективность нескольких складок с помощью функции weighted_mean, в противном случае получает максимум складок (штрафование).

Следующий код запускает оптимизацию с 300 итерациями.

Результат выглядит так:

В этой таблице представлены первые испытания по количеству очков. Последняя строка - это набор лучших гиперпараметров. Я провел этот эксперимент для ETH / BTC, LTC / BTC, XMR / BTC и ZEC / ETC, используя данные Bitfinex.

Теоретически вы можете визуализировать objective value в трехмерном пространстве, например измерение 1 - измерение 2 - объективное значение, и лучшее решение имеет глобальный минимум:

В этой таблице гиперпараметров показаны лучшие значения параметров для каждого актива:

Выбор активов (этап тестирования)

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

Этот код позволяет это сделать, достаточно изменить гиперпараметры и установить криптовалюту.

Как видите, два актива (ETH / BTC и XMR / BTC) показали положительную динамику.

Тест вне выборки (этап проверки)

Когда мы нашли оптимальные гиперпараметры и выбрали активы, мы можем запустить торговый алгоритм на периоде, который не используется для оптимизации (период проверки).

Давайте построим портфель на основе этих двух активов. При t = 0 установите капитал каждого актива в зависимости от пропорции их целевой стоимости (-15,45 и -9,72).

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

В целом стратегия показывает положительные результаты на вневыборочном периоде. Основные показатели представлены в таблице.

Как видно на графике выше, период просадки слишком большой. Вероятно, алгоритм не смог адаптироваться к убыванию после предыдущего быстрого роста. Вы можете принять это во внимание при формулировке целевой функции.

Мы исключили два актива (LTC / BTC и ZEC / BTC) из портфеля на этапе тестирования. Посмотрим, было ли это правильным решением:

Да, решение было правильным. Если бы эти активы были включены, портфель был бы хуже. Матрица путаницы выглядит так:

Как видим, ошибок I типа у нас нет. Мы только исключили из портфеля ZEC / BTC, но этот актив был хорош на этапе проверки (ошибка типа II). В данном случае это менее важно, чем включение какого-либо актива, который не может быть прибыльным.

Выводы

В этой статье мы рассмотрели следующее:

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

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

Как улучшить этот подход:

  1. Определите свои собственные функции цели и оценки в зависимости от вашей цели.
  2. Настройте периоды обучения / тестирования / проверки.
  3. Создайте портфолио, включающее огромное количество активов, чтобы проверить гипотезу о том, что этот подход может сработать на вас.
  4. Используйте движущийся тест, чтобы получить более значимый результат. Позволяет смоделировать ситуацию, более близкую к реальной торговле. Вы получите больше данных для статистического вывода.

Сообщите мне, какой подход к оптимизации вы используете в своих торговых стратегиях.

С наилучшими пожеланиями,

Сергей