Обзор проекта

На цену акций влияет множество факторов. В результате цена акций очень изменчива. За исключением некоторых профессиональных трейдеров или тех, кто владеет инсайдерской информацией, трудно получить прибыль от инвестиций в акции. Тем не менее, в исторических данных о ценах на акции есть некоторые закономерности или тенденции. Прогнозирование цены акций путем анализа закономерностей или тенденций показало определенный успех и широко используется профессиональными трейдерами. (ссылки 1–5) Анализ и прогнозирование облегчаются с развитием методов машинного обучения. (ссылки 6–10) В этом исследовании я разработал алгоритмы машинного обучения для прогнозирования индекса S&P500. Затем разработанные алгоритмы использовались для прогнозирования будущего фондового индекса S&P500. Алгоритмы машинного обучения включают XGBoost, метод опорных векторов и нейронную сеть.

Постановка задачи

Индекс S&P500 отражает общую производительность фондового рынка 500 крупных компаний. Цена акции зависит от многих факторов. Некоторые из них связаны с финансовыми показателями или технологическим прогрессом компании. Другие факторы, такие как процентные ставки, электронные результаты, мировые события, слухи, также могут влиять на цену акций. (ссылки 11–12) На практике прогнозирование цены акций путем анализа выручки, прибыли, темпов роста и других финансовых ситуаций компании называется фундаментальным анализом. Прогнозирование цены акций, основанное на прошлой модели цены акций компании, называется техническим анализом. (ссылки 13–15) Технический анализ продемонстрировал частичный успех, поскольку прошлый паттерн цены акций уже отразил все факторы, которые могут повлиять на цену. Совсем недавно с использованием методов машинного обучения были разработаны гибридные алгоритмы, которые сочетают в себе технический анализ и данные о настроениях рынка. (ссылки 18–20) В рамках этого исследования я сосредоточусь на техническом анализе с использованием методов машинного обучения. Алгоритмы машинного обучения включают XGBoost, метод опорных векторов и нейронную сеть.

Показатели

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

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

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

Исследование данных

Исторические данные индекса S&P500 за период с 2015–11–09 по 2018–11–09 были загружены в виде файла .csv с Yahoo Finance. Первые 5 строк индекса показаны в таблице 1. На каждую дату в индексе есть записи Open, High, Low, Close, Adj Close и Volume. Данные довольно чистые без значений NaN. Для простоты я предсказал только индекс закрытия. Кроме того, я заметил, что значения в столбцах Close и Adj Close идентичны. Поэтому я проигнорировал столбец Adj Close в анализе.

На рис. 1 показан индекс Close по количеству дней, прошедших с даты начала (2015–11–09). Мы можем видеть общую восходящую тенденцию с взлетами и падениями в определенные периоды. Максимальный индекс равен 2930,75, а минимальный — 1829,08.

Алгоритмы и методы

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

XGBoost

Повышение — это ансамблевый метод, при котором новые предикторы последовательно добавляются к существующим моделям до тех пор, пока не станет возможным улучшение. Gradient Boosting — это подход, который пытается подогнать новые предикторы к остаточным ошибкам, сделанным предыдущими предикторами. XGBoost — это реализация Gradient Boosting. XGBoost заслужил популярность во многих соревнованиях по науке о данных, включая прогнозирование цен на акции, благодаря своей скорости и производительности. XGBoost имеет множество гиперпараметров для установки. Гиперпараметры можно разделить на 3 категории:

  • общие параметры

бустер [по умолчанию=gbtree]

тихо [по умолчанию=0]

nthread [по умолчанию максимальное количество доступных потоков, если не установлено]

  • параметры бустеров

eta [по умолчанию = 0,3, псевдоним: Learning_rate]

min_child_weight [по умолчанию = 1]

максимальная_глубина [по умолчанию = 6]

гамма [по умолчанию=0]

max_delta_step [по умолчанию = 0]

подвыборка [по умолчанию=1]

colsample_bytree [по умолчанию = 1]

colsample_bylevel [по умолчанию = 1]

лямбда [по умолчанию=1]

альфа [по умолчанию=0]

scale_pos_weight [по умолчанию = 1]

  • параметры задачи обучения

цель [по умолчанию=reg:linear]

eval_metric [по умолчанию в соответствии с целью]

семя [по умолчанию=0]

Я использовал общие параметры по умолчанию и параметры задачи обучения, настроил несколько параметров бустера, включая «eta», «min_child_weight», «max_depth», «subsample», «colsample_bytree» и «learning_rate».

СВР

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

