Анализ движения цен акций - одна из основных областей изучения алгоритмов торговли. Хотя никто в этом мире не может предсказать цены акций в следующий момент с абсолютной 100% точностью, модель изменения курса акций по-прежнему остается одним из основных интересов многих инвесторов.

В этой статье я собираюсь представить пошаговое руководство по построению модели случайного леса для прогнозирования процентного изменения курса акций с использованием библиотеки Python Scikit-Learn. Цель состоит в том, чтобы показать некоторые основные идеи прогнозирования цен на акции с помощью машинного обучения. Это делается путем демонстрации общего конвейера машинного обучения, который показывает весь процесс сбора, обработки, моделирования и оценки данных о запасах.

Отказ от ответственности

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

Необходимые библиотеки Python

  1. yFinance - https://pypi.org/project/yfinance/
  2. ta-lib - https://pypi.org/project/arch/
  3. scikit-learn - https://scikit-learn.org/stable/
  4. Matplotlib - https://matplotlib.org/
  5. Numpy - https://numpy.org/
  6. Панды - https://pandas.pydata.org/

Примечание. Настройка ta-lib в Windows немного сложна, поскольку требует ручной установки некоторых зависимостей. Чтобы упростить себе работу, вы можете попробовать загрузить файл whl с этого неофициального сайта, а затем использовать команду pip install для установки файла whl на свой компьютер. (Этот метод установки мне подходит)

Github

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

Прогнозирование процентного изменения цены акций

1. Сбор данных о запасах

Мы будем использовать библиотеку с открытым исходным кодом yFinance для получения данных о ценах на акции от Yahoo Finance. Здесь мы собираемся загрузить в наш скрипт цены на акции Google.

Строка 1–9: Импортируйте все необходимые библиотеки.

Строка 12–13. Назначьте символ тикера Google (googl) переменной тикера, а затем используйте метод yFinance download для получения цены акции. данные с 4 января 2016 года по 12 мая 2021 года.

Мы получим данные о запасах, как показано ниже:

Возвращенные данные о запасах от yFinance хранятся в формате фрейма данных Pandas.

2. Визуализация исторического движения цен на акции.

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

Строка 1–3. Постройте линейный график скорректированных цен закрытия с течением времени.

Из линейного графика видно, что цена акций Google в 2021 году оценивается примерно в 300% в 2016 году.

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

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

Из гистограммы мы можем наблюдать, как процент изменения цены в основном находится в диапазоне от -0,01% до 0,01%.

3. Разработка функций

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

Мы будем использовать некоторые встроенные методы фрейма данных и библиотеки ta-lib для создания переменных-предикторов и целевых переменных для машинного обучения.

3.1 Переменные-предикторы

Давайте начнем с использования библиотеки ta-lib, чтобы получить скользящую среднюю и RSI для наших цен на акции за 14, 30, 50 и 200 дней.

Строка 1: создайте пустой список для хранения названий функций.

Строка 2–4: в цикле for используйте методы библиотеки ta-lib SMA и RSI для вычисления SMA-14, SMA-30, SMA-50 и SMA-200, а также RSI-14, RSI-30, RSI-50 и RSI-200.

Строка 6: добавьте имена переменных скользящего среднего и RSI в список feature_names.

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

3.2 Целевая переменная

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

Когда мы устанавливаем параметр -5 в методе shift, значения цен будут сдвинуты вперед на следующие 5 индексов. После этого мы устанавливаем параметр 5 для метода pct_change, мы получим процент изменения будущей цены закрытия за 5 дней.

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

4. Разделение данных на обучающий и тестовый набор.

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

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

Строка 1: используйте метод dropna, чтобы удалить все нулевые значения из фрейма данных.

Строка 3–4: используйте список feature_names, чтобы извлечь все столбцы переменных-предикторов из фрейма данных stock_data и назначить их переменной X . Извлеките процентный столбец 5-дневной будущей цены закрытия и присвойте его переменной y.

Строка 6: установите размер обучения на 85% от всего набора данных.

Строка 7–8: Назначьте первые 85% значений характеристик и целевых значений для X_train и y_train соответственно.

Строка 9–10: Назначьте последние 15% значений функции и целевых значений параметрам X_test и y_test соответственно.

5. Обучение модели случайного леса.

Прежде всего, нам нужно найти оптимальный параметр для нашей модели случайного леса. Мы можем использовать scikit-learn ParameterGrid, чтобы определить лучший набор параметров для обучения нашей модели случайного леса.

Строка 1–2: задайте словарь параметров, которые мы собираемся настроить для нашей модели случайного леса. Создайте пустой список для хранения результатов теста значений для различных наборов параметров.

Строка 4: Создайте объект scikit-learn RandomForestRegressor.

Строка 6–9: Используйте цикл for для перебора значения параметра в словаре сетки, а затем примените набор параметров к модели случайного леса с помощью метода set_params и соответствовать модели с обучающим набором, X_train & y_train. Получите набор тестов в метод score, и полученный результат добавляется в список test_scores.

Строка 11–12: Используйте метод NumPy argmax, чтобы получить индекс наивысшего результата теста из списка, а затем используйте индекс для отображения лучшего результата теста и набора параметров. .

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

6. Оценка модели

На этом этапе мы обучили модель случайного леса для прогнозирования процентного изменения курса акций. Мы собираемся оценить модель, используя три общих показателя для регрессора: средняя абсолютная ошибка (MAE), среднеквадратичная ошибка (MSE) и среднеквадратичная ошибка (RMSE).

Строка 1–3: Используйте модуль scikit-learn metrics для расчета MAE, MSE и RMSE, а затем распечатайте их.

Результаты трех показателей производительности приведены ниже:

Наконец, мы пытаемся посмотреть на влияние каждой переменной-предиктора, которая влияет на прогноз модели. Это делается путем построения диаграммы важности функций.

Строка 1–2. Используйте встроенный в модель атрибут feature_importances_, чтобы получить значения воздействия для каждой переменной-предиктора и расположить их в порядке убывания с помощью argsort метод.

Строка 3–7. Создайте значения оси X из списка feature_name в соответствии с отсортированным индексом. Постройте гистограмму, чтобы показать важность функции в порядке убывания.

Из приведенной выше диаграммы важности функций мы можем узнать, что RSI-100, MA-200 и MA-50 показывают наибольшую степень влияния на результат прогнозирования нашей модели случайного леса.

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

Заключение

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

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

использованная литература

  1. Https://stackabuse.com/random-forest-algorithm-with-python-and-scikit-learn/
  2. Https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html

Больше контента на plainenglish.io