hmmlearn для сегментации исторических данных индекса S&P 500.Исходный код
Ниже представлен готовый к продакшену код, который загружает исторические данные, рассчитывает логарифмическую доходность, обучает модель GaussianHMM и визуализирует полученные рыночные режимы. Для эффективного управления историческими данными в реальных проектах рекомендуется Интеграция ArcticDB для хранения tick data в pandas.
import numpy as np
import pandas as pd
import yfinance as yf
from hmmlearn import hmm
import matplotlib.pyplot as plt
def get_market_regimes(ticker='^GSPC', start_date='2015-01-01', end_date='2023-12-31'):
# Загрузка данных
data = yf.download(ticker, start=start_date, end=end_date)
if data.empty:
raise ValueError('Не удалось загрузить данные.')
# Расчет логарифмической доходности
data['Returns'] = np.log(data['Close'] / data['Close'].shift(1))
data.dropna(inplace=True)
# Подготовка данных для hmmlearn (требуется 2D массив)
X = data['Returns'].values.reshape(-1, 1)
# Инициализация и обучение Gaussian HMM с 2 состояниями
model = hmm.GaussianHMM(
n_components=2,
covariance_type='full',
n_iter=1000,
random_state=42
)
model.fit(X)
# Предсказание скрытых состояний
states = model.predict(X)
data['State'] = states
# Определение характеристик состояний для идентификации Bull/Bear
state_means = model.means_.flatten()
# Bear-режим обычно характеризуется меньшей доходностью
bear_state = np.argmin(state_means)
bull_state = 1 - bear_state
# Маппинг состояний в понятные метки
data['Regime'] = data['State'].apply(lambda x: 'Bear' if x == bear_state else 'Bull')
return data, model, bull_state, bear_state
if __name__ == '__main__':
df, model, bull, bear = get_market_regimes()
# Вывод матрицы переходных вероятностей
print('Матрица переходов:')
print(model.transmat_)
# Визуализация результатов
plt.figure(figsize=(12, 6))
# Отрисовка графика цены с цветовой кодировкой режимов
for state in [0, 1]:
mask = df['State'] == state
label = 'Bull Regime' if state == bull else 'Bear Regime'
color = 'g' if state == bull else 'r'
plt.scatter(df.index[mask], df['Close'][mask], label=label, color=color, s=2)
plt.title('Сегментация рыночных режимов с помощью HMM')
plt.xlabel('Дата')
plt.ylabel('Цена закрытия')
plt.legend()
plt.grid(True)
plt.show() Разбор параметров
n_components: Количество скрытых состояний (в нашем случае2: Bull и Bear). Увеличение этого параметра позволяет выделять промежуточные фазы (например, боковик или высокую волатильность).covariance_type: Тип ковариационной матрицы. Значение'full'позволяет каждому состоянию иметь свою собственную независимую дисперсию доходностей.transmat_: Матрица вероятностей переходов. Элементtransmat_[i, j]показывает вероятность перехода из состоянияiв состояниеjна следующем шаге.means_: Вектор средних значений доходностей для каждого скрытого состояния. Помогает математически идентифицировать, какое состояние является растущим (Bull), а какое — падающим (Bear).
Как запустить
Для запуска скрипта вам понадобятся библиотеки yfinance, hmmlearn, pandas, numpy и matplotlib. Установите их с помощью команды:
pip install yfinance hmmlearn pandas numpy matplotlib После установки запустите скрипт. Модель автоматически разметит исторический график индекса S&P 500 на бычьи (зеленые) и медвежьи (красные) зоны.
Полученные сигналы смены режимов можно использовать для динамического изменения параметров риск-менеджмента. Например, когда вы настраиваете Расчет VaR историческим методом для фьючерсов Binance на Python, в медвежьем режиме стоит закладывать более жесткие лимиты на просадку.
Кроме того, вы можете легко интегрировать эти режимы в торговые роботы. О том, как протестировать стратегии, переключающиеся между режимами, читайте в руководстве Бэктестинг Mean Reversion стратегий на Python с VectorBT.




