Исходный код
В количественном анализе (Quantitative Finance) оценка эффективности портфеля относительно бенчмарка — базовая задача. Для криптовалютного рынка главным бенчмарком выступает Bitcoin (BTC). Коэффициент Beta показывает чувствительность портфеля к движениям BTC, Alpha измеряет избыточную доходность, очищенную от рыночного риска, а Information Ratio (IR) оценивает способность управляющего или алгоритма стабильно генерировать доходность выше бенчмарка на единицу принятого активного риска (Tracking Error).
Для эффективного хранения исторических данных свечей BTC и альткоинов перед расчетом метрик рекомендуется использовать оптимизированные форматы. Подробнее об этом читайте в статье Конвертация HDF5 в Parquet с партиционированием по датам в Pandas.
Ниже представлен профессиональный скрипт на Python, который рассчитывает эти метрики с использованием библиотек pandas, numpy и statsmodels.
import numpy as np
import pandas as pd
import statsmodels.api as sm
def calculate_portfolio_metrics(portfolio_returns: pd.Series,
benchmark_returns: pd.Series,
risk_free_rate_annual: float = 0.05,
periods_per_year: int = 365) -> dict:
"""
Расчет Alpha, Beta и Information Ratio для портфеля относительно бенчмарка (BTC).
:param portfolio_returns: pd.Series с дневными доходностями портфеля
:param benchmark_returns: pd.Series с дневными доходностями бенчмарка (BTC)
:param risk_free_rate_annual: Годовая безрисковая ставка (например, доходность стейблкоинов)
:param periods_per_year: Количество торговых периодов в году (365 для крипты)
:return: Словарь с рассчитанными метриками
"""
# Выравнивание данных по индексам дат
df = pd.concat([portfolio_returns, benchmark_returns], axis=1, keys=['portfolio', 'benchmark']).dropna()
p_ret = df['portfolio']
b_ret = df['benchmark']
# Перевод безрисковой ставки в дневную
rf_daily = (1 + risk_free_rate_annual) ** (1 / periods_per_year) - 1
# Расчет избыточных доходностей
p_excess = p_ret - rf_daily
b_excess = b_ret - rf_daily
# 1. Расчет Alpha и Beta через OLS регрессию
X = sm.add_constant(b_excess)
model = sm.OLS(p_excess, X).fit()
# Коэффициенты регрессии
alpha_daily = model.params['const']
beta = model.params['benchmark']
# Аннуализация Alpha (Jensen's Alpha)
alpha_annualized = (1 + alpha_daily) ** periods_per_year - 1
# 2. Расчет Information Ratio (IR)
# Активная доходность (Active Return)
active_return_daily = p_ret - b_ret
active_return_annualized = active_return_daily.mean() * periods_per_year
# Tracking Error (активный риск)
tracking_error_daily = active_return_daily.std()
tracking_error_annualized = tracking_error_daily * np.sqrt(periods_per_year)
# Information Ratio
if tracking_error_annualized > 0:
information_ratio = active_return_annualized / tracking_error_annualized
else:
information_ratio = np.nan
return {
'Beta': round(beta, 4),
'Alpha (Annualized)': round(alpha_annualized, 4),
'Tracking Error (Annualized)': round(tracking_error_annualized, 4),
'Information Ratio': round(information_ratio, 4)
}
# Пример генерации синтетических данных для демонстрации
if __name__ == "__main__":
np.random.seed(42)
dates = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D')
# Симулируем доходность BTC (бенчмарк)
btc_returns = pd.Series(np.random.normal(0.001, 0.03, len(dates)), index=dates)
# Симулируем доходность портфеля (альты с бетой ~1.2 и альфой)
portfolio_returns = 1.2 * btc_returns + pd.Series(np.random.normal(0.0005, 0.015, len(dates)), index=dates)
metrics = calculate_portfolio_metrics(portfolio_returns, btc_returns, risk_free_rate_annual=0.05)
print("Результаты расчета метрик:")
for metric, value in metrics.items():
print(f"{metric}: {value}")
Разбор параметров
portfolio_returns: Временной ряд (pd.Series) ежедневных процентных изменений стоимости вашего портфеля. Важно, чтобы индексы дат совпадали с бенчмарком.benchmark_returns: Временной ряд ежедневных доходностей индекса Bitcoin. Выступает в роли рыночного портфеля.risk_free_rate_annual: Годовая безрисковая процентная ставка. В криптоиндустрии в качестве безрисковой ставки часто берут среднюю ставку кредитования по стейблкоинам (USDT/USDC) на крупных биржах или протоколах DeFi (например, 5-8%).periods_per_year: Коэффициент аннуализации. Для традиционных рынков акций используется значение 252 (рабочие дни), но для круглосуточного криптовалютного рынка этот параметр строго равен 365.
Как запустить
Для запуска скрипта вам понадобятся установленные библиотеки анализа данных. Установите их через терминал:
pip install numpy pandas statsmodels После этого скопируйте исходный код в файл metrics_calc.py и запустите его. Скрипт сгенерирует синтетические доходности, имитирующие поведение криптоактивов, и выведет рассчитанные коэффициенты в консоль.
После расчета базовых метрик, для полноценного тестирования стратегий с учетом реальных рыночных условий, вам потребуется Настройка комиссий и проскальзывания в Zipline-Reloaded для крипты.
Если вы помимо линейных метрик Alpha/Beta работаете с деривативами на BTC, вам также будет полезен материал про Расчет и Визуализация Поверхности Подразумеваемой Волатильности (IV Surface) Опционов в Python Matplotlib.




