pykalman, настроить матрицы ковариации шума процесса и измерения, а также запустить EM-алгоритм для автоматической калибровки параметров.Исходный код
Для фильтрации рыночного шума мы используем модель одномерного случайного блуждания (Local Level Model). В этой модели истинная цена актива является скрытым состоянием, а наблюдаемая рыночная цена — зашумленным измерением. Ниже представлен готовый скрипт на Python, который генерирует синтетический зашумленный ряд, инициализирует класс KalmanFilter, оптимизирует параметры с помощью EM-алгоритма (Expectation-Maximization) и визуализирует результаты.
Перед тем как переходить к фильтрации высокочастотных данных в реальном времени, часто требуется предварительно обработать гигантские массивы исторических тиков. О том, как эффективно решать подобные задачи на терабайтах данных, вы можете прочитать в нашей статье Как вычислить профиль объема (VPVR) на 50 ГБ данных с Dask.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pykalman import KalmanFilter
# 1. Генерация синтетических данных (Случайное блуждание + Белый шум)
np.random.seed(42)
n_steps = 250
true_price = 100.0 + np.cumsum(np.random.normal(0, 0.5, n_steps))
noise = np.random.normal(0, 1.5, n_steps)
observed_price = true_price + noise
# 2. Инициализация фильтра Калмана с ручной настройкой параметров
# transition_matrices (A) = 1: x_t = x_{t-1} + w_t
# observation_matrices (C) = 1: z_t = x_t + v_t
kf_manual = KalmanFilter(
transition_matrices=[1],
observation_matrices=[1],
initial_state_mean=observed_price[0],
initial_state_covariance=1.0,
observation_covariance=1.5**2, # R: Дисперсия шума измерения
transition_covariance=0.5**2 # Q: Дисперсия шума процесса
)
# Фильтрация (получаем сглаженное среднее и ковариацию)
state_means_manual, _ = kf_manual.filter(observed_price)
# 3. Автоматическая калибровка параметров через EM-алгоритм
kf_em = KalmanFilter(
transition_matrices=[1],
observation_matrices=[1],
initial_state_mean=observed_price[0]
)
# Обучаем фильтр на исторических данных для оценки Q и R
kf_em = kf_em.em(observed_price, n_iter=10)
state_means_em, _ = kf_em.filter(observed_price)
# 4. Визуализация результатов
plt.figure(figsize=(14, 7))
plt.plot(observed_price, label='Наблюдаемая цена (с шумом)', color='gray', alpha=0.6)
plt.plot(true_price, label='Истинная цена (без шума)', color='black', linestyle='--', alpha=0.8)
plt.plot(state_means_manual, label='Фильтр Калмана (Ручной)', color='blue', linewidth=2)
plt.plot(state_means_em, label='Фильтр Калмана (EM-оптимизация)', color='red', linewidth=2)
plt.title('Сглаживание ценового ряда Фильтром Калмана')
plt.xlabel('Временные шаги')
plt.ylabel('Цена')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show() Разбор параметров
Для успешного применения фильтра Калмана в количественном анализе критически важно понимать физический и математический смысл его параметров:
transition_matrices: Матрица перехода состояний. Она определяет, как состояние системы эволюционирует от шага к шагу. Для одномерного блуждания цены мы устанавливаем её равной[1], предполагая, что текущая цена равна предыдущей плюс случайное приращение.observation_matrices: Матрица наблюдения. Она связывает скрытое состояние системы с наблюдаемыми измерениями. В нашем случае мы напрямую наблюдаем цену, поэтому матрица равна[1].transition_covariance: Ковариация шума процесса (обозначается как Q). Этот параметр отражает изменчивость (волатильность) истинной цены. Чем выше значение, тем более «подвижным» и чувствительным к изменениям будет фильтр.observation_covariance: Ковариация шума измерения (обозначается как R). Она задает дисперсию рыночного шума (микроструктурный шум, спреды, случайные выбросы). Высокое значение заставляет фильтр сильнее сглаживать ряд, игнорируя резкие колебания измерений.em(): Метод Expectation-Maximization (ожидание-максимизация). Он позволяет автоматически оценить неизвестные параметры модели на основе исторических наблюдений, избавляя квант-разработчика от необходимости ручного подбора параметров «на глаз».
Как запустить
Чтобы запустить данный скрипт локально, вам понадобится интерпретатор Python 3.8+ и установленные библиотеки для научных вычислений. Выполните в терминале следующую команду для установки необходимых зависимостей:
pip install numpy pandas matplotlib pykalman Обратите внимание, что библиотека pykalman может потребовать совместимости с более старыми версиями scipy. Если вы столкнулись с ошибками импорта, убедитесь, что ваши библиотеки обновлены до стабильных версий.
Для автоматизации процесса сбора исторических данных и регулярного переобучения параметров фильтра Калмана в продакшене рекомендуется использовать современные оркестраторы. Подробнее об этом читайте в нашей статье Apache Airflow для ETL криптосвечей: Оркестрация исторических данных.
После того как вы сгладили ценовые ряды и построили торговую стратегию, критически важно отслеживать качество исполнения ордеров и задержки инфраструктуры. О том, как развернуть систему мониторинга для HFT-стратегий, читайте в материале Интеграция InfluxDB и Grafana для HFT: Мониторинг Latency и Slippage.




