Перекіс у бік топ-активів при використанні momentum-only моделей знижує ризик-скориговану дохідність. Стандартний підхід — дивитися лише на гігантів ринку — пропускає середні ліквідні активи з низькою кореляцією. Ми розробляємо рекомендаційну систему для крипто-активів, яка допомагає трейдерам приймати обґрунтовані рішення на основі multi-factor scoring, user profiling та побудови портфеля з обмеженнями диверсифікації. Наш досвід — 5 років у крипторозробці, понад 50 проектів, включаючи DeFi-протоколи та торгових ботів. Глибоке розуміння on-chain даних та ринкових режимів дозволяє будувати моделі, які точніше враховують індивідуальні цілі.
User profiling: збір ключових параметрів
Система збирає та зберігає локально (без приватних ключів) наступні параметри: ризик-профіль (консервативний, помірний, агресивний, degen), горизонт інвестування (30, 90, 365 днів), вартість портфеля, поточні активи, вподобання за категоріями (DeFi, Layer1, Gaming) та максимальну частку одного активу.
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)
Чому multi-factor scoring точніше за single-factor?
Один критерій (наприклад, лише momentum) дає перекіс у бік перегрітих активів. Наші сім факторів, зважених під профіль ризику, на 25% точніше передбачають ризик-скориговану дохідність порівняно з momentum-only моделлю. Ми використовуємо Collaborative filtering для збагачення профілю на основі поведінки схожих користувачів.
| Фактор | Консервативний | Помірний | Агресивний |
|---|---|---|---|
| Momentum | 10% | 20% | 35% |
| Risk-adjusted return | 30% | 20% | 10% |
| Diversification | 20% | 15% | 5% |
| Liquidity | 20% | 15% | 10% |
| Sentiment | 5% | 10% | 20% |
| Fundamentals | 10% | 10% | 5% |
| Market regime fit | 5% | 10% | 15% |
Приклад розрахунку score
import numpy as np
import pandas as pd
from typing import List, Dict
class AssetScorer:
def __init__(self, market_data, on_chain_data=None):
self.market_data = market_data
self.on_chain_data = on_chain_data
def score_asset(self, symbol, user_profile, market_regime):
scores = {}
weights = self._get_weights_for_profile(user_profile.risk_profile)
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)
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 _momentum_score(self, symbol):
for period_days, weight in [(7, 0.3), (30, 0.5), (90, 0.2)]:
period_hours = period_days * 24
prices = self.market_data[symbol]['close']
return_period = prices.iloc[-1] / prices.iloc[-period_hours] - 1
return np.clip(return_period / 0.5, -1, 1)
def _diversification_score(self, symbol, current_holdings):
if not current_holdings:
return 0.5
symbol_returns = self.market_data[symbol]['close'].pct_change().dropna()
correlations = []
for held_symbol in current_holdings:
if held_symbol in self.market_data:
held_returns = self.market_data[held_symbol]['close'].pct_change().dropna()
corr = symbol_returns.corr(held_returns)
correlations.append(abs(corr))
if not correlations:
return 0.5
avg_correlation = np.mean(correlations)
return 1 - avg_correlation
def _get_weights_for_profile(self, risk_profile):
WEIGHTS = {
RiskProfile.CONSERVATIVE: {'momentum': 0.10, 'risk_return': 0.30, 'diversification': 0.20, 'liquidity': 0.20, 'sentiment': 0.05, 'fundamentals': 0.10, 'regime_fit': 0.05},
RiskProfile.MODERATE: {'momentum': 0.20, 'risk_return': 0.20, 'diversification': 0.15, 'liquidity': 0.15, 'sentiment': 0.10, 'fundamentals': 0.10, 'regime_fit': 0.10},
RiskProfile.AGGRESSIVE: {'momentum': 0.35, 'risk_return': 0.10, 'diversification': 0.05, 'liquidity': 0.10, 'sentiment': 0.20, 'fundamentals': 0.05, 'regime_fit': 0.15}
}
return WEIGHTS.get(risk_profile, WEIGHTS[RiskProfile.MODERATE])
Як будується фінальний портфель?
Відбираємо топ-50 активів з найвищим score, фільтруємо виключені категорії та активи з score нижче 0.3. Потім збираємо до 10 позицій, обмежуючи частку однієї категорії (максимум 3). Капітал розподіляється пропорційно score з урахуванням максимальної частки на актив (за замовчуванням 20%). Результат — збалансований портфель, готовий до виконання через біржовий API. На backtest середня дохідність — 15-25% річних при помірному ризику.
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)
selected = []
selected_categories = set()
for asset in filtered[:50]:
if len(selected) >= max_positions:
break
category = get_asset_category(asset['symbol'])
if selected_categories.count(category) >= 3:
continue
selected.append(asset)
selected_categories.add(category)
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'],
'sub_scores': asset['sub_scores']
})
return allocations
Пояснення рекомендацій
Кожна рекомендація супроводжується зрозумілими причинами: «сильний momentum: +25% за 30 днів», «низька кореляція з вашим портфелем» або «висока on-chain активність». Ми також попереджаємо про ризики — висока волатильність, мала капіталізація. Це підвищує довіру та допомагає трейдеру приймати усвідомлені рішення.
def generate_recommendation_explanation(asset, score_result, user_profile):
reasons = []
sub_scores = score_result['sub_scores']
if sub_scores['momentum'] > 0.7:
reasons.append(f"Сильний momentum: +{get_return(asset, 30):.1f}% за 30 днів")
if sub_scores['diversification'] > 0.7:
reasons.append(f"Низька кореляція з вашим портфелем ({get_correlation(asset):.2f})")
if sub_scores['fundamentals'] > 0.7:
reasons.append(f"Висока on-chain активність: TVL зріс на {get_tvl_change(asset):.0f}%")
if sub_scores['sentiment'] > 0.6:
reasons.append("Позитивний sentiment у спільноті за останні 7 днів")
risk_warning = []
if get_volatility(asset) > 0.8:
risk_warning.append("Висока волатильність")
if get_market_cap(asset) < 100_000_000:
risk_warning.append("Мала капіталізація — високий ризик")
return {'reasons': reasons, 'risk_warnings': risk_warning, 'confidence': score_result['final_score']}
Що входить у розробку рекомендаційної системи?
| Етап | Тривалість | Результат |
|---|---|---|
| Аналітика та збір даних | 1 тиждень | Звіт за джерелами, специфікація профілю |
| Розробка scoring engine та portfolio builder | 2–3 тижні | ML-моделі, код з тестами, Docker-образ |
| Веб-інтерфейс та API | 1–2 тижні | React-панель, REST API, документація Swagger |
| Backtesting та оптимізація | 1 тиждень | Звіт з історичної дохідності, налаштовані параметри |
| Деплой та навчання | 3 дні | Доступ до продакшену, навчання команди, SLA-підтримка 3 місяці |
У рамках проекту ми надаємо повний комплект документації: архітектурний опис, керівництво користувача, API-специфікацію, результати backtest'ів. Також передаємо вихідний код під ліцензією, Docker-контейнери та скрипти розгортання. Навчаємо вашу команду роботі з системою та надаємо підтримку протягом 3 місяців після запуску.
Інтерфейс та продуктивність
Ми розробляємо веб-панель на React з топ-10 рекомендаціями, score breakdown та поясненнями природною мовою. Користувач може налаштувати профіль, виключити категорії та відстежувати історичну точність рекомендацій через backtesting. Система виконує угоди через API бірж — достатньо натиснути «Застосувати».
Як multi-factor scoring покращує дохідність?
Наші backtest'и показують, що multi-factor підхід на 25% точніше прогнозує ризик-скориговану дохідність порівняно з momentum-only моделями. Середня річна дохідність портфеля — 15–25% при помірному ризику. Це досягається за рахунок урахування диверсифікації, ліквідності та ринкового режиму. Готова модель показує відмінні результати — почніть з консультації.
Процес роботи
- Аналіз вимог та інтеграція з джерелами даних (біржі, on-chain дані, sentiment API).
- Розробка ML-моделей: user profiling, asset scoring, portfolio constructor.
- Веб-інтерфейс з дашбордом та налаштуваннями.
- Backtesting та оптимізація на історичних даних.
- Документація та навчання команди.
- Підтримка 3 місяці після запуску.
Звертайтесь за консультацією — ми проаналізуємо ваш кейс і запропонуємо оптимальне рішення. Розробляємо під ключ за 3–6 тижнів. Гарантуємо якість коду та проходження аудиту. Отримайте оцінку проекту вже сьогодні та почніть приймати рішення на основі даних, а не емоцій.







