python

Использование сентиментного анализа применительно к биржевым торговым роботам

  • среда, 14 августа 2019 г. в 00:20:15
https://habr.com/ru/post/463509/
  • Python
  • Программирование
  • Финансы в IT


image

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

Немного о себе. В 2015 году я окончил институт по специальности прикладная математика и информатика. С 2015 года я же профессионально занимаюсь разработкой программ для автоматизированной торговли на бирже.

Хотелось бы сначала поговорить об устоявшихся подходах применительно к торговым роботам. В данный момент классическим методом, применяемым в торговых роботах, является технический анализ. Что это такое? У вас есть 2 оси, ось x – по ней отсчитывается время, и ось y – по ней отсчитывается цена на что-либо. Технический анализ анализирует график на цену, который отображается с использованием этих двух осей и предугадывает цену на будущее. Как это можно сделать? Ну, например, можно сначала аппроксимировать график (ну скажем, с помощью сплайнов), а затем интерполировать его, — таким образом, мы попытаемся предсказать цену на что-либо.

А вот далее перейдем к сути вопроса.

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

Однажды я увидел новость, после которой задумался над тем, каким образом можно делать криптотрейдинговых ботов. 17 июня 2016 года произошел взлом DAO, в основе которой лежал ethereum. Стоимость ethereum упала в 2 раза с 21.52$ до 10.23$ за 1 день.

image
Совершенно очевидно, что причиной падения стоимости ethereum стала новость о взломе

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

Попрошу включить вашу фантазию.

Допустим, что ваш руководитель попросил вас предсказать время, когда заглохнет двигатель автомобиля. И предсказывать, когда заглохнет двигатель, вы должны находясь в подкапотном пространстве автомобиля. При этом, у вас есть команда из датасаентиста, трейдера и т. д. И при этом вы все очень маленькие и умещаетесь в подкапотном пространстве автомобиля. Ну допустим, что вы очень маленький, а двигатель очень большой. При разработке криптотрейдинговых ботов вы должны угадывать, когда цена на криптовалюту повысится или понизится, здесь же вы должны угадать, когда заглохнет двигатель, не находите совпадения? Итак, вы сидите рядом с этими ребятами, датасаентист записывает значения показаний давлений в трубках, которые подходят к двигателю, по оси x он записывает время, а по оси y показания давления. На основе этого он строит график и пытается предсказать, когда заглохнет двигатель. Трейдер прислонил ухо к двигателю и говорит: “Я слышал, что двигатель так звучал на прошлой неделе, когда он начинал глохнуть, значит, он и сейчас начнет глохнуть”. А снаружи спереди автомобиля стоят ребята с молотами и бьют молотами в район расположения двигателя по капоту. Ребята с молотами могут сговориться, и в один момент времени вместе ударить по капоту в район двигателя, и тогда он заглохнет. Понимаете? Вы пытаетесь предсказать будущее состояние системы, которая зависит от внешних данных, используя внутренние данные! Как можно узнать, когда заглохнет двигатель? Ну, например, можно приоткрыть капот и послушать, что говорят ребята с молотами.

Таким образом я пришел к мысли, что для создания криптотрейдингового бота нужно анализировать новости. Но как компьютер может анализировать новости, ведь он не понимает их сути? Недавно появились библиотеки, которые позволяют оценить “настрой” текста. Под “настроем” понимается оценка текста. Скажем предложение “Война началась.” является отрицательно окрашенным, а предложение “Война закончилась.” является положительно окрашенным. Соответственно, программе, которая проводит сентиментный анализ на вход подается строка текста, а программа в свою очередь, выдает оценку в диапазоне от -1.0 (отрицательно окрашенный текст) до 1.0 (положительно окрашенный текст).

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

Итак, что у нас есть для сентиментного анализа текста? Прототип я пишу на питоне, а там есть библиотека textblob, которая как раз может выдавать сентиментную оценку тексту. Отлично, идем дальше.

Дальше нам нужны новости. Какой самый старый сайт с новостями о криптовалютах? Coindesk. Работает с 2013 года. 6 лет новостей. Отлично, подходит. Для теста библиотеки textblob я написал программу, которая выдает сентиментную оценку для текста, который находится в текстовом файле. А в текстовый файл я вручную попробовал повставлять текст статей с coindesk.

