Моделирование рыночных режимов с помощью марковских цепей на Python

Моделирование рыночных режимов с помощью марковских цепей на Python Анализ данных и Бэктесты
Пошаговое руководство по реализации Скрытых Марковских Моделей (HMM) для определения бычьего и медвежьего режимов рынка на Python с использованием hmmlearn.
Суть: Использование Скрытых Марковских Моделей (Hidden Markov Models, HMM) позволяет автоматически классифицировать рыночные состояния (бычий и медвежий тренд) на основе волатильности и доходности активов без ручной разметки данных. В этой статье мы реализуем полноценный скрипт на Python с использованием библиотеки 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.

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