python

Financial News Sentiment Dataset: определяем точку входа в акции по настроению новостей

  • воскресенье, 11 сентября 2022 г. в 00:38:42
https://habr.com/ru/post/687556/
  • Python
  • Финансы в IT
  • Natural Language Processing


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]

Для более подробного ознакомления с датасетом прошу сюда: https://github.com/WebOfRussia/financial-news-sentiment, а по вопросам в личные сообщения.

А ещё: Python Библиотека, реализующая функциональность торгового робота на основе Tinkoff Invest API для Python с торговой стратегией, основанной на анализе тональности новостей: https://github.com/Perevalov/tinvest_robot

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Занимаетесь инвестициями
77.78% Да 7
11.11% Нет 1
0% Планирую открыть счёт 0
11.11% Нет и не планирую 1
Проголосовали 9 пользователей. Воздержался 1 пользователь.