TLDR
Набор данных Financial News Sentiment Dataset (FiNeS) содержит в себе заголовки финансовых новостей о компаниях, торгующихся на Московской и СПб биржах. Целевой переменной датасета является оценка тональности новостных заголовков в виде вещественного числа. Идеи для использования датасета: Создание трейдинговых стратегий на основе анализа тональности новостей "на лету"; Анализ новостного фона в разрезе времени (день/неделя) или в разрезе компании.
Анализ тональности текста
Анализ тональности текста или анализ сентимента (англ. sentiment analysis) — задача не новая. В общем виде суть её представляется в сопоставлении входному тексту определённой шкалы, по которой измеряется его "настроение". При этом, шкала может быть как дискретной — в частности бинарной, так и вещественной — например от 0 до 1.
В простейшем случае бинарной категоризации сентимента, алгоритму необходимо определить, к какому классу относить текст: положительному или отрицательному. В случае более двух классов, можно взять следующий набор: положительный, отрицательный, и нейтральный. Очевидно, что такая задача решается методами классификации, о которых говорить в данной статье подробно не будем. В случае анализа сентимента на основе вещественной целевой переменной (напр. от 0 до 1) возможно воспользоваться уже не только методами классификации (получая ответы без функции активации на выходе, см. predict_proba), но и целесообразно рассматривать такую задачу, как задачу восстановления регрессии.
Интерес к этой, давной известной, задаче заключается в её приложениях. В частности, в данной статье мы рассмотрим анализ тональности текстов на русском языке на примере финансовых новостей о компаниях, собранных из различных источников (РБК, Коммерсант, Финам, Investing, и Ведомости). В основе статьи лежит датасет Financial News Sentiment Dataset, специально подготовленный автором для такой задачи, о нём и пойдёт речь далее.
Financial News Sentiment Dataset (FiNeS)
Набор данных Financial News Sentiment Dataset (FiNeS) содержит в себе заголовки финансовых новостей о компаниях, торгующихся на Московской и СПб биржах. Целевой переменной датасета является оценка тональности новостных заголовков в виде вещественного числа. В наборе данных присутствуют следующие переменные, описывающие контекст новостного заголовка:
заголовок (
title
),целевая переменная тональности (
score
),ссылка на источник (
link
),дата публикации (
published
),тикеры компаний (
tickers
).
Набор данных может быть использован для анализа тональности новостных заголовков для поддержки принятия решений в области финансовой индустрии, трейдинга и инвестиций.
Пример набора данных (за исключением столбцов link
и summary
) показан ниже:
title |
score |
published |
tickers |
---|---|---|---|
Электромобильный стартап Arrival экс-главы Yota уйдет из России |
-0.5833333333 |
Thu, 12 May 2022 05:10:01 +0300 |
['ARVL'] |
Шрёдер отклонил предложение войти в совет директоров «Газпрома» |
-0.3333333333 |
Tue, 24 May 2022 22:12:05 +0300 |
['GAZP'] |
Шельф берут в разработку // Генподрядчиком «Газпрома» на море может стать компания Андрея Патрушева |
0.7 |
Fri, 29 Jul 2022 00:28:00 +0300 |
['GAZP'] |
Чистая прибыль "РусГидро" по РСБУ за 1 полугодие выросла на 17% |
0.6818181818 |
Thu, 28 Jul 2022 19:06:29 +0300 |
['HYDR'] |
Финский производитель шин Nokian Tyres решил уйти из России |
-0.4117647059 |
Tue, 28 Jun 2022 18:17:06 +0300 |
['NOK'] |
Федун ушел с поста вице-президента ЛУКОЙЛа на пенсию |
-0.02564102564 |
Mon, 27 Jun 2022 17:19:50 +0300 |
['LKOH'] |
Процесс сбора данных
Сбор новосте проводился из RSS-лент следующих источников: РБК, Коммерсант, Финам, Investing, и Ведомости. Для каждой новости автоматически проверялось наличие наименования определённой компании в заголовке. Например, в заголовке Тиньков решил уйти на пенсию после продажи доли в TCS Group
имеется упоминание TCS Group
— держателя акций банка Тинькофф. Новости, без упоминания компаний не были включены в датасет. После чего, было сформировано задание по типу краудсорсинга для разметки заголовков.
Процесс разметки заголовков
Разметка заголовков происходила с помощью краудсорсинговой платформы Яндекс Толока. Разметчику предлагалось выполнить 10 заданий, в каждом из которых необходимо выбрать, какой из двух новостных заголовков имеет более положительную тональность (см. рисунок ниже). Такой метод называется Best-Worst Scaling.
В общем пуле задач каждому заголовоку случайным образом подбиралось 8 пар для сравнения (второй заголовок). Таким образом, на основе 532 новостных заголовков было сформировано 4256 заданий для краудсорсинга. С помощью интерфейса Толоки перекрытие заданий было задано равным 3. Таким образом, каждый заголовок размечался 24 раза (8*3). Аудитория разметчиков была ограничена по следующим параметрам:
Языки: Русский (как минимум);
Образование: Высшее или среднее специальное;
Дата рождения: старше 01.01.2000.
В дополнение к этому, было выбрано топ 30% разметчиков по качеству. Автоматический контроль качества проводился посредством блокировки разметчиков, слишком быстро выполняющих задание (менее 25 секунд) и неправильно вводивших капчу (менее 70% правильных ответов).
Подсчёт целевой переменной
Целевая переменная (тональность заголовка) была подсчитана следующим образом: T = npositive/ntotal - nnegative/ntotal.
Где npositive — количество раз, когда заголовок был размечен как более положительный, ntotal — общее количество разметок, nnegative - количество раз, когда заголовок был размечен как более отрицательный. Распределение значений целевой переменной доступно на рисунке ниже.
Надёжность результатов разметки
Надёжность результатов разметки была подсчитана следующим образом.
Первый критерий — расчёт показатель Fleiss' Kappa, который равен 0.2639
, что соответствует достаточной согласованности разметчиков (англ. fair agreement).
Второй критерий — расчёт коррелляции оценок с помощью метода Split-half reliability, корелляция равна 0.8451
, что означает высокую корелляцию в ответах разметчиков из случайно отобранных групп.
Идеи для использования датасета
Создание трейдинговых стратегий на основе анализа тональности новостей "на лету";
Анализ новостного фона в разрезе времени (день/неделя) или в разрезе компании.
Пример построения простейшей модели
from sklearn.linear_model import LinearRegression
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
import pandas as pd
df = pd.read_csv("../data/data.tsv", sep='\t')
train, test = train_test_split(df, test_size=0.3, random_state=42)
vectorizer = TfidfVectorizer()
vectorizer.fit(df['title'])
model = LinearRegression()
model.fit(vectorizer.transform(train['title']), train['score'])
print(mean_squared_error(test['score'], model.predict(vectorizer.transform(test['title']))))
>>> 0.23952362826629248
print(model.predict(vectorizer.transform(["Яндекс увеличил прибыль на $1 млрд"])))
>>> [0.52505851]
Для более подробного ознакомления с датасетом прошу сюда, а по вопросам в личные сообщения.
А ещё: Python Библиотека, реализующая функциональность торгового робота на основе Tinkoff Invest API для Python с торговой стратегией, основанной на анализе тональности новостей.
Комментарии (13)
amarao
10.09.2022 19:27+2Вы с Мартингейлом и Монте-карло сравнивали результаты?
perevalov_a Автор
10.09.2022 19:34+1Статья о датасете, а не о стратегии. Можете взять за основу и сравнить)
rinat_crone
11.09.2022 09:53+1Мартингейл и монте-карло это же не про индикаторы (когда входить / выходить, к чему собсно описываемый автором подход и удобно будет применить), а про управление размером ставки (риска).
Можно подобрать такие точки входа в Мартингейл на исторических данных, которые дадут фантастические результаты. А вот наперед такие точки предсказать сильно сложнее :)
Я не очень долго, но с достаточно большим интересом в своё время увлекался алгоритмическим трейдингом (на форексе, правда), в том числе, пробовал стратегии, основанные на анализе тональности новостей (эта идея наверное всем на ум приходит). Более-менее интересных результатов даже на исторических данных добиваться не получалось, к сожалению.
vandriichuk
11.09.2022 07:53+2Тоже когда-то пытался таким заниматься. Пришел к выводу, что в самом простейшем виде нужно учитывать, что новости в газетах пишут люди и эти люди подают новости так, как считают нужным. То есть здесь идет перекос сантимента из-за субъективного восприятия автора статьи. Следовательно, надо как-то нивелировать этот момент. Да и вбросы же никто не отменял с целью манипулирования рынком. То есть задача становится на порядок сложнее первичной гипотезы.
bestsalut
12.09.2022 10:33"Новости в газетах пишут люди" - это верно. Добавлю также, что и интерпретируют новости тоже люди. Пример из этой же статьи: Чистая прибыль "РусГидро" по РСБУ за 1 полугодие выросла на 17%. Это хорошая новость? Если сравнивать 0% и 17% то да. А если ожиданием рынка был рост на 25%, а фактический составил только 17% - то это уже не очень. Способен ли толокчанин за 25 секунд плошку риса качественно это оценить? Поэтому идея имеет право на жизнь, а вот качественная реализация намного сложнее.
perevalov_a Автор
12.09.2022 11:49Способен ли толокчанин за 25 секунд плошку риса качественно это оценить?
Возможно не способен, но что будет если их несколько? И если 25 секунд возьмём как триггер к блокировке за слишком быстрое выполнение? А что если покрытие одной новости при разметке, например, 8 раз? Так же стоит понять для чего мы размечаем и что хотим предугадать? Если хотим предугадать действия среднестатистического неквалифицированного инвестора, то мнение усреднённого толокера скорее всего подойдёт. Ну а если хотим наиболее объективную информацию, как вы упомянули с учётом ожиданий и фактов, нужен, естественно, более глубокий анализ.
bestsalut
13.09.2022 08:43Чем больше покрытие - тем лучше. Но конкретно в этом вопросе толокеры врят ли помогут. Дай им хоть минуту - не думаю что они полезут искать прогноз прибыли РусГидро за первый квартал/полугодие. А из тех кто полезут - многие ли найдут.
По второму вопросу - что мы хотим предугадать. Если, как вы говорите, действия среднестатистического неквалифицированного инвестора, то их воздействие на рынок невелико. Крупными суммами управляют хорошие специалисты.
Aleksid1
11.09.2022 11:52Утром председатель совета директоров Лукойла выпал из окна ЦКБ и скончался (новость негативная, так ведь?), после обеда - взрывной рост курса акций Лукойла.
dmitryvolochaev
11.09.2022 15:48Отсюда вопрос, а зачем вообще это промежуточное звено - сентимент? Что будет, если мы возьмем за целевой признак изменение курса акций в течение N дней после новости?
freakru
Идея не новая, да и обычно поздно реагировать на рынке акций если новость появилась в явном виде.
Интереснее было бы прогнозировать рынок на основе неявных данных.
А за техническую часть - спасибо.
Hardcoin
Если реагировать поздно, тогда почему после новостей цена меняется? Миллиарды долларов реагируют, вероятно в этом есть смысл на долгосрок.
thevlad
Реагируют в основном на новые фактические данные: отчеты, макро статистика, реже какие-то существенные факты. Обычно это все выходит периодически в известные периоды времени, в известном формате. Надо только распарсить, и посчитать новую "справедливую цену", а дальше кто первый встал того и тапки.