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.




