Розробка рекомендаційної системи крипто-активів
Рекомендаційна система для крипто-активів — це не Netflix "вам сподобається цей фільм". Це система, яка на основі профілю користувача (apetite до ризику, горизонт інвестування, поточний портфель) та поточних ринкових даних пропонує активи для покупки, продажу або ребалансування.
Постановка задачі
Контентні рекомендації: рекомендуємо активи, схожі на ті, які користувач уже тримає.
Колаборативна фільтрація: рекомендуємо активи, які тримають подібні користувачі.
Гібридний підхід: комбінація обох + ринкові сигнали.
Контекстно усвідомлено: враховуємо поточні умови ринку.
Профіль користувача
from dataclasses import dataclass
from enum import Enum
class RiskProfile(Enum):
CONSERVATIVE = 'conservative'
MODERATE = 'moderate'
AGGRESSIVE = 'aggressive'
DEGEN = 'degen'
@dataclass
class UserProfile:
user_id: str
risk_profile: RiskProfile
investment_horizon_days: int
portfolio_value_usd: float
current_holdings: dict
preferred_categories: list
excluded_categories: list
max_single_asset_pct: float
def get_available_budget(self):
invested = sum(self.current_holdings.values())
return max(0, self.portfolio_value_usd - invested)
Механізм оцінювання активів
class AssetScorer:
def score_asset(self, symbol, user_profile, market_regime):
"""Фінальна оцінка = зважена сума sub-scores"""
scores = {}
scores['momentum'] = self._momentum_score(symbol)
scores['risk_return'] = self._risk_adjusted_score(symbol, user_profile)
scores['diversification'] = self._diversification_score(symbol, user_profile.current_holdings)
scores['liquidity'] = self._liquidity_score(symbol, user_profile.portfolio_value_usd)
scores['sentiment'] = self._sentiment_score(symbol)
scores['fundamentals'] = self._fundamentals_score(symbol)
scores['regime_fit'] = self._regime_fit_score(symbol, market_regime)
weights = self._get_weights_for_profile(user_profile.risk_profile)
final_score = sum(scores[k] * weights.get(k, 0.1) for k in scores)
return {
'symbol': symbol,
'final_score': final_score,
'sub_scores': scores,
'weights': weights
}
Побудова портфеля з рекомендацій
def build_recommended_portfolio(user_profile, scored_assets, max_positions=10):
"""Побудувати оптимальний портфель"""
# Фільтрування
filtered = [a for a in scored_assets
if a['symbol'] not in user_profile.excluded_categories
and a['final_score'] > 0.3]
# Сортування за оцінкою
filtered.sort(key=lambda x: x['final_score'], reverse=True)
# Вибір топ-N з диверсифікацією
selected = []
for asset in filtered[:50]:
if len(selected) >= max_positions:
break
selected.append(asset)
# Розподіл за оцінкою
total_score = sum(a['final_score'] for a in selected)
available_budget = user_profile.get_available_budget()
allocations = []
for asset in selected:
raw_allocation = (asset['final_score'] / total_score) * available_budget
max_alloc = user_profile.portfolio_value_usd * user_profile.max_single_asset_pct
final_allocation = min(raw_allocation, max_alloc)
allocations.append({
'symbol': asset['symbol'],
'allocation_usd': final_allocation,
'allocation_pct': final_allocation / user_profile.portfolio_value_usd,
'score': asset['final_score']
})
return allocations
Пояснюваність
Користувачі мають розуміти логіку рекомендації:
def generate_recommendation_explanation(asset, score_result):
reasons = []
sub_scores = score_result['sub_scores']
if sub_scores['momentum'] > 0.7:
reasons.append(f"Strong momentum: +{get_return(asset, 30):.1f}% in 30 days")
if sub_scores['diversification'] > 0.7:
reasons.append(f"Low correlation with portfolio")
if sub_scores['fundamentals'] > 0.7:
reasons.append(f"High on-chain activity")
risk_warning = []
if get_volatility(asset) > 0.8:
risk_warning.append("High volatility")
return {
'reasons': reasons,
'risk_warnings': risk_warning,
'confidence': score_result['final_score']
}
Dashboard та UX
Панель рекомендацій: топ-10 рекомендацій з розбором оцінок, пояснення простою мовою, кнопка автоматичного виконання, очікувані характеристики портфеля.
Персоналізація: налаштування профілю ризику, горизонт інвестування, виключені категорії.
Відстеження продуктивності: бектестування алгоритму рекомендацій.
Розробка рекомендаційної системи з мультифакторним скорингом, профілюванням користувачів, побудовою портфеля з обмеженнями диверсифікації та пояснюваними рекомендаціями.







