Навчання NLP-моделі для аналізу крипто-новин
Новинний потік — один з найбільш інформативних джерел для розуміння рухів ринку. Великі регуляторні рішення, хаки, оголошення про партнерства, технологічні оновлення — всё це матеріалізується в новинах за кілька хвилин до відображення в ціні. NLP-модель, здатна обробляти новинний потік в реальному часі, дає часову перевагу.
Збір новинних даних
Джерела та API:
- CryptoPanic API: агрегатор крипто-новин, API безплатний (з обмеженнями). JSON потік із заголовком, джерелом, валютами, датою.
- NewsAPI: широке покриття крипто-тематики. 100 запитів/день безплатно.
- CoinDesk / Cointelegraph RSS: прямий потік від ключових видань.
- Bloomberg Crypto (платний): institutional-level покриття.
- 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: позитивна/негативна/нейтральна (для ціни)
- Категорія: regulation, technology, security, partnership, market, macro
- Impact score: наскільки значна подія (low/medium/high)
- Затронуті активи: які токени затронуті
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) → негативна
- Institutional adoption (Tesla, MicroStrategy купили BTC) → позитивна
- Технологічні оновлення (Ethereum Merge, Lightning Network) → позитивна
- Security incidents (exchange hack, smart contract exploit) → негативна
- Market data (price new ATH, large inflows) → позитивна/негативна за контекстом
Ручна розмітка: вибіркова розмітка 2000–3000 прикладів для якості fine-tuning.
from datasets import Dataset
from transformers import Trainer, TrainingArguments
def create_news_dataset(articles_with_labels):
"""
articles_with_labels: список {'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
Виявлення подій
Виявлення специфічних подій з високим 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
При виявленні високовпливової подієї — негайний алерт незалежно від запланованої пакетної обробки.
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: пакетування запитів до 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 для видобування сутностей, виявлення подій для висока-impact подій, realtime pipeline та backtesting новинного сигналу.







