NLP для аналізу ринку — Обробка новин та соціальних настроїв

Обробка природної мови стала критично важливою для торгівлі криптовалютами. Новинні анонси, настрої в соціальних мережах та чутки про регуляцію рухають ринки ще до появи сигналів у блокчейні. Цей посібник проведе вас через витягнення дієвих інсайтів з неструктурованого тексту — ті самі техніки, які використовуються для оцінки настроїв у Smart Money API.

Ключовий інсайт: Настрої самі по собі передбачають лише 48% короткострокових рухів. Але коли їх поєднують із консенсусом китів та ставками фандінгу? Торгівля, підтверджена настроями, досягає точності 61%. Ось що таке сила мультимодальних сигналів.

Основи аналізу настроїв

Лексиконні підходи проти машинного навчання

Лексиконний підхід: Словник позитивних/негативних слів (VADER, TextBlob). Швидкий, зрозумілий, але погано справляється з сарказмом та контекстом.

Python — Лексиконний аналіз настроїв
from nltk.sentiment import SentimentIntensityAnalyzer
analyzer = SentimentIntensityAnalyzer()
texts = [
"Bitcoin зріс на 15% на новинах про оптимістичне впровадження інституцій",
"Крах наближається — очікуйте падіння на 40% через негативний фандінг",
"Змішані сигнали, але кити накопичують ETH"
]
for text in texts:
scores = analyzer.polarity_scores(text)
print(f"{text[:40]}... → {scores['compound']:.2f}")

Результат: Композитні оцінки варіюються від -1 (найнегативніший) до +1 (найпозитивніший). Оцінка 0.65 вказує на позитивний настрій, -0.42 — на негативний.

ML-підхід: Навчання класифікаторів (Naive Bayes, SVM) або використання попередньо навчених трансформерів (BERT, RoBERTa). Точніше, але вимагає розмічених даних.

Обробка новин про криптовалюти

Агрегація новин у реальному часі

Отримання заголовків із основних джерел (CoinTelegraph, BlockBeats, Cointelegraph RSS, Reddit):

Python — Пайплайн новин
import feedparser
from datetime import datetime, timedelta
# RSS стрічки для криптоновин
feeds = [
"https://cointelegraph.com/feed",
"https://www.coindesk.com/arc/outboundfeeds/rss/",
]
articles = []
for feed_url in feeds:
feed = feedparser.parse(feed_url)
for entry in feed.entries[:10]:
articles.append({
"title": entry.title,
"published": entry.published_parsed,
"summary": entry.summary,
})

Розпізнавання іменованих сутностей (NER) для криптоактивів

Визначення, які токени/біржі згадуються:

Python — NER для крипто
import spacy
nlp = spacy.load("en_core_web_sm")
# Користувацькі шаблони сутностей для крипто
crypto_entities = {"Bitcoin", "BTC", "Ethereum", "ETH", "Solana", "SOL"}
text = "Bitcoin зріс на 12%, оскільки кити Ethereum накопичували великі обсяги"
doc = nlp(text)
for token in doc:
if token.text in crypto_entities:
print(f"{token.text} знайдено")

Витягнення соціальних настроїв

Інтеграція з Twitter/X API

Відстеження згадок, настроїв та активності для конкретних активів:

Python — Стрім настроїв у Twitter
import tweepy
from transformers import pipeline
sentiment_pipeline = pipeline("sentiment-analysis", model="distilbert-base-uncased-finetuned-sst-2-english")
# Авторизація в Twitter API v2
client = tweepy.Client(bearer_token=TWITTER_BEARER)
# Пошук твітів про Bitcoin за останню годину
query = "Bitcoin -is:retweet lang:en"
tweets = client.search_recent_tweets(query=query, max_results=100)
sentiments = []
for tweet in tweets.data:
result = sentiment_pipeline(tweet.text)[0]
sentiments.append({
"text": tweet.text,
"label": result["label"],
"score": result["score"]
})
avg_sentiment = sum(s["score"] for s in sentiments) / len(sentiments)
print(f"Bitcoin sentiment: {avg_sentiment:.2f}")

Reddit Community Sentiment

Моніторинг r/cryptocurrency, r/btc, r/ethtrader для відстеження змін настроїв ритейлу:

