Скользящая корреляция BTC и S&P 500 на Python в Pandas

Скользящая корреляция BTC и S&P 500 на Python в Pandas Анализ данных и Бэктесты
Пошаговое руководство по расчету скользящего коэффициента корреляции (Rolling Correlation) между Bitcoin и индексом S&P 500 с использованием Python и библиотеки pandas.
Суть: Для расчета скользящей корреляции в pandas используется комбинация методов .rolling() и .corr(), примененная к доходностям активов. Это позволяет отслеживать динамику взаимосвязи цифрового золота и традиционного фондового рынка во времени.

Исходный код

Для анализа мы загрузим исторические данные по BTC-USD и индексу S&P 500 (^GSPC) через библиотеку yfinance, приведем их к единой временной сетке, рассчитаем ежедневные процентные изменения (доходности) и вычислим скользящую корреляцию Пирсона с окном в 60 торговых дней. Такой подход часто используется для определения смены рыночных режимов, которые также можно исследовать, изучив Бэктестинг стратегии на скрытых марковских моделях (HMM) в Python.

import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt

def calculate_rolling_correlation(btc_ticker='BTC-USD', sp500_ticker='^GSPC', window=60, start_date='2020-01-01'):
    # Загрузка данных из Yahoo Finance
    tickers = [btc_ticker, sp500_ticker]
    raw_data = yf.download(tickers, start=start_date)['Adj Close']
    
    # Переименование колонок для удобства
    df = raw_data.rename(columns={btc_ticker: 'BTC', sp500_ticker: 'SP500'})
    
    # Синхронизация временных рядов (удаляем выходные дни, когда S&P 500 не торгуется)
    df = df.dropna()
    
    # Расчет ежедневных доходностей (процентных изменений)
    returns = df.pct_change().dropna()
    
    # Расчет скользящей корреляции Пирсона
    rolling_corr = returns['BTC'].rolling(window=window).corr(returns['SP500'])
    
    # Объединяем результаты в один DataFrame
    result_df = pd.DataFrame({
        'BTC_Return': returns['BTC'],
        'SP500_Return': returns['SP500'],
        'Rolling_Corr': rolling_corr
    })
    
    return result_df

if __name__ == '__main__':
    # Вычисление корреляции с 60-дневным окном
    window_size = 60
    data = calculate_rolling_correlation(window=window_size)
    
    # Визуализация результатов
    plt.figure(figsize=(12, 6))
    plt.plot(data.index, data['Rolling_Corr'], label=f'{window_size}-Day Rolling Correlation', color='purple')
    plt.axhline(0, color='grey', linestyle='--', linewidth=0.8)
    plt.title('Rolling Correlation between BTC and S&P 500')
    plt.xlabel('Date')
    plt.ylabel('Correlation Coefficient')
    plt.legend(loc='upper left')
    plt.grid(True, alpha=0.3)
    plt.show()

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

В процессе вычисления скользящей корреляции ключевую роль играют следующие параметры и методы:

  • window: Размер скользящего окна (в днях). Определяет чувствительность метрики. Короткие окна (например, 20 дней) показывают локальные всплески совместного движения, длинные (от 60 до 252 дней) — долгосрочные макроэкономические тренды.
  • .pct_change(): Метод pandas для расчета процентного изменения цен. Корреляцию необходимо считать строго на стационарных данных (доходностях), а не на сырых ценах, чтобы избежать ложной корреляции из-за общего восходящего тренда.
  • .rolling(): Создает скользящее окно фиксированного размера для проведения последующих статистических расчетов.
  • .corr(): Вычисляет коэффициент корреляции Пирсона между двумя рядами внутри каждого окна. Значение колеблется от -1 (полная обратная связь) до +1 (полная прямая связь).
  • .dropna(): Критически важный шаг предобработки. Поскольку BTC торгуется круглосуточно, а S&P 500 только по будням, необходимо синхронизировать даты, исключив дни без торгов по индексу. Для более глубокого анализа структуры активов перед расчетом корреляций полезно ознакомиться со статьей Кластеризация криптовалют по волатильности на Python с K-Means.

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

Для запуска скрипта вам понадобятся библиотеки pandas, yfinance и matplotlib. Установите их через терминал:

pip install pandas yfinance matplotlib

После установки зависимостей скопируйте исходный код в файл rolling_corr.py и запустите его. Скрипт автоматически загрузит актуальные исторические данные, выполнит расчеты и построит интерактивный график динамики корреляции.

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