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 и запустите его. Скрипт автоматически загрузит актуальные исторические данные, выполнит расчеты и построит интерактивный график динамики корреляции.




