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.




