Всем привет,

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

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

Общий конвейер

Как правило, как и при любом подходе к машинному обучению, вам необходимо следующее:

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

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

Чего мы пытаемся достичь?

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

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

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

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

Сбор данных

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

Исходный код для сбора твитов, их предварительной обработки с помощью Tweepy и анализа настроений с помощью vaderSentiment можно скачать здесь.

Обучение классификатора событий

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

Набор обучающих данных можно найти здесь.

Для обучения этих моделей вручную был создан и аннотирован набор данных, содержащий более тысячи твитов и помеченный с использованием «Многоблочной стратегии OneVsRest», которая представляет собой тест алгоритма с несколькими метками, который принимает двоичный код. замаскировать несколько меток. Результатом каждого прогноза будет массив из 0 и 1, обозначающий, какие метки классов применяются к каждой входной выборке строки.

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

Получение оценки значимости событий

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

  1. Эти оценки должны отражать настроение (отрицательное или положительное).
  2. Они должны занимать значительную меру по сравнению с остальными.

Чтобы получить значение настроения каждого события, мы можем использовать «vaderSentiment», который представляет собой библиотеку Python с открытым исходным кодом. Чтобы получить значимость, мы можем использовать комбинацию значений.

  1. Оценка популярности — получена из Twitter.
  2. Оценка ретвита — получена из Twitter.
  3. Оценка трендов Google — получена из PyTrends API.

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

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

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

Обучение модели прогнозирования цен

На этом этапе нам нужно объединить 2 набора данных.

  1. Набор данных ежедневных событий с оценками значимости.
  2. Ежедневное изменение цены для данной акции/криптовалюты.

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

Чтобы делать прогнозы, когда категории событий присваивается показатель значимости, наша модель должна быть в состоянии предсказать возможный процент изменения цен, который может произойти из-за события в этой категории. Для этой цели наилучшие результаты были получены при использовании модели контролируемого машинного обучения «Машина опорных векторов». Сравнение оцененных моделей и тех, которые дали наилучшие результаты, можно увидеть в таблице ниже.

Исходный код, в котором я использовал библиотеку Python SKLearns reprofit_models, и соответствующий обучающий код можно увидеть здесь.

Хорошо, так до сих пор

  1. Мы создали целый конвейер для сбора событий, связанных с финансовым рынком, на каждый день.
  2. Мы разделили эти события на 5 категорий.
  3. Мы присвоили каждому событию оценку значимости.
  4. Мы нормализовали эти баллы и получили итоговый балл по каждой категории за день.
  5. Мы обучили модель машинного обучения находить корреляцию между категорией событий с определенной оценкой значимости и результирующим изменением цены финансового объекта за день.
  6. Теперь мы можем использовать эту модель для прогнозирования возможного процентного изменения цены, когда мы входим в категорию событий с оценкой на будущий день.

Общий ход всего этого процесса можно показать ниже.

Что дальше?

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

Чтобы создать набор удобочитаемых правил, который определяется прогнозом регрессии, сделанным в предыдущих моделях прогнозирования цен, здесь используется skLearn DecisionTreeRegressor для создания дерево решений на основе регрессионной модели, а затем перевести его в удобочитаемые правила, добавив операторы «если-то-иначе» вместо компараторов.

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

if (marketCategoryScore <= 44.132) and (marketCategoryScore > -15.918) and (marketCategoryScore > 3.158) then response: -0.589 | based on 7 samples
if (marketCategoryScore <= 44.132) and (marketCategoryScore > -15.918) and (marketCategoryScore <= 3.158) then response: 0.304 | based on 7 samples
if (marketCategoryScore <= 44.132) and (marketCategoryScore <= -15.918) and (otherCategoryScore > 15.472) then response: -1.03 | based on 2 samples
if (marketCategoryScore > 44.132) and (otherCategoryScore > 19.454) then response: 3.02 | based on 1 sample
if (marketCategoryScore > 44.132) and (otherCategoryScore <= 19.454) then response: 3.63 | based on 1 sample
if (marketCategoryScore <= 44.132) and (marketCategoryScore <= -15.918) and (otherCategoryScore <= 15.472) then response: -1.58 | based on 1 sample

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

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

Попробуй сам!!!

Весь исходный код и необходимые наборы данных для двух криптовалют можно найти в следующем файле.

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

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