Кластеризация криптовалют по волатильности на Python с K-Means

Кластеризация криптовалют по волатильности на Python с K-Means Анализ данных и Бэктесты
Пошаговое руководство по кластеризации криптовалют на основе их волатильности с помощью K-Means и scikit-learn на Python. Готовый скрипт для квант-анализа.
Суть: Скрипт загружает исторические данные криптовалют через yfinance, рассчитывает краткосрочную (30 дней) и среднесрочную (90 дней) годовую волатильность, масштабирует признаки с помощью StandardScaler и группирует активы на 3 кластера безопасности/риска методом KMeans из библиотеки scikit-learn.

Исходный код

Для количественного управляющего (Quant Developer) группировка активов по их рисковым характеристикам — базовая задача при построении рыночно-нейтральных портфелей или стратегий парного трейдинга. Ниже представлен готовый скрипт, который автоматически скачивает данные, вычисляет реализованную волатильность и проводит кластеризацию.

import pandas as pd
import numpy as np
import yfinance as yf
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

# Список тикеров для анализа
tickers = ['BTC-USD', 'ETH-USD', 'SOL-USD', 'ADA-USD', 'XRP-USD', 'DOGE-USD', 'LTC-USD', 'LINK-USD', 'AVAX-USD', 'DOT-USD']

# Загрузка исторических данных за последний год
data = yf.download(tickers, period='1y')['Adj Close']

# Расчет логарифмической доходности
returns = np.log(data / data.shift(1))

# Расчет годовой волатильности за последние 30 и 90 торговых дней
vol_30d = returns.tail(30).std() * np.sqrt(365)
vol_90d = returns.tail(90).std() * np.sqrt(365)

# Формирование датафрейма признаков
features = pd.DataFrame({
    'vol_30d': vol_30d,
    'vol_90d': vol_90d
}).dropna()

# Масштабирование признаков (K-Means чувствителен к масштабу)
scaler = StandardScaler()
scaled_features = scaler.fit_transform(features)

# Инициализация и обучение модели K-Means
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)
features['cluster'] = kmeans.fit_predict(scaled_features)

# Вывод результатов, отсортированных по кластерам
print(features.sort_values(by='cluster'))

Разбор параметров

  • tickers: Список анализируемых криптовалютных пар к доллару США (USD), загружаемых напрямую с Yahoo Finance.
  • vol_30d и vol_90d: Реализованная волатильность за последние 30 и 90 дней соответственно. Значения умножаются на np.sqrt(365) для приведения к годовому выражению (annualized volatility).
  • StandardScaler: Инструмент стандартизации данных. Приводит среднее значение признаков к 0, а дисперсию к 1. Это критически важно для KMeans, так как алгоритм использует евклидово расстояние.
  • n_clusters=3: Количество кластеров. В контексте риск-менеджмента это позволяет разделить активы на три условные группы: консервативные (низкий риск), умеренные и высокорисковые (высокая волатильность).
  • n_init=10: Количество инициализаций алгоритма с разными случайными центроидами для выбора наилучшего схождения.

Как запустить

Для запуска скрипта вам понадобятся установленные библиотеки анализа данных и машинного обучения. Выполните в терминале команду для их установки: pip install pandas numpy yfinance scikit-learn. После этого сохраните код в файл с именем cluster_vol.py и запустите его: python cluster_vol.py. В результате работы программы вы получите структурированную таблицу, где каждому тикеру будет присвоен номер кластера от 0 до 2.

Оцените статью
FinFluct