Расчет Бета-коэффициента Крипто-портфеля к S&P 500 (SPY) с NumPy Cov

Расчет Бета-коэффициента Крипто-портфеля к S&P 500 (SPY) с NumPy Cov Анализ данных и Бэктесты
Подробное руководство по расчету бета-коэффициента для криптовалютного портфеля относительно индекса S&P 500 (SPY) с использованием библиотеки NumPy и Python. Включает исходный код, разбор параметров и инструкцию по запуску.
Суть: Расчет бета-коэффициента для крипто-активов относительно S&P 500 (SPY) включает вычисление ковариации между доходностью крипто-актива и доходностью SPY, деленной на дисперсию доходности SPY. Это позволяет оценить рыночный риск крипто-портфеля.

Исходный код

В этом разделе представлен 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.

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