В нашей последней записи серии прогнозов цен на акции давайте узнаем, как прогнозировать цены на акции с помощью модели XGBoost.
Если вы хотите вникнуть в другие подходы к прогнозированию цен на акции, взгляните на другие наши блоги из этой серии:
- Прогноз акций: Пророк Facebook
- Статистический подход к прогнозированию курса акций: наивный прогноз, скользящее среднее
- Прогноз курса акций: нейронная сеть с Tensorflow
- Прогноз цен на акции: использование глубоких нейронных сетей на Keras
Следующая статья познакомит вас с шагами и процедурами обучения, которые необходимо соблюдать при прогнозировании временных рядов с помощью XGBoost.
СОДЕРЖАНИЕ
- Что такое XGBoost?
- Базовая терминология
- Предварительная обработка набора данных I: добавление функций
- Определение данных обучения и проверки
- Предварительная обработка набора данных II: нормализация
- Модель
- Обучение модели: шаг 1, шаг 2, шаг 3
- Прогноз
- Заключение
Что такое XGBoost?
XGBoost означает e X treme G radient B oosting.
Основанный на реализации деревьев решений с градиентным усилением, XGBoost недавно был доминирует в прикладном машинном обучении благодаря его скорости и производительности. Алгоритм XGBoost был разработан в рамках исследовательского проекта Вашингтонского университета. Тианки Чен и Карлос Гестрин представили свой доклад на конференции SIGKDD в 2016 году. XGBoost - это огромный скачок в области машинного обучения. Эта статья дает подробное представление об алгоритме.
Базовая терминология
Прежде чем мы углубимся в подробности, давайте познакомимся с некоторыми часто используемыми терминами при прогнозировании временных рядов. Помимо каждого термина, также упоминалось имя переменной, использованное при кодировании:
- Горизонт (H): количество дней, на которое необходимо спрогнозировать цену акций.
- Количество запаздывающих характеристик (N): сегодняшняя цена акций во многом зависит от вчерашней цены акций. Но как насчет курса акций месяц назад? Влияет ли это в равной степени на сегодняшнюю стоимость акций? Нет. Количество лагов - это количество дней в прошлом, которое влияет на сегодняшнюю стоимость акций. Позже в этом блоге вы узнаете, как мы определяли это значение.
- Возможности (функции) : Цена акций может зависеть от времени года (например, в праздничные дни, например, 25 декабря?), месяца года ( месяц, в котором выпускается бюджет?) и так далее. Мы используем fastai для создания таких функций.
- Нормализованное значение цены акции для N временных меток (features_lag): значение цены акций на N временных метках необходимо нормализовать, прежде чем отправлять их в качестве входных данных в модель (с использованием среднего и стандартного отклонение).
- DataFrame цены акций (data): очевидно, вам нужны некоторые данные! Мы используем данные New Germany Fund Data. Мы храним эти данные в фреймворке pandas.
- Размер обучающих данных, данные проверки (train_size, val_size): не требует пояснений!
Предварительная обработка набора данных I: добавление функций
Во-первых, мы предлагаем использовать fastai для создания столбцов, которые содержат более подробную информацию о метке времени. Например, указана ли соответствующая отметка времени в начале месяца, недели, года и т. Д. Это поможет учесть тенденции и сезонность в вашей модели. Предположим, количество, которое вы пытаетесь предсказать, вырастет первого числа каждого месяца. Разве вы не хотите, чтобы ваша модель учитывала это?
Импортируйте add_datepart из fastai.tabular.
DATE - это столбец, содержащий все даты в формате DateTime.
Мы удалили столбец DATEElapsed, так как нам казалось, что мы этого не сделали. я не нуждаюсь в этом.
Далее мы добавляем функции задержки. col_name - это столбец количества, которое вы хотите спрогнозировать, например, начальную цену акции. num - количество функций задержки, которые вы хотите вычислить. Мы рекомендуем вам выбрать более высокое значение, например 15. Мы сузим до количества функций задержки позже.
Столбец n-го лага содержит значение курса акций за n дней до текущей отметки времени. Например, первый столбец лага может содержать вчерашнюю стоимость акций в сегодняшней строке. Изображение измененного фрейма данных лучше объясняет это:
2014–06–23 - первая дата, для которой у нас есть значение цены акции. У нас нет стоимости акций за день до этой даты. Вот почему первое значение в OPEN_lag_1 - NaN. Точно так же первые два значения в OPEN_lag_2 - NaN.
Определение набора данных для обучения и проверки
Вышеупомянутая предварительная обработка добавила много столбцов. Но нужны ли нам все они?
Что делать, если ваша модель не зависит от того, какой сейчас день недели? Необязательно считать этот столбец правильным.
Но как узнать, от каких столбцов будет зависеть ваше «прогнозируемое» количество?
Все просто! Постройте корреляцию (для непрерывных переменных, да, включая функции запаздывания) и коробчатые диаграммы (для категориальных переменных).
Мы предпочитаем выбирать только столбцы, у которых есть корреляция больше 0,97.
Мы отбрасываем все непрерывные столбцы, кроме первых 7 функций задержки.
Предварительная обработка набора данных II: нормализация
Входные данные в нашу модель желательно нормализовать. Но это не так просто, как найти статистические значения (а именно среднее и стандартное отклонение) всех значений цен на акции и выполнить простой расчет.
Есть небольшое изменение. Вспомните, как мы указали, что цена акции сегодня будет во многом зависеть от значений N до нее. Поэтому вместо всех данных мы используем среднее значение и стандартное отклонение значений t-1 до t-N, чтобы нормализовать курс акций при t = 0.
Строки 2–4: Функция Pandas Rolling вычисляет среднее число окон записей до (и включая) текущей записи. min_periods - минимальное количество наблюдений в окне, необходимое для получения значения (в противном случае результатом будет NaN).
Строки 5–6: Нас интересует среднее значение t-N до (и без учета) текущей записи. Это связано с тем, что цена акции при t = 0 не может предопределять цену акции при t = 0, потому что мы не знаем заранее цену акции при t = 0! В этих строках вычисленные mean_list и std_list сдвигаются на один шаг назад для получения желаемого результата.
В результате получаются два столбца, например:
Наконец, среднее и стандартное отклонения используются для нормализации столбцов:
Столбец col_name_mean содержит среднее из N значений до значения цены акции в col_name. Итак, строка 6 просто столбец для уменьшения значений col_name.
Однако функции задержки нельзя просто уменьшить с помощью col_name_mean. Почему? Потому что вам нужно найти статистические значения (среднее и стандартное отклонение) N значений до функции запаздывания, чтобы уменьшить ее правильным образом. Помните, что мы не используем статистические значения цен всех акций для уменьшения значений; мы используем статистические значения для предыдущих N временных меток. Проще говоря, чтобы уменьшить вчерашнюю цену акций, мне нужно вычислить среднее значение и стандартное отклонение за N дней до вчерашнего дня.
Модель
Обучение XGBoost предсказанию значений H - это не просто вызов .fit (), за которым следует вызов .predict ().
Почему?
1. Набор обучающих данных содержит N столбцов с масштабированной задержкой, которых в тестовом наборе данных сначала не будет.
2. Будущие цены на акции во многом зависят от последних значений. Таким образом, набор данных проверки будет лучшим определителем прогнозируемых значений для дат тестирования, а не значений обучения.
Применяется популярный метод, известный как рекурсивное прогнозирование.
Обучение модели: шаг 1
Функция train_model подготавливает набор данных для поезда и тестирования для отправки его в пользовательскую функцию fit_model.
Эта функция вызывается с комбинированным набором данных для поездов и записей проверки.
Строка 8–10: формирование набора данных для обучения и тестирования
На первой итерации первые значения train_size формируют набор данных для обучения. Когда модель готова, мы хотим спрогнозировать значения H. Таким образом, тестовый набор данных имеет непосредственные записи H из последней записи (исключая) набора данных поезда.
На следующей итерации набор данных поезда сдвигается на значения H / 2 (шаг цикла for). Опять же, набор тестовых данных формируется непосредственными записями H из последней записи набора данных поезда.
Этот процесс повторяется до тех пор, пока мы не достигнем последнего прогноза, который мы можем сделать, то есть для последних значений H набора данных проверки. .
Строка 12: удаление значений NaN
Значения NaN не принимаются в модели.
Строки 14–18: Подготовка наборов данных для обучения и тестирования
Наборы данных для поездов и тестов имеют функции, которые мы кратко перечислили в разделе «Предварительная обработка I». Кроме того, набор данных для поездов должен также содержать функции задержки. < br /> Notice trainY содержит уменьшенные значения цен открытия, а testY содержит фактические значения.
Почему?
Модель обучается с нормализованными значениями во избежание смещения. Для точного расчета показателей точности, таких как MAPE, RMSE, измененные значения прогноза сравниваются с фактическими (не уменьшенными) значениями testY.
Строки 20–22: массивы N предыдущих значений
Скоро вы поймете, почему это было необходимо! Однако пока помните, что мы должны сообщить нашей модели, что эти N значений будут иметь важное значение для определения прогнозируемого (N + 1) значения.
Обучение модели: шаг 2
В строках 3–8 показано, как модель вызывается и подгоняется к набору обучающих данных, созданному в разделе Обучение модели: шаг 1.
imp_features возвращает оценки важности функции на основе обученной модели прогнозирования. Эта статья прекрасно описывает, как интерпретировать эту переменную.
Обучение модели: шаг 3
Эта функция составляет основу рекурсивного прогнозирования. Вы, наконец, узнаете, как использовать значения N для получения наилучшего прогноза.
Строка 5 повторяется каждый день в наборе H дней. Каждый день прогнозируется независимо с использованием модели, которую мы использовали в разделе «Обучение набора данных: шаг 2».
Помните, что наша модель была обучена с набором данных, который также имел функции запаздывания. Эта функция помогает нам создавать эти функции задержки для даты тестирования и отправляет их в модель (строка 13) для получения прогноза.
Как создаются функции запаздывания?
Для каждого дня в строке 6 создается переменная прогноз_scaled, которая состоит из уменьшенных значений N дней, непосредственно предшествующих дню прогнозирования. (Обратите внимание, что на первой итерации это не что иное, как prev_values, которые мы создали в разделе «Обучение модели, шаг 1»).
Строка 8 создает копию i-й строки набора данных, где i - это временная метка, для которой мы хотим спрогнозировать начальное значение. Строка 10 создает имена столбцов задержки. Эти столбцы добавляются в набор данных с соответствующими значениями. Прогноз переменной обновляется на каждой итерации (строка 15), поэтому каждый раз мы получаем предыдущие N значений в файле прогноз_scaled.
Этот прогноз масштабируется и добавляется к прогнозу массива NumPy (строки 14–15). Возвращаются последние значения H прогноза массива NumPy, потому что это дни, которые были предсказаны.
Прогноз
В соответствии с определенными выше функциями прогнозирование курса акций может осуществляться с помощью:
predictions, mape_net, mae_net, rmse_net, features_importance = train_model(train_val, train_size, horizon, N_final, features, features_lag, n_estimators, max_depth, validation.shape[0])
Заключение
Эта статья дает вам представление о том, как использовать XGBoost для прогнозирования временных рядов. Спасибо Ибиню Н.Г. за его прекрасную статью здесь, которая прояснила наши концепции.
Не стесняйтесь обращаться, если вы думаете, что мы ошиблись.
Этот блог написал Никита Саксена.