Мы проверяем, достаточно ли мощны технологии, чтобы раскрыть тайну финансовых рынков.

При правильном и разумном инвестировании фондовый рынок США может принести удивительную прибыль. Следуя примеру компаний, занимающихся количественными инвестициями, таких как Two Sigma и Citadel, мы заинтересованы в том, чтобы узнать, можем ли мы использовать машинное обучение для прогнозирования движения цен на акции.

Примечание редакторам Data Science. Хотя мы разрешаем независимым авторам публиковать статьи в соответствии с нашими правилами и рекомендациями, мы не поддерживаем вклад каждого автора. Не стоит полагаться на работы автора без консультации с профессионалами. См. Подробности в наших Условиях для читателей.

Данные

Мы использовали Alpha Vantage API для получения ежедневных ценовых данных для пяти ETF (QQQ, TQQQ, VTI, IWM, SPY) и начали только с открытия, максимума, минимума, закрытия и объема.

Генерация функций

Мы решили вручную создать функции на Python для расчета нескольких часто используемых в торговле технических индикаторов: Chaikin A / D, BBAND, CCI, EMA, MACD, OBV, RSI, SMA и STOCH.

Простая скользящая средняя

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

Экспоненциальная скользящая средняя

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

Схождение скользящих средних и расхождение

Дивергенция схождения скользящих средних (MACD) - это разница между двумя экспоненциальными скользящими средними. Линия сигнала - это экспоненциальная скользящая средняя MACD.

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

Периоды времени для MACD часто задаются как 26 и 12. Однако функция фактически использует экспоненциальные константы 0,075 и 0,15, которые ближе к периодам 25,6667 и 12,3333. Чтобы создать аналогичный индикатор с временными периодами, отличными от тех, которые встроены в MACD, используйте функцию Price Oscillator.

Стохастический осциллятор

Осциллятор стохастик измеряет, где находится закрытие по отношению к недавнему торговому диапазону. Диапазон значений от нуля до 100.% значений D выше 75 указывают на состояние перекупленности; значения ниже 25 указывают на состояние перепроданности. Когда быстрый% D пересекает медленный% D, это сигнал на покупку; когда он пересекает нижнюю границу, это сигнал на продажу. Необработанный% K обычно считается слишком неустойчивым, чтобы использовать его для сигналов кроссовера.

Линия накопления / распределения

Линия накопления / распределения аналогична балансовому объему (OBV), который суммирует объем, умноженный на + 1 / -1, в зависимости от того, было ли закрытие выше предыдущего закрытия. Однако индикатор накопления / распределения умножает объем на значение близкого местоположения (CLV). CLV основан на движении выпуска в пределах одного бара и может составлять +1, -1 или ноль.

Линия накопления / распределения интерпретируется путем поиска дивергенции в направлении индикатора относительно цены. Если линия накопления / распределения имеет восходящий тренд, это означает, что цена может последовать за ней. Кроме того, если линия накопления / распределения становится плоской, в то время как цена все еще растет (или падает), это сигнализирует о надвигающемся выравнивании цены.

Полосы Боллинджера

Полосы Боллинджера состоят из трех линий. Средняя полоса - это простая скользящая средняя (обычно 20 периодов) типичной цены (TP). Верхняя и нижняя полосы - это стандартные отклонения F (обычно 2) выше и ниже средней полосы. Полосы расширяются и сужаются, когда волатильность цены выше или ниже, соответственно.

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

Балансовый объем

Балансовый объем (OBV) - это совокупная сумма увеличения и уменьшения объема. Когда закрытие выше, чем предыдущее закрытие, объем добавляется к промежуточной сумме, а когда закрытие ниже, чем предыдущее закрытие, объем вычитается из промежуточной суммы.

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

Данные после создания признаков

Наша гипотеза

Изначально мы хотели построить единую модель, используя данные из всех ETF (QQQ, TQQQ, SPY, VTI, IWM), чтобы предсказать долгосрочный ценовой тренд для акций, торгуемых на бирже. Мы устанавливаем метку как 1, если возврат через 20 торговых дней в будущем ›3%, и 0 в противном случае.

Однако мы обнаружили, что данные по каждому ETF сильно различаются, поэтому мы решили, что нам нужно построить отдельные модели для каждого ETF. В итоге мы использовали только набор данных QQQ ETF для построения нашей модели.

Эксперимент 1 (доходность за 20 дней> 3% на этикетке)

LSTM: тест AUC 0,476

Нейронная сеть MLP: тест AUC 0,577

Случайный лес: тест AUC 0,917

Слишком хорошо, чтобы быть правдой - ложная надежда

Наша лучшая модель с использованием набора данных QQQ дала нам AUC 0,917. Мы думали, что нашли способ предсказывать фондовый рынок. Однако этого не произошло, поскольку мы обнаружили серьезный недостаток нашей модели.

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

Для нашей следующей модели мы использовали данные с 2010 по 2016 год в качестве обучающего набора и данные с 2017 по 2019 год в качестве тестового набора. Это разделение распределения также полезно, потому что оно в основном позволяет нам «смоделировать», как наша модель будет поступать с будущими данными.

