- PVSM.RU - https://www.pvsm.ru -
Набор данных Financial News Sentiment Dataset (FiNeS) [1] содержит в себе заголовки финансовых новостей о компаниях, торгующихся на Московской и СПб биржах. Целевой переменной датасета является оценка тональности новостных заголовков в виде вещественного числа. Идеи для использования датасета: Создание трейдинговых стратегий на основе анализа тональности новостей "на лету"; Анализ новостного фона в разрезе времени (день/неделя) или в разрезе компании.
Анализ тональности текста [2] или анализ сентимента (англ. sentiment analysis) — задача не новая. В общем виде суть её представляется в сопоставлении входному тексту определённой шкалы, по которой измеряется его "настроение". При этом, шкала может быть как дискретной — в частности бинарной, так и вещественной — например от 0 до 1.
В простейшем случае бинарной категоризации сентимента, алгоритму необходимо определить, к какому классу относить текст: положительному или отрицательному. В случае более двух классов, можно взять следующий набор: положительный, отрицательный, и нейтральный. Очевидно, что такая задача решается методами классификации, о которых говорить в данной статье подробно не будем. В случае анализа сентимента на основе вещественной целевой переменной (напр. от 0 до 1) возможно воспользоваться уже не только методами классификации (получая ответы без функции активации на выходе, см. predict_proba), но и целесообразно рассматривать такую задачу, как задачу восстановления регрессии.

Интерес к этой, давной известной, задаче заключается в её приложениях. В частности, в данной статье мы рассмотрим анализ тональности текстов на русском языке на примере финансовых новостей о компаниях, собранных из различных источников (РБК [3], Коммерсант [4], Финам [5], Investing [6], и Ведомости [7]). В основе статьи лежит датасет Financial News Sentiment Dataset [1], специально подготовленный автором для такой задачи, о нём и пойдёт речь далее.
Набор данных Financial News Sentiment Dataset (FiNeS) [1] содержит в себе заголовки финансовых новостей о компаниях, торгующихся на Московской и СПб биржах. Целевой переменной датасета является оценка тональности новостных заголовков в виде вещественного числа. В наборе данных присутствуют следующие переменные, описывающие контекст новостного заголовка:
заголовок (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-лент следующих источников: РБК [3], Коммерсант [4], Финам [5], Investing [6], и Ведомости [7]. Для каждой новости автоматически проверялось наличие наименования определённой компании в заголовке. Например, в заголовке Тиньков решил уйти на пенсию после продажи доли в TCS Group имеется упоминание TCS Group — держателя акций банка Тинькофф. Новости, без упоминания компаний не были включены в датасет. После чего, было сформировано задание по типу краудсорсинга для разметки заголовков.
Разметка заголовков происходила с помощью краудсорсинговой платформы Яндекс Толока [8]. Разметчику предлагалось выполнить 10 заданий, в каждом из которых необходимо выбрать, какой из двух новостных заголовков имеет более положительную тональность (см. рисунок ниже). Такой метод называется Best-Worst Scaling [9].

В общем пуле задач каждому заголовоку случайным образом подбиралось 8 пар для сравнения (второй заголовок). Таким образом, на основе 532 новостных заголовков было сформировано 4256 заданий для краудсорсинга. С помощью интерфейса Толоки перекрытие заданий было задано равным 3. Таким образом, каждый заголовок размечался 24 раза (8*3). Аудитория разметчиков была ограничена по следующим параметрам:
Языки: Русский (как минимум);
Образование: Высшее или среднее специальное;
Дата рождения: старше 01.01.2000.
В дополнение к этому, было выбрано топ 30% разметчиков по качеству. Автоматический контроль качества проводился посредством блокировки разметчиков, слишком быстро выполняющих задание (менее 25 секунд) и неправильно вводивших капчу (менее 70% правильных ответов).
Целевая переменная (тональность заголовка) была подсчитана следующим образом: T = npositive/ntotal - nnegative/ntotal.
Где npositive — количество раз, когда заголовок был размечен как более положительный, ntotal — общее количество разметок, nnegative - количество раз, когда заголовок был размечен как более отрицательный. Распределение значений целевой переменной доступно на рисунке ниже.

Надёжность результатов разметки была подсчитана следующим образом.
Первый критерий — расчёт показатель Fleiss' Kappa [10], который равен 0.2639, что соответствует достаточной согласованности разметчиков (англ. fair agreement).
Второй критерий — расчёт коррелляции оценок с помощью метода Split-half reliability [11], корелляция равна 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]
Для более подробного ознакомления с датасетом прошу сюда [1], а по вопросам в личные сообщения.
А ещё: Python Библиотека [12], реализующая функциональность торгового робота на основе Tinkoff Invest API для Python с торговой стратегией, основанной на анализе тональности новостей.
Автор: Александр Перевалов
Источник [13]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/378778
Ссылки в тексте:
[1] Financial News Sentiment Dataset (FiNeS): https://github.com/WebOfRussia/financial-news-sentiment
[2] Анализ тональности текста: https://web.stanford.edu/~jurafsky/slp3/4.pdf
[3] РБК: http://static.feed.rbc.ru/rbc/logical/footer/news.rss
[4] Коммерсант: https://www.kommersant.ru/RSS/main.xml
[5] Финам: https://www.finam.ru/analysis/conews/rsspoint
[6] Investing: https://ru.investing.com/rss/news.rss
[7] Ведомости: https://www.vedomosti.ru/rss/news
[8] Яндекс Толока: https://toloka.ai/
[9] Best-Worst Scaling: https://aclanthology.org/N16-1095/
[10] Fleiss' Kappa: https://en.wikipedia.org/wiki/Fleiss%27_kappa
[11] Split-half reliability: https://www.statology.org/split-half-reliability/
[12] Python Библиотека: https://github.com/Perevalov/tinvest_robot
[13] Источник: https://habr.com/ru/post/687556/?utm_source=habrahabr&utm_medium=rss&utm_campaign=687556
Нажмите здесь для печати.