ядро [по умолчанию = 'rbf']

степень [по умолчанию=3]

гамма [по умолчанию = 'авто']

коэф0 [по умолчанию=0.0]

тол [по умолчанию=1e-3]

С [по умолчанию = 1,0]

Эпсилон [по умолчанию = 0,1]

Сжатие [по умолчанию = True]

cache_size [по умолчанию = 200]

подробный [по умолчанию = False]

max_iter [по умолчанию=-1]

Я настроил гиперпараметры ядра и C в процессе проверки и использовал значения по умолчанию для других гиперпараметров.

ФНН

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

Схема указанной выше конструкции БНС показана на рис. 2.

Для трех вышеуказанных алгоритмов гиперпараметры были изменены в процессе проверки с использованием метода поиска по сетке. Поскольку набор данных индекса S&P 500 представляет собой данные временного ряда, разделение данных для обучения и проверки не должно назначаться случайным образом. Вместо этого для процесса перекрестной проверки использовалась функция Time SeriesSplit(), чтобы ограничить предвзятость в данных временных рядов.

Эталон

Я использовал модель постоянства для теста. Модель постоянства не делает ничего, кроме смещения значения индекса на 1 день. Обучение входных данных не требуется. Например, сегодняшнее значение индекса равно 2000. Используя модель постоянства, я предсказываю, что завтрашнее значение индекса будет равно 2000. В результате шаблон прогнозируемого индекса по модели постоянства идентичен реальному индексу, за исключением смещения по оси X. , как показано в таблице 2 и на рис. 3.

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

Предварительная обработка данных

Первое, что нужно сделать, это сдвинуть индекс в столбцах Open, High, Low, Close и Volume на день и сохранить в новые столбцы с именами open, high, low, close и volume соответственно. Кроме того, я исключил столбцы Open, High, Low и Volume для последующего анализа. Это похоже на модель постоянства. Предполагается, что прогноз индекса следующего дня основан на доступной информации за день до следующего дня. Кроме того, я добавил больше возможностей к исходным данным. Особенностями являются некоторые технические индикаторы, которые часто использовались профессиональными трейдерами. Используются 4 индикатора: индекс относительной силы (RSI), простая скользящая средняя (SMA), параболическая остановка и разворот (SAR) и индекс среднего направленного движения (ADX). Определения четырех индикаторов приведены в таблице 3.

Новые входные данные имеют значения NaN после расчета показателей. Я просто удалил записи со значениями NaN.

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

Реализация

Для реализации всех трех алгоритмов я использовал один и тот же тип потока, как показано на рис. 4. 90% входных данных использовались для обучения, а 10% — для тестирования. Столбец «Закрыть» — это «y», а другие столбцы — «X». В каждом процессе проверки использовался счетчик mean_squared_error. Гиперпараметры, используемые для настройки, перечислены в разделе «Алгоритмы и методы». Для каждого алгоритма машинного обучения использовался поиск по сетке, чтобы найти наилучшую комбинацию гиперпараметров. Поскольку входными данными являются данные временного ряда, для перекрестной проверки использовался метод TimeSeriesSplit(). Для процесса перекрестной проверки использовалось 5 расщеплений. Для прогнозирования индекса использовалась лучшая оценка для алгоритма машинного обучения. Результаты прогнозирования оценивались с помощью MSE по сравнению с реальным масштабированным индексом Close. Также была построена кривая, показывающая качественную разницу между предсказанным и реальным индексом для каждого алгоритма.

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

Удобно, что был доступен метод TimeSeriesSplit(). Мне нужно только передать его методу поиска по сетке.

Поскольку в одном файле ipython существует множество переменных, реализация кода менее удобочитаема и более подвержена ошибкам. Я пытался использовать разные имена переменных для каждого алгоритма машинного обучения. Если проект предназначен для моего собственного использования, я бы разделил каждый алгоритм с другим файлом ipython. Или я попытаюсь собрать их, используя метод scipy.optimize.minimize для следующей версии реализации. Для представленного файла ipython я удалил реализацию метрик с использованием MAE, так как реализация очень похожа на метрику с использованием MSE.

