Парсинг и Sentiment Analysis Reddit (r/CryptoCurrency) на Python

Парсинг и Sentiment Analysis Reddit (r/CryptoCurrency) на Python Анализ данных и Бэктесты
Пошаговое руководство по созданию скрипта для парсинга и анализа тональности (Sentiment Analysis) постов r/CryptoCurrency через PRAW API и NLTK VADER.
Суть: Готовый Python-скрипт для автоматического сбора постов из сабреддита r/CryptoCurrency с помощью библиотеки praw и проведения анализа настроений (Sentiment Analysis) с использованием лексикона nltk.sentiment.vader. Полученные данные агрегируются в pandas.DataFrame для дальнейшего использования в торговых стратегиях.

Исходный код

Для реализации парсера нам понадобятся библиотеки praw, pandas и nltk. Скрипт авторизуется в Reddit API, скачивает последние посты из целевого сабреддита, анализирует текст заголовков и комментариев, а затем рассчитывает метрику Compound Sentiment. Полученные результаты можно использовать для построения альтернативных индикаторов, аналогично тому, как строится тепловая карта корреляции альткоинов на Python: seaborn и pandas или индикаторы технического анализа через интеграцию Ta-Lib в Python: Быстрый расчет 100+ индикаторов на DataFrame.

import praw
import pandas as pd
from nltk.sentiment.vader import SentimentIntensityAnalyzer
import nltk

# Загрузка лексикона VADER (требуется один раз)
nltk.download('vader_lexicon', quiet=True)

# Настройки подключения к Reddit API
reddit = praw.Reddit(
    client_id='YOUR_CLIENT_ID',
    client_secret='YOUR_CLIENT_SECRET',
    user_agent='SentimentAnalyzer v1.0 by /u/YOUR_USERNAME'
)

def analyze_subreddit_sentiment(subreddit_name, limit=50):
    sia = SentimentIntensityAnalyzer()
    data = []

    subreddit = reddit.subreddit(subreddit_name)
    for submission in subreddit.hot(limit=limit):
        # Пропускаем закрепленные посты
        if submission.stickied:
            continue

        text_to_analyze = f"{submission.title} {submission.selftext}"
        sentiment_scores = sia.polarity_scores(text_to_analyze)

        data.append({
            'title': submission.title,
            'score': submission.score,
            'num_comments': submission.num_comments,
            'created_utc': pd.to_datetime(submission.created_utc, unit='s'),
            'compound': sentiment_scores['compound'],
            'pos': sentiment_scores['pos'],
            'neu': sentiment_scores['neu'],
            'neg': sentiment_scores['neg']
        })

    df = pd.DataFrame(data)
    return df

if __name__ == '__main__':
    df_sentiment = analyze_subreddit_sentiment('CryptoCurrency', limit=30)
    print(df_sentiment.head())

Разбор параметров

  • client_id: Уникальный идентификатор вашего приложения, полученный на портале разработчиков Reddit.
  • client_secret: Секретный ключ приложения для авторизации запросов.
  • user_agent: Строка-идентификатор вашего парсера (Reddit требует уникальные юзер-агенты для предотвращения блокировок).
  • SentimentIntensityAnalyzer: Класс из библиотеки nltk, использующий алгоритм VADER, оптимизированный под анализ коротких текстов и сленга из соцсетей.
  • compound: Интегральный показатель тональности в диапазоне от -1 (абсолютно негативный) до +1 (абсолютно позитивный).

Как запустить

Шаг 1. Зарегистрируйте приложение на Reddit Apps как ‘script’ и получите client_id и client_secret.

Шаг 2. Установите необходимые библиотеки: pip install praw pandas nltk.

Шаг 3. Вставьте ваши учетные данные в скрипт и запустите его. Полученный датафрейм можно использовать для фильтрации сигналов совместно с техническими индикаторами, например, настроив векторизованный расчет SuperTrend на Python без медленных циклов.

Оцените статью
FinFluct