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

  1. Понимание роли тональности новостей на фондовых рынках. Анализ тональности относится к процессу определения эмоционального тона или тональности текста. В контексте фондовых рынков анализ настроений помогает определить положительное, отрицательное или нейтральное отношение новостных статей, связанных с акциями. Понимая настроения, стоящие за такими новостями, инвесторы могут выявить потенциальные рыночные тенденции и движения цен, обусловленные настроениями.
  2. Сбор данных новостей о ценах на акции. Для начала нам нужен надежный источник данных новостей о ценах на акции. Одним из популярных вариантов является использование API-интерфейсов, предоставляемых платформами финансовых новостей, такими как Alpha Vantage или Yahoo Finance. Эти API предлагают доступ к широкому спектру новостных статей, связанных с конкретными акциями. В этом блоге мы будем использовать API Alpha Vantage для получения данных новостей.
  3. Подготовка данных для анализа настроений. После того, как мы собрали данные новостей, нам нужно предварительно обработать их, прежде чем вводить в наши модели машинного обучения. Основные этапы предварительной обработки включают в себя:
  • Очистка текста: удаление ненужных символов, знаков препинания и специальных символов.
  • Токенизация: разбиение текста на отдельные слова или токены.
  • Удаление стоп-слов: удаление общеупотребительных слов, не несущих существенной тональности.
  • Лемматизация или стемминг: приведение слов к их корневой форме для лучшего анализа.

4. Построение модели анализа настроений. В этом разделе мы создадим модель машинного обучения для классификации настроений в новостях. Мы можем использовать различные алгоритмы машинного обучения, такие как наивный байесовский метод, машины опорных векторов (SVM) или даже модели глубокого обучения, такие как рекуррентные нейронные сети (RNN) или преобразователи. В этом блоге мы будем использовать простой, но эффективный алгоритм под названием Multinomial Naive Bayes, который хорошо подходит для задач классификации текста.

5. Обучение и оценка модели. Для обучения модели анализа тональности нам нужны размеченные данные, где каждая новостная статья помечена соответствующей тональностью (положительной, отрицательной или нейтральной). Эти помеченные данные служат исходной истиной для обучения модели. Мы разделяем данные на наборы для обучения и тестирования, а затем обучаем модель, используя набор для обучения. Наконец, мы оцениваем производительность модели на тестовом наборе, используя оценочные показатели, такие как точность, достоверность, полнота и F1-оценка.

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

7. Визуализация результатов тональности. Чтобы лучше понять и интерпретировать результаты анализа тональности, мы можем создавать визуализации. Python предлагает различные библиотеки визуализации, такие как Matplotlib или Plotly. Мы можем создавать визуализации, такие как гистограммы или облака слов, чтобы продемонстрировать распределение настроений или выделить ключевые термины, связанные с настроениями, в новостных статьях.

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

9. Заключение и будущие направления. Анализ настроений в отношении новостей о ценах на акции с использованием моделей машинного обучения в Python позволяет инвесторам использовать возможности принятия решений на основе данных. Благодаря дальнейшему развитию алгоритмов и методов машинного обучения, таких как глубокое обучение и преобразователи, мы можем ожидать в будущем еще более точных моделей анализа настроений. Оставаясь в курсе последних событий в области анализа настроений, инвесторы могут максимизировать свои шансы на успех на фондовом рынке.

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

# Import libraries
import pandas as pd
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
from urllib.request import urlopen, Request
from nltk.sentiment.vader import SentimentIntensityAnalyzer

# Parameters 
n = 3 
tickers = ['AAPL', 'TSLA', 'AMZN']

# Get Data
finwiz_url = 'https://finviz.com/quote.ashx?t='
news_tables = {}

for ticker in tickers:
    url = finwiz_url + ticker
    req = Request(url=url,headers={'user-agent': 'my-app/0.0.1'}) 
    resp = urlopen(req)    
    html = BeautifulSoup(resp, features="lxml")
    news_table = html.find(id='news-table')
    news_tables[ticker] = news_table

try:
    for ticker in tickers:
        df = news_tables[ticker]
        df_tr = df.findAll('tr')
    
        print ('\n')
        print ('Recent News Headlines for {}: '.format(ticker))
        
        for i, table_row in enumerate(df_tr):
            a_text = table_row.a.text
            td_text = table_row.td.text
            td_text = td_text.strip()
            print(a_text,'(',td_text,')')
            if i == n-1:
                break
except KeyError:
    pass

# Iterate through the news
parsed_news = []
for file_name, news_table in news_tables.items():
    for x in news_table.findAll('tr'):
        text = x.a.get_text() 
        date_scrape = x.td.text.split()

        if len(date_scrape) == 1:
            time = date_scrape[0]
            
        else:
            date = date_scrape[0]
            time = date_scrape[1]

        ticker = file_name.split('_')[0]
        
        parsed_news.append([ticker, date, time, text])
        
# Sentiment Analysis
analyzer = SentimentIntensityAnalyzer()

columns = ['Ticker', 'Date', 'Time', 'Headline']
news = pd.DataFrame(parsed_news, columns=columns)
scores = news['Headline'].apply(analyzer.polarity_scores).tolist()

df_scores = pd.DataFrame(scores)
news = news.join(df_scores, rsuffix='_right')


# View Data 
news['Date'] = pd.to_datetime(news.Date).dt.date

unique_ticker = news['Ticker'].unique().tolist()
news_dict = {name: news.loc[news['Ticker'] == name] for name in unique_ticker}

values = []
for ticker in tickers: 
    dataframe = news_dict[ticker]
    dataframe = dataframe.set_index('Ticker')
    dataframe = dataframe.drop(columns = ['Headline'])
    print ('\n')
    print (dataframe.head())
    
    mean = round(dataframe['compound'].mean(), 2)
    values.append(mean)
    
df = pd.DataFrame(list(zip(tickers, values)), columns =['Ticker', 'Mean Sentiment']) 
df = df.set_index('Ticker')
df = df.sort_values('Mean Sentiment', ascending=False)
print ('\n')
print (df)

Рабочее портфолио:https://sahajgodhani.in/