Результаты: сентиментная оценка была выше у положительных новостей, то есть так, как и задумывалось. Далее нужно соскрейпить все новости с сайта. Тема скрейпинга сайтов – сама по себе достаточно обширная, хочу лишь упомянуть, что сначала я получил все ссылки на статьи сайта, для этого был написан поисковой паук для сбора ссылок. Уже после того как были собраны все ссылки, я написал программу для скрейпинга coindesk. По полученным ссылкам программа для скрейпинга парсила каждую новость на 3 составляющие: дату, заголовок новости и сам текст новости. Некоторые статьи не проходили парсинг (например, объявления о том, что на coindesk открыта какая-либо вакансия, и они ищут работника на данную должность, в таком случае, программа для скрейпинга должна была обрабатывать такие ситуации). Сразу скажу что всего получилось около 13 000 новостей. Потом нужно сохранить все новости в описанном мной формате на ПЗУ.

Далее нам нужны цены на криптовалюты с 2013 года. Некоторых криптовалют в 2013 году еще не было. Отлично, упрощаем задачу и будем предсказывать цену на биткойн. Для того чтобы найти цены с 2013 по 2019 год пришлось скачивать датасеты из 4-х разных источников, а потом объединять их в упорядоченную по времени структуру данных, данные пришлось скачивать из нескольких источников, так как нам нужен непрерывный по времени массив данных. После того как сформирована упорядоченная по времени структура данных с ценами, сохраняем ее на ПЗУ.

image
Что предстоит предсказывать (цена на биткойн с 2013 по 2019 год)

Теперь можно делать математическую модель. Как работает матмодель: берутся статьи за день и выясняется, какие из них имеют отношение к биткойну (для этого в матмодели был запрограммирован поиск в заголовке новости строки “bitcoin” или “BTC”). Для каждой статьи которая имеет отношение к биткойну получаем сентиментную оценку, если статей которые имеют отношение к биткойну несколько, то берем среднее арифметическое от сентиментных оценок. Сентиментная оценка больше нуля означает что завтра цена на биткойн вырастет, сентиментная оценка меньше нуля означает что цена на биткойн завтра понизится. В результате была сформирована специальная структура данных, где каждому дню были сопоставлены цена на биткойн и сентиментная оценка направления движения цены на следующий день, эту структуру данных нужно сохранить на ПЗУ.

Ок, смотрим что получилось.

image
На график цены биткойна наложено 3 вида точек: серые – в этот день не найдено новостей о биткойне, зеленые – предположение что на следующий день цена вырастет, красные – предположение что на следующий день цена упадет.

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

image
Этот график отражает то, было ли предположение о движении цены на биткойн верным или нет. На график цены биткойна наложено 2 вида точек: зеленые – предположение о направлении цены биткойна на следующий день было верным, красные – предположение о направлении цены биткойна на следующий день было неверным.

Матмодель показывает, что прототип бота угадал направление движения цены биткойна 832 дня, и не угадал 725 дней.

Также я проверил, что будет с доходностью, если бы этот прототип бота мог совершать торговые сделки в 2013 — 2019 годах. Торговый алгоритм для прототипа был такой: самый первый день торгов, у бота на счету 1 BTC. Далее если из полученных данных видно, что биткойн упадет в цене, то продаем BTC покупаем USD, если из полученных данных видно, что биткойн вырастет в цене, то продаем USD покупаем BTC, в случае если никаких новостей о биткойне нет, то не предпринимаем никаких действий, так как информации для принятия действий недостаточно. Если бы бот начинал торговать с 1 BTC, то к окончанию тестируемого периода у него было бы примерно 1.05 BTC.

Вам же ничего не мешает соскрейпить все новости с cnn.com с 1995 года и сопоставить все новости с ценой на акции на бирже (ну к примеру на NYSE), а для сентиментной оценки использовать нейронную сеть, которая опять-таки будет обучаться на новостях. Обученную таким образом нейронную сеть можно применить для анализа новостного потока в реальном времени, и на основе этой нейронной сети можно сделать торгового робота для той же самой NYSE. Тот кто первым так сделает — получит шоколадку.



Я сейчас ищу работу в области разработки биржевых роботов. Если ваша компания занимается разработкой торговых роботов, то мой e-mail: alex464638@gmail.com.