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.

Комментарии (14)


  1. sergehog
    13.08.2019 15:48
    +1

    Вот это я понимаю — человек резюме написал. Плюсую.

    По поводу статьи — я так понимаю, всякие Блумберги как раз и занимаются поставкой удобоваримых новостей всяческим трейдерам. Интересно, есть ли какой аналог Блумбергу в мире криптовалют? Так чтоб real-time и хорошо отфильтрованные, релевантные новости сыпались…



    1. ionsphere
      14.08.2019 22:10

      А разве www.bloomberg.com/crypto не подходит?


  1. zag2art
    13.08.2019 15:50
    +2

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


    1. ionsphere
      14.08.2019 22:13

      Поищите short-and-distort. Давно уже новости фабрикуются в удачное время с удачным сентиментом для определенных фондов.


  1. TiesP
    13.08.2019 16:51

    В этом соревновании случайно не участвовали? Там именно эта задача решалась)


  1. Slav2
    13.08.2019 20:34

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

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

    Вместо новостей можно использовать данные по ценам с сайта coinmarketcap.com
    Был случай когда из алгоритмов расчета средней цены отображаемой на сайте без предупреждения были удалены котировки с некоторых азиатских бирж. Отображаемая цена резко изменилась и это привело к скачку цен на других биржах. Потом алгоритмы вернули на место и извинились. А закономерность наверняка осталась. Появились и другие сайты агрегаторы цен. Наверняка котировки с www.cryptocompare.com используются в качестве сигнала для других ботов. Наложите данные с агрегаторов на графики цен на нескольких биржах с 5-10 секундной точностью и опубликуйте результат :)


  1. Krahmalev
    14.08.2019 07:49

    С точки зрения резюме — отличный ход.


  1. Krahmalev
    14.08.2019 07:54

    А по существу — прогнозирование на основании неподтвержденных или недостоверных данных — большая ошибка. Давайте промоделируем ситуацию, когда новостной фон создается искусственно? Т.е. кто-то намеренно создает неверный новостной фон. Как Ваш робот будет от этого защищаться? Нужно валидировать такой прогноз. Я не настоящий математик и смотрю на торговые рынки только из любопытства. Хотелось бы услышать мнение других специалистов, но мне кажется, что приемы из классической теории управления и fuzzy logic могут быть эффективнее.


    1. algotrader2013
      15.08.2019 00:03

      Подозреваю, что тут, как в анекдоте «чукча не должен бежать быстрее медведя — чукча должен бежать быстрее тебя»)

      То есть, не имеет значения, истинная ли новость, или создана ради манипуляции. Если толпа хомячков, сидящая в чатах в телеге, реагирует на новость в среднем за 15 минут, а бот может получить ту же реакцию, но за 1 секунду, то, теоретически
      боту достаточно лишь угадать их реакцию, купить, или продать мгновенно, а через 15 минут самому же об хомяков выйти. Что будет после «отработки» новости хомяками, не интересно в принципе. К этому моменту преимущество будет отработано, и позиция бота будет = 0. Как-то так оно в теории;) Сам не проверял)


  1. EddyLan
    14.08.2019 11:10

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


  1. Don_Eric
    14.08.2019 22:05

    Я сейчас ищу работу в области разработки биржевых роботов

    значит бот так и не заработал?


    1. Alex_464638 Автор
      14.08.2019 23:50

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


  1. Alex_464638 Автор
    16.08.2019 11:50

    Попросил специалиста по машинному обучению прокомментировать статью (он занимался сентиментной оценкой текста с помощью нейронных сетей).

    Вот его комментарий:

    1. «Совершенно очевидно, что причиной падения стоимости ethereum стала новость о взломе»
    Здесь утверждается о причинно-следственной связи, хотя здесь можно говорить лишь о корреляции.

    2. «Таким образом я пришел к мысли, что для создания криптотрейдингового бота нужно анализировать новости. Но как компьютер может анализировать новости, ведь он не понимает их сути?»
    Здесь ты говоришь о смысле новостей, но потом почему-то переходишь к её эмоциональному аспекту. Не хватает обоснования, почему вся остальная информация несущественна. Но в целом, идея со смыслом текстов кажется более интересной, поэтому я бы порекомендовал посмотреть в сторону языковых моделей: BERT, ELMo, ULMFIT, USE и т.д.

    3. «Под “настроем” понимается оценка текста. Скажем предложение “Война началась.” является отрицательно окрашенным, а предложение “Война закончилась.”»
    С точки зрения большинства гайдлайнов по разметке текстов (например, RuSentiment) оба предложения не являются эмоционально окрашенными, а констатируют факт.

    4. «Для теста библиотеки textblob я написал программу, которая выдает сентиментную оценку для текста, который находится в текстовом файле.»
    Какова точность этой оценки? Как ты её измерял? На каких текстах была обучена эта модель? Если она обучена распозновать эмоцию постов в Твиттере, то для анализа новостей она вряд ли подойдет.

    5. «Матмодель показывает, что прототип бота угадал направление движения цены биткойна 832 дня, и не угадал 725 дней.»
    Ты утверждаешь, что подход работает корректно в 53,346%. Какой доверительный интервал (можно считать по формуле для биномиального распределения)? Если взять 99.99%, то нижняя граница интервала будет меньше 50%, а для бинарной классификации это хуже рандома.

    6. «Если бы бот начинал торговать с 1 BTC, то к окончанию тестируемого периода у него было бы примерно 1.05 BTC.»
    Ты учитывал комиссию и разницу в курсах?

    7. В целом, я бы порекомендовал посмотреть существующуе источники, тема достаточно изученная. Пример академических статей:
    7.1. Karalevicius, V., Degrande, N., & De Weerdt, J. (2018). Using sentiment analysis to predict interday Bitcoin price movements. The Journal of Risk Finance, 19(1), 56-75.
    7.2. Georgoula, I., Pournarakis, D., Bilanakos, C., Sotiropoulos, D., & Giaglis, G. M. (2015). Using time-series and sentiment analysis to detect the determinants of bitcoin prices. Available at SSRN 2607167.
    7.3. Matta, M., Lunesu, I., & Marchesi, M. (2015, November). The predictor impact of Web search media on Bitcoin trading volumes. In 2015 7th International Joint Conference on Knowledge Discovery, Knowledge Engineering and Knowledge Management (IC3K) (Vol. 1, pp. 620-626). IEEE.

    Некоторые по этой теме магистерские еще в 2015 успели защитить: Matta, M., Lunesu, I., & Marchesi, M. (2015, June). Bitcoin Spread Prediction Using Social and Web Search Media. In UMAP Workshops (pp. 1-10).