Уточнение

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

  • Для СВР,
  1. Использование линейного ядра дает более высокую производительность, чем использование ядра rbf. Среднее значение MSE составляет ~ 0,0046 и ~ 0,14 с использованием линейного ядра и ядра rbf, соответственно, рассчитанных в процессе перекрестной проверки.
  2. Счетчик MAE дает такое же наилучшее сочетание гиперпараметров.
  3. С другой стороны, значение C не влияет на эффективность обучения в этом исследовании.
  • Для ФНН
  1. Лучшая комбинация — 50 эпох и 64 batch_size. Среднее значение MSE перекрестной проверки составляет ~ 0,0294. Вторая лучшая комбинация — использовать 100 эпох и 64 batch_size. Среднее значение MSE составляет ~ 0,00379 в процессе перекрестной проверки.
  2. Оценщик MAE выбрал 100 эпох и размер партии 32.
  • Для XGBoost
  1. Для примерно 50 испробованных комбинаций гиперпараметров результаты были одинаковыми для каждой комбинации. Лучшая комбинация — 0,3 Learning_rate, 0,8 colsample_bytree, 1 min_child_weight, 0,5 subsample, 5 max_depth. Среднее значение MSE составляет 0,1425 в процессе перекрестной проверки.
  2. Оценщик MAE выбрал ту же комбинацию гиперпараметров для наилучшей производительности.

Оценка и проверка модели

Окончательные модели были выбраны в процессе перекрестной проверки поиска по сетке.
Последняя используемая модель SVR:
SVR(C=5, cache_size=200, coef0=0,0, degree=3, epsilon=0,1, gamma='scale', kernel='linear', max_iter =-1, сжатие = True, tol = 0,001, verbose = False)
Используя эту модель, MSE для тестового набора составляет 0,0076. MAE для тестового набора составляет 0,0600.

Окончательная используемая модель FNN:
1 входной слой, 3 скрытых слоя, 1 выходной слой, «нормальный» инициализатор ядра, функция активации «reLu», за исключением того, что выходной слой использовал линейную активацию для регрессии. Оптимизатор был установлен как «адам». Было использовано 50 эпох и размер партии 64. И потеря, и метрическая функция использовали MSE. Окончательная MSE для тестового набора составляет 0,0099, а MAE — 0,0825.

Последняя используемая модель XGBoost:
XGBRegressor(base_score=0,5, booster='gbtree', colsample_bylevel=1, colsample_bytree=0,8, gamma=0, learning_rate=0,3, max_delta_step=0, max_depth=5, min_child_weight=1 ,missing=None, n_estimators=500,n_jobs=1, nthread=None, target='reg:linear', random_state=0, reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None, молчание=True, подвыборка =0,5) Используя эту модель, MSE для тестового набора составляет 0,0210. MAE для тестового набора составляет 0,2421.

Обоснование

Используя эталонную модель постоянства, MSE и MAE для тестового набора составляют 0,0074 и 0,0586 соответственно. В результате модели SVR, FNN и XGBoost уступили эталонной модели. Модель SVR обеспечивает почти такую ​​же производительность, как и эталонная модель. Я попытался удалить столбец «закрыть», чтобы избежать достижения локального минимума, достигнутого моделью постоянства. И тогда тестовая MSE (0,0072) с использованием SVR была немного меньше, чем у модели персистентности. В таблице 4 приведены результаты каждого алгоритма машинного обучения в тестовом наборе.

Заключение

Сравнение прогнозируемого индекса закрытия и индекса закрытия рынка с использованием SVR, FNN и XGBoost показано на рисунках 5, 6 и 7 соответственно. Прогноз, сделанный SVR, почти идентичен модели персистенции, которая представляет собой почти сдвиг кривой индекса по оси X на сутки. С другой стороны, наблюдается явное несоответствие между прогнозируемым индексом по модели XGBoost и реальным индексом. Производительность FNN находится между SVR и XGBoost.

Чтобы оценить надежность окончательных моделей, я проверил предсказанные индексы NASDAQ и Dow Jones. Поскольку индекс S&P500 коррелирует с NASDAQ и Dow Jones, надежная модель должна почти одинаково хорошо предсказывать индексы NASDAQ и Dow Jones. MSE для прогноза каждого индекса показана в таблице 6. Сравнение между прогнозируемыми результатами и рыночными результатами показано на рис.8. Очевидно, что модель SVR является надежной, что приводит к тому же прогнозу, что и модель постоянства. Модель FNN работает достаточно хорошо. Однако результаты прогнозирования могут немного измениться, даже если я снова запускаю обучение и прогнозирование на одном и том же наборе данных. С таким количеством единиц для FNN, я считаю, это неплохо. Но FNN может переборщить с этим исследованием. Модель XGBoost сложно оценить, так как производительность не очень хорошая по всем 3 индексам. Для этой модели необходимы дальнейшие улучшения.