Python — Reddit sentiment
import praw
reddit = praw.Reddit(client_id=ID, client_secret=SECRET, user_agent=AGENT)
subreddit = reddit.subreddit("cryptocurrency")
# Отримати гарячі пости за останні 24 години
for post in subreddit.hot(limit=50):
if post.created_utc > (time.time() - 86400):
sentiment = sentiment_pipeline(post.title)[0]
# Високі голоси + позитивні настрої = сильний бичий сигнал від ритейлу
signal_strength = post.score * sentiment["score"]

Building a Production Sentiment Engine

Transformer-Based Sentiment (BERT)

Попередньо навчені моделі BERT набагато точніші за підходи на основі лексикону:

Python — BERT sentiment pipeline
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
model_name = "ProsusAI/finbert" # FinBERT навчений на фінансових новинах
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
def get_finbert_sentiment(text):
inputs = tokenizer(text, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits
probabilities = torch.softmax(logits, dim=1)
# Повертає: негативний (0), нейтральний (1), позитивний (2)
sentiment_idx = torch.argmax(probabilities)
confidence = probabilities[0, sentiment_idx].item()
return {"sentiment": ["negative", "neutral", "positive"][sentiment_idx], "confidence": confidence}

Real-Time Sentiment Aggregation

Об'єднання кількох сигналів у щоденний показник настроїв:

Python — Composite sentiment
def compute_daily_sentiment(symbol):
# 1. Настрої новин (вага 40%)
news_articles = fetch_recent_news(symbol)
news_sentiments = [get_finbert_sentiment(a["title"]) for a in news_articles]
news_score = np.mean([s["confidence"] for s in news_sentiments])
# 2. Настрої Twitter (вага 35%)
tweets = fetch_tweets_last_6h(symbol)
twitter_sentiments = [get_finbert_sentiment(t) for t in tweets]
twitter_score = np.mean([s["confidence"] for s in twitter_sentiments])
# 3. Настрої Reddit (вага 25%)
reddit_posts = fetch_reddit_hot(symbol)
reddit_sentiments = [get_finbert_sentiment(p) for p in reddit_posts]
reddit_score = np.mean([s["confidence"] for s in reddit_sentiments])
# Композитний показник
composite = (news_score * 0.4 + twitter_score * 0.35 + reddit_score * 0.25)
return composite

Integrating with Smart Money API

Додайте показник настроїв як ознаку до вашої системи підтвердження:

Python — Sentiment + Smart Money
def confirm_with_sentiment(symbol, direction):
# Отримати підтвердження Smart Money
response = requests.get(
f"https://api.smartmoneyapi.com/v1/confirm?symbol={symbol}&direction={direction}",
headers={"X-API-Key": API_KEY}
)
smart_money = response.json()
# Отримати сентимент
sentiment_score = compute_daily_sentiment(symbol)
# Підвищити впевненість, якщо сентимент збігається з напрямком
if (direction == "long" and sentiment_score > 0.55):
boost = 0.05 # +5% до впевненості
elif (direction == "short" and sentiment_score < 0.45):
boost = 0.05
else:
boost = 0 # Сентимент суперечить
final_composite = min(smart_money["composite"] + boost, 1.0)
return {"composite": final_composite, "sentiment_boost": boost}

Розширені техніки NLP

Аналіз сентименту за аспектами

Замість загального сентименту визначайте сентимент щодо конкретних аспектів: "Технологія Bitcoin чудова, але адаптація повільна." Виділяйте думки на рівні характеристик.

Виявлення причинно-наслідкових зв'язків

Визначайте причинні твердження: "Через XYZ ціна зміниться." Навчіть класифікатор відрізняти хайп від фундаментальних новин.

Часова серія сентименту

Відстежуйте зміну сентименту з часом. Різкий перехід від +0.65 до -0.45 — це сигнал до розвороту, на який варто звернути увагу.

Поєднайте сентимент із сигналами Smart Money

Smart Money API надає оцінки впевненості, перевірені на консенсусі китів та ончейн-метриках. Додайте аналіз сентименту, щоб підтвердити свою перевагу та підвищити частоту успішних угод на 4-6%.

Розпочати безкоштовно →