Обучение NLP-модели для анализа крипто-новостей
Новостной поток — один из наиболее информативных источников для понимания рыночных движений. Крупные регуляторные события, хаки, partnership announcements, технологические обновления — всё это материализуется в новостях за несколько минут до отражения в цене. NLP модель, способная обрабатывать новостной поток в реальном времени, даёт временно́е преимущество.
Сбор новостных данных
Источники и API:
- CryptoPanic API: агрегатор крипто-новостей, API бесплатный (с лимитами). JSON feed с заголовком, источником, валютами, датой.
- NewsAPI: широкое покрытие крипто тематики. 100 запросов/день бесплатно.
- CoinDesk / Cointelegraph RSS: прямой feed от ключевых изданий.
- Bloomberg Crypto (платный): институциональный уровень coverage.
- Custom scraper: BeautifulSoup + Playwright для сайтов без API.
import httpx
import feedparser
from datetime import datetime
async def fetch_cryptopanic_news(api_key, currencies=['BTC','ETH'], limit=50):
url = f"https://cryptopanic.com/api/v1/posts/?auth_token={api_key}"
url += f"¤cies={','.join(currencies)}&kind=news&limit={limit}"
async with httpx.AsyncClient() as client:
response = await client.get(url)
data = response.json()
articles = []
for post in data.get('results', []):
articles.append({
'title': post['title'],
'source': post['source']['title'],
'published_at': post['published_at'],
'url': post['url'],
'currencies': [c['code'] for c in post.get('currencies', [])],
'votes': post.get('votes', {})
})
return articles
Модель классификации новостей
Задача: классифицировать каждую новость по нескольким измерениям:
- Sentiment: positive/negative/neutral (для цены)
- Категория: regulation, technology, security, partnership, market, macro
- Impact score: насколько значимо событие (low/medium/high)
- Affected assets: какие токены затронуты
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
class NewsClassifier:
def __init__(self):
# Fine-tuned FinBERT на крипто-новостях
self.sentiment_model = AutoModelForSequenceClassification.from_pretrained(
'crypto_finbert_sentiment'
)
self.category_model = AutoModelForSequenceClassification.from_pretrained(
'crypto_news_category'
)
self.tokenizer = AutoTokenizer.from_pretrained('ProsusAI/finbert')
def classify(self, title, body=''):
# Используем заголовок + первые 200 символов тела
text = title + ' ' + body[:200]
inputs = self.tokenizer(text, return_tensors='pt',
max_length=256, truncation=True, padding=True)
with torch.no_grad():
sentiment_logits = self.sentiment_model(**inputs).logits
category_logits = self.category_model(**inputs).logits
sentiment = torch.softmax(sentiment_logits, -1)
category = torch.softmax(category_logits, -1)
return {
'sentiment': {
'positive': sentiment[0][0].item(),
'negative': sentiment[0][1].item(),
'neutral': sentiment[0][2].item()
},
'category': self.category_labels[category.argmax().item()],
'sentiment_score': sentiment[0][0].item() - sentiment[0][1].item()
}
Fine-tuning на крипто-новостях
Создание обучающего датасета с разметкой:
Автоматическая разметка (weak supervision):
- Регуляторные решения против крипты (SEC lawsuit, China ban) → negative
- Institutional adoption (Tesla, MicroStrategy купили BTC) → positive
- Технологические upgrades (Ethereum Merge, Lightning Network) → positive
- Security incidents (exchange hack, smart contract exploit) → negative
- Market data (price new ATH, large inflows) → positive/negative по контексту
Ручная разметка: выборочная разметка 2000–3000 примеров для качества fine-tuning.
from datasets import Dataset
from transformers import Trainer, TrainingArguments
def create_news_dataset(articles_with_labels):
"""
articles_with_labels: list of {'text': str, 'label': int}
"""
return Dataset.from_list(articles_with_labels)
training_args = TrainingArguments(
output_dir='./crypto_news_model',
num_train_epochs=5,
per_device_train_batch_size=16,
learning_rate=2e-5,
warmup_ratio=0.1,
weight_decay=0.01,
evaluation_strategy='epoch',
save_strategy='best',
metric_for_best_model='f1'
)
Named Entity Recognition (NER) для крипто
Извлечение упомянутых токенов, компаний, сумм из новостей:
# Кастомная NER модель для крипто-контекста
# Entities: COIN (Bitcoin, ETH), EXCHANGE (Binance, FTX),
# AMOUNT ($1B, 100,000 BTC), PROTOCOL (Uniswap, Aave)
from transformers import pipeline
ner_pipeline = pipeline('ner', model='crypto_ner_model', aggregation_strategy='simple')
def extract_crypto_entities(text):
entities = ner_pipeline(text)
coins = [e['word'] for e in entities if e['entity_group'] == 'COIN']
amounts = [e['word'] for e in entities if e['entity_group'] == 'AMOUNT']
return coins, amounts
Event detection
Выявление специфических событий с высоким impact:
HIGH_IMPACT_PATTERNS = {
'hack': ['hack', 'exploit', 'stolen', 'drained', 'attacked', 'vulnerability'],
'regulation': ['SEC', 'banned', 'illegal', 'regulatory', 'compliance', 'lawsuit'],
'adoption': ['buys', 'acquired', 'invested', 'custody', 'ETF approved'],
'insolvency': ['bankrupt', 'insolvent', 'withdrawal halt', 'bankruptcy']
}
def detect_high_impact_event(text):
text_lower = text.lower()
for event_type, keywords in HIGH_IMPACT_PATTERNS.items():
if any(kw in text_lower for kw in keywords):
return event_type
return None
При обнаружении high-impact события — немедленный alert вне зависимости от scheduled batch processing.
Realtime processing pipeline
News Feed (CryptoPanic, RSS)
→ Kafka topic: raw_news
→ Spark Streaming / Faust consumer
→ NLP classification (batch GPU inference)
→ PostgreSQL: classified_news
→ Redis: latest_sentiment_scores
→ WebSocket: realtime updates to dashboard
→ Alert system: high-impact events → Telegram
Для production: batching запросов к NLP модели (8–32 статьи за раз). GPU inference T4 обрабатывает ~500 статей/секунду.
Backtesting новостного сигнала
Проверяем: действительно ли классификация новостей предшествовала движениям цены?
def backtest_news_signal(classified_news, price_data, lookback_hours=24):
results = []
for news in classified_news:
if news['sentiment_score'] > 0.5: # positive signal
# Цена через 1, 4, 24 часа после новости
t = news['published_at']
for h in [1, 4, 24]:
future_return = get_return(price_data, t, h)
results.append({
'signal': 'positive',
'horizon': h,
'actual_return': future_return
})
return pd.DataFrame(results)
Разрабатываем NLP систему для крипто-новостей с fine-tuned моделью на крипто-контенте, NER для извлечения сущностей, event detection для high-impact событий, realtime pipeline и backtesting новостного сигнала.







