Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП

RedDeveloper
18.03.2022 16:25
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП

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

В учебном модуле 8-й недели делегаты получили задание сравнить производительность различных моделей машинного обучения методом ансамбля, и после завершения этого проекта я подумал, что было бы полезно реализовать мое исследование в виде класса Python, который берет данные из различных онлайн-источников и выводит векторные бэктесты для итераций моделей long-only и long-short.

Объектно-ориентированное программирование (ООП) подробно рассматривается в нескольких модулях TPQ и было одним из аргументов в пользу того, чтобы стать делегатом, поскольку я давно заинтересован в совершенствовании этого навыка. Далее я расскажу читателю о различных компонентах моего класса ensembleBacktester, и хотя подробное описание каждого аспекта ООП выходит за рамки этой статьи, я буду обсуждать многие фундаментальные концепции. Обратите внимание, что весь скрипт будет представлен одним куском в конце этой статьи.

Начнем, как обычно, с импорта необходимых библиотек и форматирования вывода на консоль. Смотрите здесь, чтобы установить talib через conda, если это необходимо:

Открыть Github Gist

Теперь мы переходим к началу нашего кода, который включает в себя подробный docstring, описывающий атрибуты и методы класса, а также базовую функциональность. Вообще говоря, атрибуты можно рассматривать как "состояния" или значения объекта, а методы - как действия. В данном документе описаны определяемые пользователем атрибуты из нашего метода __init__ , которые включают тикер, даты начала и окончания, стоимость сделки (в процентах) и онлайн-источник данных. Что касается методов, мы подробно рассмотрим каждый из них ниже, но отметим, что приведенный здесь документ также используется в качестве ссылки для выбора конкретной модели в методе choose_model .

Открыть Github Gist

Двигаясь дальше, мы приходим к нашему специальному методу __init__, который используют все классы Python. Думайте о методе init как о начальном состоянии вашего класса, т.е. о том, какие атрибуты вы хотите, чтобы класс имел при инстанцировании. Мы не только храним заданную пользователем информацию о тикере и финансовых данных в качестве атрибутов, но и вызываем один из двух возможных методов источника данных get_yahoo_data или get_binance_data в зависимости от выбора пользователя. Вызов метода как части процедуры метода __init__ приводит к тому, что действие метода автоматически происходит при инстанцировании, поэтому в нашем случае мы загружаем данные о финансовых инструментах с самого начала. ***ПРИМЕЧАНИЕ: для получения данных из этого источника пользователь должен ввести информацию о персональном API-ключе в строках 19 и 20.***.

Открыть Github Gist

Теперь, когда мы загрузили данные, переходим к методу select_model . Методы ансамбля работают путем комбинирования прогнозов от "базового оценщика" (которых у нас 5 на выбор) с помощью методов усреднения/баггинга или усиления (которых у нас 2). Для получения дополнительной информации о методах ансамбля см. сайт scikit-learn. Обратите внимание, что пользователь передает два аргумента для этого метода: первый выбирает наш выбор базового оценщика , а второй - метод ансамбля:

Открыть Github Gist

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

Открыть Github Gist

Наш метод plot_results выводит векторную производительность бэктестов для моделей торговли только в лонг и лонг-шорт, а также строит график результатов:

Открыть Github Gist

И, наконец, наш метод run_strategy вызывает наш метод prepare_test , подгоняет нашу модель, предсказывает наши тестовые данные вне выборки и выводит/печатает точность предсказания на консоль:

Открыть Github Gist

Сложив все это вместе, мы получаем:

Открыть Github Gist

Что приводит к приличной точности 55% вне выборки, при этом модель long-short превосходит TLT ETF с использованием RandomForestClassifier (4) и AdaBoostClassifier (1), а также 2bps транзакционных издержек:

Как сравнивается LogisticRegression? Достаточно изменить base_estimator на 1, и мы видим, что она работает намного хуже:

А вот производительность для комбинации DecisionTreeClassifier / BaggingClassifier, которая также хуже:

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

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML

15.07.2022 14:37

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

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly

16.05.2022 21:25

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

Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)

18.04.2022 13:17

Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно использовать выбранный нами фреймворк, и он становится основным подходом к каждому новому продукту. Однако существует и другой подход к разработке. Вы...

Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React

13.04.2022 15:26

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

В чем разница между Promise и Observable?
В чем разница между Promise и Observable?

11.04.2022 20:00

Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.

Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса

08.04.2022 19:39

Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.