Разработка модели кластеризации криптовалют по поведению

Проектируем и разрабатываем блокчейн-решения полного цикла: от архитектуры смарт-контрактов до запуска DeFi-протоколов, NFT-маркетплейсов и криптобирж. Аудит безопасности, токеномика, интеграция с существующей инфраструктурой.
Показано 1 из 1Все 1306 услуг
Разработка модели кластеризации криптовалют по поведению
Средний
~5 дней
Часто задаваемые вопросы

Направления блокчейн-разработки

Этапы блокчейн-разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1288
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1198
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    902
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1122
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    589
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    859

Разработка модели кластеризации криптовалют по поведению

Кластеризация криптовалют по поведенческим паттернам позволяет автоматически группировать активы со схожими характеристиками. Это полезно для: построения диверсифицированных портфелей, поиска замен активов в пределах кластера, понимания рыночной структуры.

Feature engineering для кластеризации

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler

def create_behavioral_features(prices_dict, lookback_days=90):
    features = {}
    
    for symbol, price_series in prices_dict.items():
        returns = price_series.pct_change().dropna()
        
        if len(returns) < lookback_days * 24:  # hourly data
            continue
        
        recent_returns = returns.iloc[-lookback_days*24:]
        
        features[symbol] = {
            # Return characteristics
            'annualized_return': recent_returns.mean() * 365 * 24,
            'annualized_vol': recent_returns.std() * np.sqrt(365 * 24),
            'sharpe': recent_returns.mean() / (recent_returns.std() + 1e-8) * np.sqrt(365*24),
            
            # Distribution shape
            'skewness': recent_returns.skew(),
            'kurtosis': recent_returns.kurt(),
            
            # Tail risk
            'var_95': np.percentile(recent_returns, 5),
            'cvar_95': recent_returns[recent_returns <= np.percentile(recent_returns, 5)].mean(),
            
            # Trend characteristics
            'momentum_30d': price_series.iloc[-720:].pct_change(720).iloc[-1],  # 30d return
            'trend_strength': abs(recent_returns.mean()) / (recent_returns.std() + 1e-8),
            
            # Drawdown
            'max_drawdown': calculate_max_drawdown(price_series.iloc[-lookback_days*24:]),
            
            # Correlation with BTC (if available)
            'btc_corr': recent_returns.corr(prices_dict.get('BTC', pd.Series()).pct_change().dropna()),
            
            # Volume-based (если доступны volume данные)
            'avg_daily_volume_usd': get_avg_daily_volume(symbol),
        }
    
    return pd.DataFrame(features).T

Алгоритмы кластеризации

K-Means — классика, быстрый, предполагает сферические кластеры:

from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

def kmeans_clustering(features_df, n_clusters=6, seed=42):
    # Нормализация
    scaler = StandardScaler()
    features_scaled = scaler.fit_transform(features_df.fillna(0))
    
    # Optimal k через Elbow method
    inertias = []
    k_range = range(2, 15)
    for k in k_range:
        km = KMeans(n_clusters=k, random_state=seed, n_init=10)
        km.fit(features_scaled)
        inertias.append(km.inertia_)
    
    # Выбираем k на «колене»
    best_k = find_elbow(inertias, k_range)
    
    km = KMeans(n_clusters=best_k, random_state=seed, n_init=10)
    labels = km.fit_predict(features_scaled)
    
    return labels, km, scaler

DBSCAN — обнаруживает кластеры произвольной формы и выбросы:

from sklearn.cluster import DBSCAN

def dbscan_clustering(features_scaled, eps=0.5, min_samples=3):
    db = DBSCAN(eps=eps, min_samples=min_samples, metric='euclidean')
    labels = db.fit_predict(features_scaled)
    # label -1 = noise (outilers)
    n_clusters = len(set(labels)) - (1 if -1 in labels else 0)
    n_noise = (labels == -1).sum()
    return labels, n_clusters, n_noise

Hierarchical clustering с dendrogram:

from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
import matplotlib.pyplot as plt

def hierarchical_clustering(features_scaled, symbols, method='ward', n_clusters=6):
    Z = linkage(features_scaled, method=method)
    
    # Визуализация dendrogram
    fig, ax = plt.subplots(figsize=(16, 8))
    dendrogram(Z, labels=symbols, orientation='top', ax=ax)
    plt.tight_layout()
    
    labels = fcluster(Z, t=n_clusters, criterion='maxclust')
    return labels, Z

Dimension reduction для визуализации

from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
import umap

def reduce_dimensions(features_scaled, method='umap', n_components=2):
    if method == 'pca':
        reducer = PCA(n_components=n_components, random_state=42)
    elif method == 'tsne':
        reducer = TSNE(n_components=n_components, random_state=42, 
                      perplexity=min(30, len(features_scaled)//4))
    elif method == 'umap':
        reducer = umap.UMAP(n_components=n_components, random_state=42,
                           n_neighbors=min(15, len(features_scaled)//3))
    
    embedding = reducer.fit_transform(features_scaled)
    return embedding

Scatter plot 2D embedding с цветовой маркировкой кластеров — главная визуализация результатов.

Интерпретация кластеров

После кластеризации анализируем характеристики каждого кластера:

def describe_clusters(features_df, labels):
    features_df['cluster'] = labels
    
    cluster_stats = features_df.groupby('cluster').agg({
        'annualized_return': 'mean',
        'annualized_vol': 'mean',
        'sharpe': 'mean',
        'btc_corr': 'mean',
        'max_drawdown': 'mean',
        'skewness': 'mean'
    }).round(3)
    
    # Именуем кластеры по характеристикам
    cluster_names = {}
    for cluster_id, row in cluster_stats.iterrows():
        if row['btc_corr'] > 0.85 and row['annualized_vol'] > 1.5:
            name = 'High-beta altcoins'
        elif row['btc_corr'] > 0.8 and row['annualized_vol'] < 1.0:
            name = 'Blue-chip crypto'
        elif row['btc_corr'] < 0.5:
            name = 'Decorrelated assets'
        elif row['sharpe'] > 2.0:
            name = 'Strong performers'
        else:
            name = f'Cluster {cluster_id}'
        cluster_names[cluster_id] = name
    
    return cluster_stats, cluster_names

Практическое применение

Портфельная диверсификация: выбираем по 1–2 актива из каждого кластера для максимальной диверсификации.

Rotation стратегии: покупаем лучший актив из топ-кластера по momentum, ротируем ежемесячно.

Peer group analysis: когда один актив из кластера резко растёт, ищем лаггеров в том же кластере — потенциальные кандидаты на следующее движение.

Разрабатываем систему кластеризации с K-Means/DBSCAN/Hierarchical методами, UMAP визуализацией, автоматической интерпретацией кластеров и monthly ребалансировкой.