Целью данного исследования является использование алгоритма машинного обучения для прогнозирования будущего (на следующий день) индекса S&P500, предполагая, что индекс может быть предсказан на основе исторических данных. В этом исследовании использовались алгоритмы машинного обучения SVR, FNN и XGBoost. Несколько дополнительных функций (технические индикаторы) были добавлены для разработки более надежного предсказателя индекса. Исторические данные за 3 года, полученные от Yahoo Finance, были разделены на наборы для обучения и тестирования в соотношении 9:1. Алгоритмы обучались на обученных данных. Некоторые из гиперпараметров были определены в процессе перекрестной проверки. В процессе перекрестной проверки использовался метод поиска по сетке, а разделение обучения и проверки было определено с помощью функции TimeSeriesSplit(), чтобы избежать предвзятого отношения. Некоторые другие параметры были выбраны по умолчанию. Наилучшая модель, определенная в процессе перекрестной проверки, использовалась для прогнозирования индекса. Оценка каждого алгоритма измерялась MSE на наборе тестовых данных.

Результат немного разочаровывает, поскольку ни один из продвинутых алгоритмов в этом исследовании, а именно SVR, FNN и XGBoost, не может превзойти эталонную модель (модель постоянства). Модель SVR обеспечивает почти такую ​​же производительность, как и эталонная модель. С другой стороны, неудивительно, что нельзя победить рынок. На самом деле, большинство людей зарабатывают меньше, чем рыночная доходность. (ссылки 16–18) Проект интересен тем, что можно получить некоторую прибыль, если будет разработана хорошая модель. Самое сложное — решить, какие и сколько технических индикаторов использовать. К счастью, для реализации технических индикаторов доступна библиотека Ta-lib.

Будущая работа

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

Кроме того, я хотел бы попробовать другие архитектуры нейронных сетей, такие как LSTM и Q-learning. Эти архитектуры продемонстрировали разумный успех в прогнозировании фондового рынка. (ссылки 21–23). Модель XGBoost также нуждается в значительном улучшении. Я научусь некоторым навыкам для этой модели у победителей Kaggle.

И последнее, но не менее важное: я буду делать более красивые и профессиональные графики, используя другие библиотеки визуализации.

Благодарность

Для реализации я многому научился из
постов Джейсона Браунли на https://machinelearningmastery.com/
постов на www.quantinsti.com/

Справочник

1. https://www.investopedia.com/terms/t/technicalanalysis.asp

2. https://en.wikipedia.org/wiki/Технический_анализ

3. https://en.wikipedia.org/wiki/Stock_market_prediction

4. «https://www.quora.com/Is-it-possible-to-predict-stock-market-trends-from-historical-data-points-If-yes-what-kind-of-algorithms-are -в использовании"

5. https://www.moneycrashers.com/the-best-way-to-invest-fundamental-or-technical-analysis/

6. https://towardsdatascience.com/stock-prediction-in-python-b66555171a2

7. https://www.quora.com/Can-machine-learning-algorithms-models-predict-the-stock-prices-If-yes-what-are-the-best-machine-learning-algorithm-models -предсказать-цену-акции

8. https://epublications.bond.edu.au/infotech_pubs/110/

9. https://www.sciencedirect.com/science/article/abs/pii/S037872060100091X

10. https://ieeexplore.ieee.org/abstract/document/931880

11. https://www.getsmarteraboutmoney.ca/invest/investment-products/stocks/factors-that-can-affect-stock-prices/

12. https://www.investopedia.com/articles/basics/04/100804.asp

13. http://www.businessdictionary.com/article/1104/fundamental-analysis-vs-technical-analysis-d1412/

14. https://www.investopedia.com/university/technical/techanalysis2.asp

15. https://www.moneycrashers.com/the-best-way-to-invest-fundamental-or-technical-analysis/

16. https://www.investopedia.com/ask/answers/12/beating-the-market.asp

17. https://www.thesimpledollar.com/even-the-experts-cant-beat-the-market-why-would-you/

18. https://www.fool.com/investing/2017/09/23/warren-buffett-on-beating-the-stock-market.aspx

19. https://www.researchgate.net/publication/262155335_Machine_Learning_in_Prediction_of_Stock_Market_Indicators_Based_on_Historical_Data_and_Data_from_Twitter_Sentiment_Analysis

20. http://jonathankinlay.com/2016/11/trading-market-sentiment/

21. https://link.springer.com/chapter/10.1007/3-540-46146-9_16

22. https://github.com/filangel/qtrader

23. https://github.com/kh-kim/stock_market_reinforcement_learning