Исходный код
В этом разделе представлен Python-код, который демонстрирует, как получить исторические данные о ценах для выбранных криптовалют и индекса S&P 500 (SPY) с помощью библиотеки yfinance, рассчитать их ежедневную доходность, а затем использовать функцию numpy.cov для вычисления бета-коэффициента. Бета является ключевым показателем систематического риска актива по отношению к рынку. Понимание беты помогает инвесторам оценить, как их крипто-активы могут реагировать на движения широкого рынка, что критически важно для диверсификации и управления портфелем. Для более глубокого анализа и оптимизации торговых стратегий, основанных на таких показателях, рекомендуем ознакомиться с нашей статьей об Оптимизации гиперпараметров торговой стратегии: Байесовская оптимизация с Optuna в Python.
import yfinance as yf
import numpy as np
import pandas as pd
from datetime import datetime
def calculate_beta(crypto_ticker: str, benchmark_ticker: str, start_date: str, end_date: str) -> float:
"""
Рассчитывает бета-коэффициент для криптовалюты относительно бенчмарка.
Параметры:
crypto_ticker (str): Тикер криптовалюты (например, 'BTC-USD').
benchmark_ticker (str): Тикер бенчмарка (например, 'SPY').
start_date (str): Начальная дата в формате 'YYYY-MM-DD'.
end_date (str): Конечная дата в формате 'YYYY-MM-DD'.
Возвращает:
float: Бета-коэффициент.
"""
try:
# Загрузка данных
data = yf.download([crypto_ticker, benchmark_ticker], start=start_date, end=end_date, progress=False)
# Извлечение скорректированных цен закрытия
prices = data['Adj Close']
# Расчет ежедневной доходности
returns = prices.pct_change().dropna()
# Проверка наличия данных после dropna
if returns.empty:
print(f"Недостаточно данных для {crypto_ticker} или {benchmark_ticker} в указанный период.")
return np.nan
# Извлечение доходности для крипто-актива и бенчмарка
crypto_returns = returns[crypto_ticker]
benchmark_returns = returns[benchmark_ticker]
# Убедимся, что данные выровнены и не содержат NaN
# Это важно, так как yfinance может возвращать NaN для дней, когда один из активов не торговался.
# dropna() на DataFrame returns уже должен был это сделать, но для безопасности и ясности
# создадим DataFrame из двух серий и снова удалим NaN, чтобы гарантировать идеальное выравнивание.
aligned_returns = pd.DataFrame({
'crypto': crypto_returns,
'benchmark': benchmark_returns
}).dropna()
if aligned_returns.empty:
print(f"Недостаточно выровненных данных для {crypto_ticker} или {benchmark_ticker} после обработки NaN.")
return np.nan
# Расчет ковариационной матрицы с помощью numpy.cov
# np.cov(a, b) возвращает матрицу [[var(a), cov(a,b)], [cov(b,a), var(b)]]
covariance_matrix = np.cov(aligned_returns['crypto'], aligned_returns['benchmark'])
# Ковариация между крипто-активом и бенчмарком
covariance = covariance_matrix[0, 1]
# Дисперсия бенчмарка
variance = covariance_matrix[1, 1]
if variance == 0:
print(f"Дисперсия доходности бенчмарка ({benchmark_ticker}) равна нулю. Бета не может быть рассчитана.")
return np.nan
beta = covariance / variance
return beta
except Exception as e:
print(f"Произошла ошибка при расчете беты для {crypto_ticker}: {e}")
return np.nan
if __name__ == "__main__":
crypto_assets = ['BTC-USD', 'ETH-USD', 'ADA-USD']
benchmark = 'SPY'
start_date = '2020-01-01'
end_date = datetime.now().strftime('%Y-%m-%d')
print(f"Расчет бета-коэффициентов относительно {benchmark} с {start_date} по {end_date}:\n")
for asset in crypto_assets:
beta_value = calculate_beta(asset, benchmark, start_date, end_date)
if not np.isnan(beta_value):
print(f"Бета для {asset} относительно {benchmark}: {beta_value:.4f}")
else:
print(f"Не удалось рассчитать бету для {asset}.")
print("\n---")
print("Примечание: Бета-коэффициент является историческим показателем и может меняться со временем.")
print("Для более продвинутых методов анализа временных рядов и предотвращения переобучения,")
print("рекомендуем изучить Walk-Forward Оптимизацию в Backtrader.")
print("Также, для анализа взаимосвязей между крипто-парами, полезно ознакомиться с Расчетом Z-Score для пары ETH/BTC.")
Разбор параметров
crypto_ticker: Строка, представляющая тикер криптовалюты (например,'BTC-USD'), для которой рассчитывается бета.benchmark_ticker: Строка, представляющая тикер бенчмарка (например,'SPY'), относительно которого рассчитывается бета.start_date: Строка в формате'YYYY-MM-DD', указывающая начальную дату для загрузки исторических данных.end_date: Строка в формате'YYYY-MM-DD', указывающая конечную дату для загрузки исторических данных.yf.download(): Функция из библиотекиyfinanceдля загрузки исторических данных о ценах акций и криптовалют.pct_change(): Методpandas.Seriesилиpandas.DataFrame, используемый для расчета процентного изменения между текущим и предыдущим элементом, что дает ежедневную доходность.np.cov(): Функция из библиотекиnumpy, которая вычисляет ковариационную матрицу для двух или более наборов данных. В данном случае используется для получения ковариации между доходностью крипто-актива и бенчмарка, а также дисперсии бенчмарка.
Как запустить
Для запуска этого кода убедитесь, что у вас установлен Python 3.x.
Установите необходимые библиотеки, если они еще не установлены:
pip install yfinance numpy pandas
Сохраните приведенный выше код в файл с расширением .py (например, calculate_beta.py).
Откройте терминал или командную строку, перейдите в директорию, где сохранен файл, и выполните команду:
python calculate_beta.py
Результаты будут выведены в консоль, показывая бета-коэффициент для каждого указанного крипто-актива относительно SPY. Помните, что бета > 1 указывает на большую волатильность относительно рынка, бета < 1 — на меньшую, а бета = 0 означает отсутствие корреляции с рынком. Отрицательная бета встречается редко, но означает движение в противоположном направлении.
Для более продвинутых методов анализа временных рядов и предотвращения переобучения, рекомендуем изучить Walk-Forward Оптимизацию в Backtrader. Также, для анализа взаимосвязей между крипто-парами, полезно ознакомиться с Расчетом Z-Score для пары ETH/BTC.