К сожалению, с этой моделью показатель AUC значительно упал до 0,44 с тем же классификатором случайного леса.

Случайный лес: тест AUC 0,440

Переосмысление распространения этикеток

Как вы можете видеть в нашем примере набора данных здесь, все эти строки имеют очень похожие 20-MA, открытые и закрытые. Если через 20 дней после 1/4/2019 будет рост ›3%, то в дни около 1/4/2019 также будет рост› 3%, и это верно для любых акций, определяющий фактор в повышении цен на этикетке. через 20 дней вообще не решился на 20 день. Он определяется в днях, когда записи имеют перекрывающиеся периоды в своих 20 будущих торговых периодах. В этом случае, если мы извлечем 1/6/2019 из набора тестов и обучим остальную часть, модель обязательно присвоит тестовым данным метку, равную единице, потому что все ее функции аналогичны датам вокруг это которые образуют кластер. Другая проблема с этим подходом заключается в том, что, как указывалось ранее, модель позволяет обучающему набору использовать будущие данные для прогнозирования. Например, обучающий набор включал 07.01.2019 - 01.11.2019, чтобы предсказать 06.01.2019, что невозможно сделать в реальном мире.

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

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

Эксперимент 2 (повышение / понижение цены на следующий день на этикетке)

1. TPOT

Ссылки:

https://towardsdatascience.com/tpot-automated-machine-learning-in-python-4c063b3e5de9

https://epistasislab.github.io/tpot/using/

TPOT - это пакет Python для AutoML с открытым исходным кодом, в котором реализовано множество различных комбинаций разработки функций и выбора модели. TPOT автоматически создает множество конвейеров, которые включают различные способы проектирования функций (PCA, MaxAbsScaler, MinMaxScaler и т. Д.), А также различные модели с различными сочетаниями гиперпараметров.

Производительность TPOT сильно зависит от количества конвейеров и времени, которое вы позволяете ему запускать. Общее количество конвейеров равно POPULATION_SIZE + GENERATIONS x OFFSPRING_SIZE, которое можно определить в параметрах TPOT.

Поскольку мы позволили TPOT запустить только 150 конвейеров, что заняло менее 15 минут, производительность не идеальна: ТЕСТ AUC 0,509. Однако при наличии достаточного времени (десятки часов или даже дней) TPOT может стать очень мощным и простым инструментом для получения отличных результатов.

Кроме того, TPOT автоматически сохраняет лучший конвейер, по которому выполнялся поиск, и позволяет пользователям экспортировать эти результаты в виде файла .py. Как видите, в нашем случае TPOT выполнил PCA на наших данных и выбрал GaussianNB как лучшую модель классификации.

2. XGBoost

Используя XGBClassifier, нам не нужно было настраивать ничего, кроме скорости обучения, максимальной глубины, n_estimators и подвыборки. Используя перекрестную проверку и оценку AUC, мы оптимизировали гиперпараметры. Наконец, мы использовали оптимизированные гиперпараметры, чтобы создать окончательную модель для X_train и y_train. Точность (не AUC) на тестовом наборе составила 50,5%.

С XGBClassifier мы получаем оценку AUC тестового набора 0,478.

3. Случайный лес

Используя классификатор случайного леса, мы настроили гиперпараметры для диапазона значений с помощью грубой силы перекрестной проверки поиска по сетке. Лучшие параметры показаны с max_depth = 3 и min_samples_leaf = 3.

С помощью этого классификатора случайного леса мы получаем оценку AUC тестового набора 0,519.

4. Google AutoML

С ростом популярности AutoML мы решили ввести наш набор данных в Google Cloud AutoML, чтобы посмотреть, сможет ли он предсказать лучший показатель AUC, чем мы. Google AutoML имеет очень удобный интерфейс, который автоматически выводит некоторую статистику после загрузки набора данных.

В проектах классификации, подобных нашему, Google AutoML позволяет пользователям выбирать различные показатели производительности для оптимизации окончательной модели.

Так как же появился Google AutoML? Всего после одного часа тренировки AUC составила 0,529, что является самым высоким показателем в нашем процессе. Важно отметить, что AUC со случайным лесом достигает 0,519, что всего на 0,01 ниже, чем у Google AutoML.

Заключение и выводы

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

  1. Удаление твитов: анализ тональности твитов
  2. Стенограммы телефонных звонков: анализ тонов руководителей во время телефонных звонков; оценивать темы, обсуждаемые руководителями / аналитиками
  3. Спутниковые данные (спутниковые изображения нефтяных скважин потенциально могут быть использованы для прогнозирования цен на нефть)

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

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

Авторы

Джозеф Чин, UT Остин MSBA ’20: j [email protected]

Хао Лун Колин Чу, UT Остин MSITM ’20: [email protected]

Wilshire Liu, штат Юта, Остин, MSITM ’20: [email protected]

Брайан Смит-Эйчс, штат Юта, Остин, MSITM ’20: [email protected]

Zhuo Wen, UT Austin MSITM ’20: [email protected]