Обзор

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

Профессиональные биржевые трейдеры тратят много лет на изучение графических моделей и используют различные точки данных и показатели для прогнозирования движения акций. Пытаясь автоматизировать это, я применил традиционные индикаторы торговли акциями (индекс относительной силы, AROON, индекс денежного потока и индекс направления движения) и соединил их вместе, чтобы создать моментальный снимок биржевой диаграммы. Я сузил область своего анализа до компаний S&P 500, что составило примерно 3 ГБ необработанных данных. Чтобы получить чистый и обучаемый набор данных, мне нужно было создать конвейер для систематического преобразования неорганизованных дневных значений акций в месячные временные рамки и создания различных снимков биржевых диаграмм, которые будут использоваться для обучения нейронной сети.

У меня было три классификатора прогнозов: доход, убыток и нейтральный с балансом 41,13% прироста, 27,32% убытков и 31,55% нейтралов. Я включил нейтральный классификатор в попытке компенсировать обычные графические модели рыночной волатильности. Если бы я разделил графические паттерны только на прибыль и убыток, прибыль в 0,3% была бы неотличима от убытка в -0,3% и была бы классифицирована по-другому, что снизило бы точность модели.

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

Анализ

Ниже приведены технические индикаторы, которые я использовал, и их определения:

  • Скорректированная дневная цена закрытия: цена акции на момент закрытия рынка.
  • Индекс относительной силы (RSI): индикатор импульса, используемый для измерения величины недавних ценовых изменений для оценки условий перекупленности и перепроданности.
  • Индикатор AROON: измеряет, насколько недавними были последние максимумы и минимумы, и используется для определения силы тренда. Для этого у него есть два индикатора (AROON up и AROON down) для измерения недавних максимумов и недавних минимумов. Чтобы объединить в одно изображение, я взял AROON вверх минус ARRON вниз и разделил их, чтобы создать осциллятор между -1 и 1.
  • Индекс денежного потока (MFI): индикатор, который использует как данные о цене, так и данные об объеме для определения условий перекупленности или перепроданности. MFI имеет диапазон от 0 до 100, где значение, близкое к 0, указывает на состояние перепроданности, а значение, близкое к 100, указывает на состояние перекупленности.
  • Индекс направленного движения (DX): скользящая средняя расширения диапазона цены акции за период (14 дней). Когда DMI положительный, это указывает на сильное движение цены в положительном направлении, а когда он отрицательный, это указывает на сильное движение цены в отрицательном направлении. Метрика является вычитанием обоих.

Эти индикаторы были сшиты вместе, чтобы сформировать один снимок с 5 квадрантами, содержащими индикатор Daily Adjusted Close (верхний синий), RSI (оранжевый), индикатор AROON. (зеленый), MFI (красный) и DX (нижний синий). Ниже приведены примеры моментальных снимков прибыли (вверху) и убытка (внизу) и того, как биржевой трейдер может их интерпретировать.

Анализ диаграммы усиления

Скорректированное дневное закрытие (верхний синий) берется в процентах для масштабирования со всеми акциями и объединяется для описания данных за полный месяц. График сохраняет свою восходящую траекторию, не опускаясь ниже каких-либо ключевых уровней поддержки. Индекс относительной силы (оранжевый) немного выше среднего, что может указывать на уровни перекупленности, если он поднимется до 70+ уровней, но в настоящее время он стабилен и может указывать на дополнительное покупательское давление. Индикатор AROON (зеленый) представляет собой чистое вычитание AROON вверх и AROON вниз, поэтому его уровень, близкий к +1, указывает на постоянное покупательское давление и недавние максимумы. MFI (красный) устойчив и указывает на нормальные условия (ни перекупленности, ни перепроданности). Наконец, индикатор DX (Bottom Blue) растет, что указывает на положительное направленное движение.

Анализ диаграммы убытков

Скорректированное дневное закрытие (синяя вершина) начинает формировать нисходящую траекторию, в то же время неоднократно направляясь к более низкому уровню поддержки, когда цена пытается подняться. Это может означать, что давление продавцов преодолевает давление покупателей. Индекс относительной силы (оранжевый) немного ниже среднего, что указывает на большее давление со стороны продавцов, но относительно незначительное. Индикатор AROON (зеленый) близок к -1, что указывает на постоянное давление продавцов и недавние минимумы. MFI (красный) немного снижается и слегка подтверждает дополнительное давление со стороны продавцов. Индикатор DX (Bottom Blue) крайне низок, что указывает на движение в отрицательном направлении.

Методология

Создать биржевой список S&P 500

  1. Получите список, содержащий тикеры компаний из индекса S&P 500, из Википедии с помощью BeautifulSoup и запросов через веб-скрейпинг HTML.

Тикер-список хранится в виде файла рассола и содержит 505 компаний.

Получить биржевые данные из Alpha Vantage

