Введение

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

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

Зависимости

0. Код нашего проекта:

Https://github.com/PlatorSolutions/quarterly-earnings-machine-learning-algo

1. Основные зависимости: Python 3.4, Pandas, BeautifulSoup, yfinance, fuzzywuzzy, ntlk

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

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

yfinance - это библиотека Python, которая используется для получения цен на акции из Yahoo Finance.

fuzzywuzzy предоставляет результаты схожести нечеткого текста для создания наших 10-Q различий.

Ntlk позволяет нам разбивать текст отчетов 10-Q на их предложения.

2. Торговый API Альпака без комиссии (https://alpaca.markets/)

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

Интерактивные брокеры

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

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

Думай или плавай от TD Ameritrade

Было ясно, что API ToS намного новее и удобнее в использовании, чем API Interactive Broker. Однако было также ясно, что это не созревшее решение. Хотя мне удалось заставить его работать, даже первоначальный процесс аутентификации для использования API был странным и требовал недокументированной информации, найденной на различных форумах, чтобы заставить его работать. Сами API-интерфейсы исполнения сделок казались простыми в использовании, но письменная документация по ним крайне скудна.

3. Google Cloud AutoML Natural Language

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

Испытания других библиотек машинного обучения. Первоначально я пробовал следующие библиотеки машинного обучения вместе с созданием набора биграмм из текста заявок для использования в качестве набора функций: h2o.ai, Keras, auto-sklearn и AWS Sagemaker. .

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

4. Python-edgar: небольшая изящная библиотека Python для массовой загрузки списков исторических документов SEC (https://github.com/edouardswiac/python-edgar/).

Шаг 1. Загрузите список исторических заявок 10-Q SEC

Для этого мы загрузим и установим python-edgar с https://github.com/edouardswiac/python-edgar/.

Перейдите в каталог с run.py и загрузите архивные документы с помощью следующей команды:

›python run.py -y 2010

Я решил загрузить почти 10-летнюю стоимость (с 2010 года), чтобы построить нашу модель машинного обучения. Вы можете загрузить его вплоть до 1993 года или загрузить меньше, указав другой год.

Как только это будет закончено, мы можем скомпилировать результаты в один мастер-файл:

›cat * .tsv› master.tsv

Теперь используйте квартальный-доход-машинное обучение-algo / download_raw_html.py, чтобы загрузить все необработанные html-документы 10-Q, которые перечислены в только что созданном нами индексе:

›python download_raw_html.py путь / к / master.tsv

Это займет много времени, так как будет загружено много ГБ данных с веб-сайта SEC.gov. Каждая архивация в среднем содержит несколько десятков МБ данных. Когда все будет готово, у нас будет папка "./filings" , содержащая необработанный HTML-код всех документов.

Формат имен файлов: ‹номер CIK› _ ‹тип регистрации› _ ‹дата подачи› _ ‹дата принятия + время› .html

Шаг 2. Очистите опилки

Мы запустим следующую команду из проекта квартального заработка-машинного обучения-алгоритма, чтобы очистить HTML-код от каждой записи в подготовленный текст:

›python filing_cleaner.py

Это будет использовать html-файлы из каталога «filings», созданного на предыдущем шаге, и выводить его в каталог «clean_filings» с очищенными текстовыми файлами.

Выполняется следующая очистка для подготовки текста к обработке естественного языка:

  1. Полоски HTML
  2. Удаляет в основном числовые таблицы, обычно содержащие количественные финансовые данные.
  3. Удалить ссылки
  4. Удаляет пробелы
  5. Удаляет ограниченное количество игнорируемых слов (конкретные даты, числа и т. Д.)
  6. Нормализует текст

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

Формат имен файлов: ‹номер CIK› _ ‹тип регистрации› _ ‹дата подачи› _ ‹дата принятия + время› _ ‹тикер-символ› .txt

Шаг 3. Загрузите финансовые данные

На этом этапе мы загружаем цены открытия фондовой биржи компании за день после каждой подачи заявки в SEC, а затем цену открытия в течение 2 дней после подачи. Мы используем это предварительное изменение цены в качестве целевой метки, которую мы хотели бы спрогнозировать для наших точек данных машинного обучения. Изначально я создал алгоритм для торговли по рыночной цене открытия по сравнению с рыночной ценой закрытия в тот же день. Однако, чтобы использовать это в реальной торговле, потребуется дневная торговая учетная запись, для которой минимум 25000 долларов США может быть недоступен для некоторых читателей.

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

Используйте pip для установки yfinance, если у вас его еще нет до запуска этой команды.

›python add_financial.py

Это считывает имена файлов с символами тикера из каталога cleaned_filings, созданного на предыдущем шаге, и выводит financials.pkl, который представляет собой фреймворк Pandas, содержащий все эти изменения цен на следующий день для каждой регистрации.

Шаг 4. Составьте текстовые дельты квартальных доходов на основе последней отчетности компании за 10 кварталов

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

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

Не забудьте использовать pip для установки зависимостей nltk и fuzzywuzzy перед запуском.

›python diff_cleaned_filings.py

Эта команда берет очищенные текстовые файлы из каталога cleaned_filings и выводит текстовую дельту для каждого очищенного текстового файла в каталоге whole_file_diffs.

Шаг 5. Подготовьте CSV-файл наших обучающих данных для загрузки в Cloud AutoML Natural Language.

Теперь мы возьмем наши очищенные различия 10-Q (обучающие функции) и скомпилируем их в CSV с изменениями их цен на следующий день (обучающие ярлыки). Мы создадим незаметные обучающие метки, разделив изменения цен на 5 сегментов для каждого 20-го процентиля. Таким образом, наша 0 корзина будет иметь нижние 20% (наиболее значительное падение цены), а наша 4 корзина будет иметь верхние 20% (наиболее значительное увеличение цены).

›python cloudml_prepare_local_csv.py

В текущем каталоге будет выведен файл с именем «training_data.csv», который готов к загрузке в Google.

Шаг 6. Загрузите, обучите и оцените нашу модель машинного обучения в Cloud AutoML Natural Language.

Если у вас еще нет учетной записи Google Cloud Platform, вы можете зарегистрироваться здесь: https://cloud.google.com/free/

Если у вас есть учетная запись, мы можем получить доступ к консоли Cloud AutoML Natural Language здесь: https://console.cloud.google.com/natural-language/dashboard

Здесь мы нажмем на «AutoML Sentiment Analysis». Хотя мы не анализируем тональность текста как таковую, мы будем моделировать это как задачу анализа настроений, используя реакцию цен акций в качестве меры «настроения» квартального отчета о прибылях и убытках.

Щелкните «новый набор данных», выберите анализ настроений и установите максимальный балл настроения равным 4, поскольку у нас есть 5-процентные периоды изменения цен, которые мы создали на нашем последнем шаге.

Теперь мы импортируем CSV-файл, который мы создали на последнем шаге, а затем нажмем Импорт. Когда импорт будет завершен, вы получите электронное письмо. Затем вы можете вернуться на панель управления и нажать Поезд. Если у вас возникнут какие-либо проблемы, вы можете обратиться к документации Google здесь: https://cloud.google.com/natural-language/automl/sentiment/docs/

На обучение модели уйдет несколько часов, и мы получим электронное письмо, когда она будет завершена. Затем мы можем проанализировать результаты:

Здесь мы видим итоговую матрицу путаницы для нашей модели. Если вы не знаете, как это интерпретировать, вы можете погуглить «матрицу путаницы». Мы видим, что достигли точности почти 30%, и вспомним в целом, где случайная вероятность должна составлять 20%, поскольку у нас 5 ведер. Это на 50% лучше, чем случайность!

Если мы посмотрим на наши результаты для оценки настроения 0 (помните, что это самый отрицательный 20-й процентиль изменений цен), мы увидим, что получаем лучшую точность. Когда мы используем нашу модель, чтобы предсказать, что квартальный отчет о прибылях и убытках приведет к наиболее резкому падению цен, мы будем правы в 35,63% случаев. Это более чем на 75% лучше случайного!

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

Шаг 7. Загрузите сегодняшние заявки на 10 кварталов, делайте онлайн-прогнозы и начинайте торговать!

Зарегистрируйте аккаунт брокера Альпака, чтобы начать торговать: https://alpaca.markets/

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

После регистрации вам нужно будет получить ключи API из панели управления:

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

Перейдите на вкладку «Тестирование и использование». Щелкните вкладку «Python» в разделе «Используйте вашу пользовательскую модель». Запишите название модели, обведенное черным выше.

Теперь мы можем запустить нашу команду со следующими аргументами командной строки:

›python MakeTrades.py‹ Идентификатор ключа Alpaca API ›‹ Секретный ключ Alpaca ›‹ Название модели Google ›

Эта команда:

1. Загрузите отчеты за 10 кварталов за последний рыночный день с веб-сайта SEC по адресу https://www.sec.gov/cgi-bin/current?q1=0&q2=1&q3=

Это следует проводить только поздно в рыночный день, поскольку именно тогда будут доступны все документы на этот день. Если вы попытаетесь запустить его раньше, он выдаст вам вчерашние документы.

2. Очистите каждую регистрацию 10-Q и сравните ее с последней регистрацией 10-Q компаний, как мы это делали при нашей подготовке к обучению. Если компания не подавала заявление 10-Q в течение последних 3 месяцев или около того, она пропустит его.

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

4. Если наша модель возвращает прогноз, равный 0 (она прогнозирует категорию наиболее резкого падения цен), то она будет использовать API Альпака для размещения короткого ордера на эту акцию, который будет исполнен при открытии рынка на следующий день.

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

Шаг 8. Переверните, чтобы жить, и пусть деньги валятся.

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

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

Первоначально размещено на: https://www.platorsolutions.com/

Я готов проконсультировать вас по программному обеспечению для любого проекта вашей компании. Щелкните здесь, чтобы заказать бесплатную первичную консультацию: https://www.platorsolutions.com/book-online