Расчет Z-Score для пары ETH/BTC на Python с statsmodels

Расчет Z-Score для пары ETH/BTC на Python с statsmodels Анализ данных и Бэктесты
Пошаговое руководство по расчету метрики Z-Score для статистического арбитража между ETH и BTC с использованием библиотеки statsmodels на Python.
Суть: Расчет Z-Score для пары ETH/BTC включает динамическую оценку коэффициента хеджирования с помощью скользящей OLS-регрессии в statsmodels, вычисление отклонения спреда от его скользящего среднего и нормирование на стандартное отклонение. Это позволяет находить математически обоснованные точки входа в Mean Reversion сделки.

Исходный код

Ниже представлен готовый к использованию класс на Python, который рассчитывает динамический коэффициент хеджирования (Beta) и итоговый Z-Score для пары ETH/BTC. Код оптимизирован для работы с временными рядами в pandas.

import numpy as np
import pandas as pd
import statsmodels.api as sm

class StatArbZScore:
    def __init__(self, hedge_window: int = 60, z_window: int = 20):
        self.hedge_window = hedge_window
        self.z_window = z_window

    def calculate_zscore(self, eth_prices: pd.Series, btc_prices: pd.Series) -> pd.DataFrame:
        df = pd.DataFrame({'ETH': eth_prices, 'BTC': btc_prices}).dropna()
        n = len(df)
        
        hedge_ratios = np.full(n, np.nan)
        spreads = np.full(n, np.nan)
        
        # Скользящая OLS регрессия для расчета беты
        for i in range(self.hedge_window, n):
            y = df['ETH'].iloc[i - self.hedge_window:i]
            x = df['BTC'].iloc[i - self.hedge_window:i]
            x = sm.add_constant(x)
            
            model = sm.OLS(y, x).fit()
            beta = model.params['BTC']
            alpha = model.params['const']
            
            current_eth = df['ETH'].iloc[i]
            current_btc = df['BTC'].iloc[i]
            
            spreads[i] = current_eth - (beta * current_btc + alpha)
            hedge_ratios[i] = beta
            
        df['hedge_ratio'] = hedge_ratios
        df['spread'] = spreads
        
        # Расчет скользящего Z-Score для спреда
        df['spread_mean'] = df['spread'].rolling(window=self.z_window).mean()
        df['spread_std'] = df['spread'].rolling(window=self.z_window).std(ddof=1)
        df['z_score'] = (df['spread'] - df['spread_mean']) / df['spread_std']
        
        return df.dropna()

# Пример генерации синтетических данных и запуска
if __name__ == '__main__':
    np.random.seed(42)
    dates = pd.date_range(start='2023-01-01', periods=150, freq='D')
    btc = 16000 + np.cumsum(np.random.normal(0, 150, 150))
    eth = btc * 0.07 + np.random.normal(0, 50, 150)
    
    eth_series = pd.Series(eth, index=dates)
    btc_series = pd.Series(btc, index=dates)
    
    analyzer = StatArbZScore(hedge_window=30, z_window=15)
    results = analyzer.calculate_zscore(eth_series, btc_series)
    print(results[['spread', 'hedge_ratio', 'z_score']].tail())

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

  • hedge_window: Размер скользящего окна для оценки коэффициента хеджирования (Beta) методом OLS. Определяет, за какой период оценивается взаимосвязь активов.
  • z_window: Окно для расчета скользящего среднего и стандартного отклонения спреда при вычислении Z-Score.
  • eth_prices: Временной ряд цен закрытия Ethereum (объект pd.Series).
  • btc_prices: Временной ряд цен закрытия Bitcoin (объект pd.Series).

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

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

pip install pandas numpy statsmodels

После получения сигналов Z-Score крайне важно провести качественное тестирование стратегии. О том, как это сделать, читайте в статье Бэктестинг Mean Reversion стратегий на Python с VectorBT.

Также стоит учитывать, что параметры коинтеграции могут меняться в зависимости от рыночных условий. Для адаптации стратегии под текущие фазы рынка полезно использовать Моделирование рыночных режимов с помощью марковских цепей на Python.

А если вы захотите оптимизировать веса или параметры входа с помощью нейросетей, вам пригодится Реализация кастомной функции потерь Sharpe Ratio в PyTorch.

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