Alpha Vantage предоставляет один из самых надежных и обширных API-интерфейсов для акций и криптовалют. Чтобы воспользоваться их бесплатным уровнем, я создал собственный скрипт, чтобы ограничить мои запросы API до 5 запросов в минуту. Учитывая, что в списке S&P 500 505 компаний, выполнение скрипта займет примерно 9 часов. Из-за вычислительных ограничений моей личной машины при обработке такого большого объема данных я использовал модуль Tqdm в качестве отслеживания прогресса и реализовал вторичный скрипт для возобновления прогресса в случае сбоя исходного скрипта.

2. Создайте автоматический скрипт для просмотра списка тикеров S&P 500.

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

Теперь у нас есть список компаний S&P 500 и соответствующие им фреймы данных, размещенные в нашем каталоге.

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

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

5. Запустите эту функцию для каждого месяца 505 компаний.

6. Переместите изображения в Google Colab и убедитесь, что данные сбалансированы. Нам нужно убедиться, что наборы обучающих данных представляют собой одну и ту же часть, иначе в наших результатах может быть предвзятость. Например, если бы вместо этого у меня было 70% усиления, 20% потерь и 10% нейтральности в моем наборе изображений, нейронная сеть будет знать, что большинство данных являются выигрышами, и будет предвзята к предположению, что случайное изображение является выигрышем. .

7. Обучите модель на графическом процессоре Google Colab.

*ResNet34 от Pytorch.

Результаты и оценка модели

В общей сложности для этого проекта было использовано 59 043 изображения, из которых 80 % использовались в качестве обучающего набора, а 20 % — в качестве тестового (47 235 обучающих и 11 808 тестовых). У меня было три классификатора (прибыль, нейтральность и потеря) с балансом 41,13% прибыли, 27,32% потерь и 31,55% нейтральности.

Я использовал четыре эпохи для обучения модели. Результаты ниже с вероятностью успеха 64,63%.

После обучения на 47 235 изображениях модель использует оставшиеся 11 808 для проверки своей точности. Результаты ниже:

В тестовом наборе было 5186 изображений с усилением. Модель правильно предсказала 3568, что соответствует точности 68,8%.

В тестовом наборе было 3366 изображений потеря. Модель правильно предсказала 2208, что соответствует точности 65,59%.

В тестовом наборе было 3256 нейтральных изображений. Модель правильно предсказала 1885, что соответствует точности 56,69%. Это имеет смысл, поскольку нейтральная категория колеблется от -5% до 5%, что могло предоставить противоречивую информацию для модели.

Из-за добавления нейтральной категории модель на самом деле показала себя лучше, чем указанные выше 64,63%.

Вывод

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

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

Этап предварительной обработки данных оказался более сложным и трудоемким, чем я ожидал. Необработанные данные акционерной компании от Alpha Vantage содержали противоречивые показатели, ежедневные цены, которые необходимо было масштабировать, и даты, которые не были классифицированы. Конвейер, который я разработал, должен был выполнять множество сложных вычислений и манипуляций со словарями.

Было очень приятно увидеть точность результатов моей обученной модели. Учитывая выбор прироста акций, нейронная сеть имеет вероятность 68,81% быть правильной и получить более 5%, 9,87% - потерять более 5% и 21,32% - получить от -5% до +5%. . Я рад продолжать улучшать его и создавать успешную систему рекомендаций по акциям.

Улучшение

В будущем я хочу улучшить этот проект, создав несколько моделей CNN, которые будут голосовать за направление движения акций. Моя текущая модель ориентирована на 30-дневный период на основе 5 индикаторов. Я хотел бы создать другую модель, которая фокусируется на другом наборе индикаторов и, возможно, расширяет линию тренда до 6 месяцев. Затем я бы попросил каждую из моих моделей проголосовать. Это было бы аналогично биржевому трейдеру, который видит интересную линию тренда на месячном таймфрейме, а затем проводит еще один анализ той же акции на 6-месячном таймфрейме.

Еще одно улучшение, которое я хотел бы сделать, — переобучить мою модель, чтобы иметь больше баланса в данных. Мое текущее соотношение обучающих изображений составляет 41,13% прироста, 27,32% потерь и 31,55% нейтралов, но чем ближе я смогу подобраться к равному распределению между тремя классификаторами (33,33%), тем более сбалансированными будут данные.

Я добавил нейтральный классификатор в попытке смягчить белый шум обычной рыночной волатильности на графиках акций. Однако этот классификатор стал смесью как положительных, так и отрицательных приростов, что сбивало с толку нейронную сеть, поскольку увеличение на 4,9% будет классифицироваться так же, как снижение на -4,9% (мой порог был 5%). Я хотел бы найти решение, которое удаляет нейтральный классификатор, сохраняя при этом тот же порог точности для прибылей и убытков.