Некоторое время назад я баловался вопросом «Как мало усилий я могу приложить для создания модели XGBoost для набора финансовых данных?».

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

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

Код самой модели показан во второй части серии. Эта первая часть посвящена поиску данных.

Источник данных

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

Я использовал библиотеку pandas-datareader для загрузки исторических данных по акциям. Он уже включает в себя интерфейс для загрузки исторических данных об акциях из Yahoo, так что это избавило меня от необходимости искать веб-API. Линии

from pandas_datareader import data as web
msft_stocks = web.DataReader('MSFT', 'yahoo', '2017-01-01', '2022-03-31')

— это все, что вам нужно, чтобы приобрести акции Microsoft в период с 1 января 2017 года по 31 марта 2022 года.

Код

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

Дополнительные биты предназначены для решения проблем с загрузкой данных, локальным хранением данных и объединением всех данных об акциях в один фрейм данных и экспортом в CSV. О, и я также включил столбец Daily Return %, который вычисляет процент роста значения Adj Close на ежедневной основе. Вы можете утверждать, что эта последняя часть уже относится к разработке функций, поскольку она будет полезна для построения модели временных рядов: функции, которая относится к изменениям данных с течением времени.

С точки зрения данных, данные каждой акции включают следующее:

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

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

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

И это все для получения данных. Это было быстро, но я хотел отделить это от фактического построения модели, чтобы сразу начать вторую часть с вызова pd.read_csv :)