Глава 149: Гамильтоновы нейронные сети для трейдинга
Обзор
Гамильтоновы нейронные сети (HNN) привносят физически-обоснованные индуктивные смещения в финансовое моделирование, обучаясь сохраняющимся величинам из рыночных данных. Вместо того чтобы рассматривать динамику цен как произвольный временной ряд, HNN моделируют её как гамильтонову систему, где «энергия» сохраняется — импульс накапливается, преобразуется в изменения цены и возвращается обратно. Эта глава показывает, как строить, обучать и применять HNN для торговли на фондовом и криптовалютном рынках (биржа Bybit).
Ключевая идея: Рынки демонстрируют квази-гамильтонову динамику — моментум и возврат к среднему являются двумя сторонами одной медали сохранения энергии. Обучая гамильтонову функцию H(q, p) по данным, мы получаем динамику, которая по своей природе стабильна на длинных горизонтах и учитывает естественную фазово-пространственную структуру взаимодействий цены и импульса.
Торговая стратегия
Базовая стратегия: Обучить гамильтониан фазового пространства цена-импульс, затем использовать симплектическое интегрирование для прогнозирования будущих траекторий. Торговать, когда предсказанные траектории отклоняются от текущих цен больше порогового значения.
Факторы преимущества:
- Сохранение энергии предотвращает неограниченный дрейф прогнозов (типичная проблема стандартных RNN/MLP)
- Симплектическая структура сохраняет объём фазового пространства, избегая искусственного схлопывания траекторий
- Диссипативные расширения реалистично моделируют транзакционные издержки и рыночное трение
- Долгосрочная стабильность позволяет строить многошаговые стратегии
Целевые активы: Криптовалютные пары (BTC/USDT, ETH/USDT) с биржи Bybit, а также традиционные акции через Yahoo Finance.
Основы гамильтоновой механики
Классическая гамильтонова механика
Гамильтонова механика описывает эволюцию физической системы с помощью обобщённых координат q (положения) и сопряжённых импульсов p. Функция Гамильтона H(q, p) представляет полную энергию системы:
H(q, p) = T(p) + V(q)
где: T(p) = кинетическая энергия (функция импульсов) V(q) = потенциальная энергия (функция положений)Система эволюционирует согласно уравнениям Гамильтона:
dq/dt = dH/dp (скорость = производная H по импульсу)dp/dt = -dH/dq (сила = минус производная H по координате)Почему это важно
Эти уравнения обладают фундаментальным свойством: они сохраняют гамильтониан. Если вычислить dH/dt вдоль траектории:
dH/dt = (dH/dq)(dq/dt) + (dH/dp)(dp/dt) = (dH/dq)(dH/dp) + (dH/dp)(-dH/dq) = 0Полная энергия точно сохраняется. Это не численный трюк — это структурное свойство самих уравнений.
Фазовое пространство и симплектическая структура
Пространство состояний (q, p) называется фазовым пространством. Гамильтоновы потоки сохраняют симплектическую структуру — интуитивно, они сохраняют «площадь» в фазовом пространстве (теорема Лиувилля). Это означает:
Эволюция фазового пространства: p (импульс) ^ | .-'''-. | / \ | | *--->| Траектории образуют | \ / замкнутые орбиты (консервативные) | '-...-' или спирали (диссипативные) | +--------------> q (положение)Для простого гармонического осциллятора (пружины) траектории представляют собой эллипсы в фазовом пространстве. Система бесконечно осциллирует между кинетической и потенциальной энергией.
Аналогия маятника для рынков
Рассмотрим маятник:
- Положение q: угол отклонения (аналог отклонения цены от среднего)
- Импульс p: угловая скорость (аналог моментума/скорости изменения цены)
- Потенциальная энергия V(q): гравитационная энергия (аналог силы возврата к среднему)
- Кинетическая энергия T(p): вращательная энергия (аналог энергии моментума)
Фазовый портрет маятника: Фазовый портрет рынка: p импульс ^ ^ | .--. | .--. | / .. \ | / .. \ | | . . | | | . . | -----+--'----'----> q ------+--'----'----> отклонение цены | | . . | | | . . | | \ .. / | \ .. / | '--' | '--'Актив с возвратом к среднему ведёт себя как маятник: цена отклоняется (потенциальная энергия растёт), моментум нарастает, чтобы вернуть её (кинетическая энергия), проскакивает равновесие, и цикл повторяется.
Гамильтоновы нейронные сети (HNN)
Основная идея
Вместо прямого обучения динамике (как в стандартных Neural ODE), HNN обучают функцию Гамильтона H_theta(q, p) с помощью нейронной сети. Динамика затем выводится через автоматическое дифференцирование:
Стандартная Neural ODE: Гамильтонова нейросеть:
dx/dt = f_theta(x) Обучаем: H_theta(q, p) Выводим: dq/dt = dH_theta/dp (нет структуры) dp/dt = -dH_theta/dq (сохранение энергии гарантировано)Архитектура
┌─────────────────────────────┐ q (положение) ──>│ │ │ Нейросеть H_theta │ ──> H (скаляр) p (импульс) ──> │ (MLP с гладкими активациями) │ └─────────────────────────────┘ │ autograd │ ┌────────────┴────────────┐ │ │ v v dH/dp = dq/dt -dH/dq = dp/dtКлючевые решения проектирования:
- Гладкие активации (tanh, softplus) — уравнения Гамильтона требуют существования вторых производных
- Скалярный выход — H_theta выдаёт одно число (энергию)
- Autograd — производные вычисляются точно через обратное распространение, а не конечными разностями
Математическая формулировка
Имея набор наблюдений состояний {(q_i, p_i, dq_i/dt, dp_i/dt)}, обучаем:
Loss = sum_i || dH_theta/dp_i - dq_i/dt ||^2 + || -dH_theta/dq_i - dp_i/dt ||^2Эта функция потерь говорит: «производные нашего обученного гамильтониана должны соответствовать наблюдаемой динамике».
Код: базовая HNN на PyTorch
import torchimport torch.nn as nn
class HamiltonianNN(nn.Module): def __init__(self, input_dim=2, hidden_dim=64, num_layers=3): super().__init__() layers = [nn.Linear(input_dim, hidden_dim), nn.Tanh()] for _ in range(num_layers - 1): layers += [nn.Linear(hidden_dim, hidden_dim), nn.Tanh()] layers.append(nn.Linear(hidden_dim, 1)) self.net = nn.Sequential(*layers)
def forward(self, q, p): """Вычислить гамильтониан H(q, p).""" x = torch.cat([q, p], dim=-1) return self.net(x)
def time_derivative(self, q, p): """Вычислить dq/dt, dp/dt через уравнения Гамильтона.""" q = q.requires_grad_(True) p = p.requires_grad_(True) H = self.forward(q, p)
dH = torch.autograd.grad(H.sum(), [q, p], create_graph=True) dH_dq, dH_dp = dH[0], dH[1]
dq_dt = dH_dp # Первое уравнение Гамильтона dp_dt = -dH_dq # Второе уравнение Гамильтона return dq_dt, dp_dtСимплектическое интегрирование
Почему стандартные интеграторы не подходят
Стандартные численные интеграторы (Эйлер, RK4) не сохраняют симплектическую структуру. На длинных временных горизонтах они накапливают дрейф энергии:
Энергия во времени:
Стандартный RK4: Симплектический Leapfrog: H │\ H │ │ \___ │ ~~~~~~~~~~~~~~~~~~~~ │ \___ │ │ \___ │ │ \ │ └──────────────> t └──────────────────> t (энергия дрейфует вниз) (энергия осциллирует, без дрейфа)Интегратор Leapfrog / Штёрмер-Верле
Интегратор leapfrog является симплектическим — он точно сохраняет структуру фазового пространства:
Алгоритм: интегрирование Leapfrog
Дано: (q_0, p_0), шаг dt, количество шагов N
Для каждого шага n = 0, 1, ..., N-1: p_{n+1/2} = p_n - (dt/2) * dH/dq(q_n, p_n) # полушаг импульса q_{n+1} = q_n + dt * dH/dp(q_{n+1/2}, p_{n+1/2}) # полный шаг координаты p_{n+1} = p_{n+1/2} - (dt/2) * dH/dq(q_{n+1}, p_{n+1/2}) # полушаг импульсаСвойства:
- Обратимость по времени
- Симплектичность (сохранение объёма фазового пространства)
- Ошибка энергии ограничена и осциллирует (без векового дрейфа)
- Точность второго порядка
Диссипативные гамильтоновы нейронные сети
Рынки не являются идеально консервативными
Реальные рынки имеют трение: транзакционные издержки, проскальзывание, затухание информации и смена режимов. Чистая гамильтонова система сохраняет энергию точно, но рынки «теряют энергию» со временем. Нужны диссипативные расширения.
Формулировка диссипативной HNN
Диссипативная гамильтонова система добавляет функцию диссипации Рэлея D(q, p):
dq/dt = dH/dpdp/dt = -dH/dq - dD/dp
где D(q, p) >= 0 -- функция диссипации (всегда неотрицательна)Полная энергия теперь убывает со временем:
dH/dt = -p^T * dD/dp <= 0 (энергия может только убывать)Архитектура
┌──────────────────┐ (q, p) ────> │ H_theta (MLP) │ ──> H (гамильтониан, скаляр) └──────────────────┘ │ autograd v ┌──────────────────┐ (q, p) ────> │ D_phi (MLP) │ ──> D (диссипация, скаляр >= 0) └──────────────────┘ │ autograd v dq/dt = dH/dp dp/dt = -dH/dq - dD/dpПорт-гамильтоновы нейронные сети для открытых рыночных систем
Рынки как открытые системы
Рынки не изолированы — они получают внешние воздействия (новости, денежная политика, потоки капитала). Порт-гамильтоновы системы моделируют это:
dq/dt = dH/dp + g_q(q, p) * u(t)dp/dt = -dH/dq + g_p(q, p) * u(t) - dD/dp
где: u(t) = внешний вход (сентимент новостей, шоки объёма и т.д.) g(q, p) = матрица связи входовЭтот фреймворк чётко разделяет:
- Внутренняя динамика (гамильтониан + диссипация)
- Внешнее воздействие (порт-соединения)
- Энергетический баланс (энергия от портов, рассеянная энергия, запасённая энергия)
Применение к микроструктуре рынка
Порт-гамильтонова модель рынка:
Внешние входы u(t): Внутренняя динамика: ┌─────────────────┐ ┌─────────────────────────┐ │ Поток ордеров │──────────────> │ │ │ Сентимент новостей│──────────────> │ H(q, p) + D(q, p) │ │ Шоки объёма │──────────────> │ │ │ Макропоказатели │──────────────> │ q = отклонение цены │ └─────────────────┘ │ p = импульс книги заявок│ └──────────┬──────────────┘ │ v Траектория цены (q(t), p(t))Применение к финансовым рынкам
Построение фазового пространства для трейдинга
Для применения HNN к трейдингу нужно определить подходящие обобщённые координаты:
Обобщённые координаты q (координатоподобные): - Отклонение логарифма цены от скользящей средней: q = log(P) - MA(log(P)) - Нормализованная цена: q = (P - mean) / std - Спред в парном трейдинге: q = log(P1/P2) - mean
Сопряжённые импульсы p (импульсоподобные): - Скорость изменения цены: p = d(log P)/dt (доходности) - Импульс, взвешенный по объёму: p = return * volume - Дисбаланс потока ордеров: p = (buy_volume - sell_volume) / total_volume - Отклонение RSI: p = RSI - 50Почему рынки квази-гамильтоновы
Несколько рыночных явлений естественно отображаются в гамильтонову динамику:
1. Возврат к среднему как гармонический осциллятор
H(q, p) = p^2/2 + k*q^2/2
dq/dt = p (импульс движет цену)dp/dt = -k*q (отклонение создаёт возвращающую силу)
Период = 2*pi/sqrt(k) (масштаб времени возврата к среднему)2. Циклы моментум-разворот
Фаза 1: Моментум нарастает (p увеличивается, q удаляется от равновесия)Фаза 2: Возвращающая сила растёт (dH/dq увеличивается)Фаза 3: Моментум затухает (p уменьшается, начинается разворот)Фаза 4: Цена возвращается (q стремится к равновесию)
Это в точности гамильтонова орбита в пространстве (q, p).3. Микроструктура рынка
Книга заявок имеет естественную гамильтонову структуру: - q = отклонение средней цены - p = дисбаланс потока ордеров - V(q) = давление маркет-мейкеров (средне-возвратное) - T(p) = давление трендовых трейдеров - D(p) = трение от спреда bid-ask (диссипация)Сравнение со стандартными Neural ODE
| Свойство | Стандартная Neural ODE | Гамильтонова НС |
|---|---|---|
| Обучаемая функция | f_theta(x) (векторное поле) | H_theta(q,p) (скалярная энергия) |
| Законы сохранения | Не гарантированы | Энергия сохраняется по построению |
| Долгосрочная стабильность | Дрейф накапливается | Ограниченные, осциллирующие ошибки |
| Параметрическая эффективность | O(d^2) для d-мерного | O(d^2), но скалярный выход ограничивает |
| Структура фазового пространства | Нет | Симплектическая (сохраняющая площадь) |
| Физическая интерпретируемость | Низкая | Высокая (декомпозиция энергии) |
| Интегрирование | Любой решатель ОДУ | Предпочтительны симплектические |
| Диссипация | Должна обучаться неявно | Явный диссипативный член |
| Внешние входы | Ad-hoc | Порт-гамильтонов фреймворк |
Применение к криптовалютам Bybit
Микроструктура рынка как гамильтонова система
Криптовалютные рынки на Bybit обладают характеристиками, делающими их подходящими для гамильтонова моделирования:
- Торговля 24/7 — непрерывная динамика, без ночных разрывов
- Высокочастотные данные — богатые траектории в фазовом пространстве
- Возврат к среднему на коротких временных масштабах — маркет-мейкинг вокруг справедливой стоимости
- Моментум на средних временных масштабах — трендовое поведение
- Ставка финансирования бессрочных фьючерсов — явный механизм возврата к среднему
Конвейер данных
import requestsimport pandas as pd
def fetch_bybit_klines(symbol="BTCUSDT", interval="5", limit=1000): """Получить OHLCV-данные из Bybit V5 API.""" url = "https://api.bybit.com/v5/market/kline" params = { "category": "linear", "symbol": symbol, "interval": interval, "limit": limit } response = requests.get(url, params=params) data = response.json()["result"]["list"]
df = pd.DataFrame(data, columns=[ "timestamp", "open", "high", "low", "close", "volume", "turnover" ]) for col in ["open", "high", "low", "close", "volume", "turnover"]: df[col] = df[col].astype(float) df["timestamp"] = pd.to_datetime(df["timestamp"].astype(int), unit="ms") df = df.sort_values("timestamp").reset_index(drop=True) return dfТорговые сигналы на основе HNN
Торговая стратегия использует HNN для прогнозирования будущих траекторий в фазовом пространстве и генерации сигналов:
Конвейер генерации сигналов:
1. Наблюдаем текущее состояние (q_now, p_now)2. Интегрируем вперёд N шагов с помощью leapfrog3. Прогнозируем будущую траекторию цены q(t+1), ..., q(t+N)4. Вычисляем ожидаемое изменение цены: delta_q = q(t+N) - q(t)5. Вычисляем ожидаемый импульс: p(t+N)6. Генерируем сигнал: - ПОКУПКА если delta_q > порог И p(t+N) > 0 - ПРОДАЖА если delta_q < -порог И p(t+N) < 0 - УДЕРЖАНИЕ в остальных случаях7. Размер позиции: пропорционален |delta_q| (уверенность)8. Управление рисками: стоп-лосс при отклонении энергии > 2 сигмаУправление рисками на основе энергии
Уникальное преимущество HNN — мониторинг рисков на основе энергии:
def compute_energy_anomaly(model, q, p, energy_history): """Обнаружение смены режимов через энергетические аномалии.""" H = model.forward(q, p).item() mean_H = np.mean(energy_history) std_H = np.std(energy_history)
z_score = (H - mean_H) / (std_H + 1e-8)
if abs(z_score) > 2.0: return "СМЕНА_РЕЖИМА", z_score return "НОРМА", z_scoreКогда энергия системы резко меняется (нарушая сохранение), это сигнализирует о смене режима — именно тогда следует уменьшать размер позиций или выходить.
Продвинутые темы
Многомерные гамильтоновы системы
Для мультиактивной торговли гамильтониан расширяется на несколько пар (q, p):
H(q1, q2, ..., qN, p1, p2, ..., pN)
где: qi = отклонение актива i от его равновесия pi = импульс актива i
Межактивные взаимодействия возникают естественно: dpi/dt = -dH/dqi (включает члены связи d^2H/dqi*dqj)Разделяемые и неразделяемые гамильтонианы
Разделяемый: H(q, p) = T(p) + V(q)
- Кинетическая и потенциальная энергии независимы
- Проще обучать и интегрировать
- Соответствует независимо действующим моментуму и возврату к среднему
Неразделяемый: H(q, p) = общая функция от (q, p)
- Зависящая от положения эффективная масса (импульс, зависящий от волатильности)
- Более выразительная, но сложнее в обучении
- Лучше для сложных рыночных режимов
Замечания по реализации
Численная стабильность
- Обрезка градиентов — autograd через уравнения Гамильтона может давать большие градиенты
- Нормализация — q и p должны быть приведены к схожим масштабам
- Разогрев скорости обучения — начинать с малого lr, постепенно увеличивать
- Активация Softplus — для сети диссипации, гарантирует неотрицательность
- Инициализация весов — меньшие веса помогают начальным оценкам энергии
Гиперпараметры
| Параметр | Рекомендуемый диапазон | Примечания |
|---|---|---|
| Размер скрытого слоя | 32-128 | Больше для мультиактивных |
| Число слоёв | 2-4 | Больше для сложного H |
| Скорость обучения | 1e-4 до 1e-3 | Используйте косинусное отжигание |
| Шаг интегрирования dt | 0.01-0.1 | Меньше для более высокой частоты |
| Горизонт прогноза | 5-50 шагов | Зависит от актива |
| Вес диссипации | 0.01-0.1 | Выше для неликвидных рынков |
Типичные ошибки
- Негладкие активации — ReLU создаёт точки недифференцируемости в уравнениях Гамильтона; используйте tanh или softplus
- Игнорирование диссипации — чистые HNN переоценивают амплитуду колебаний на реальных рынках
- Неправильные координаты фазового пространства — мусор на входе = мусор на выходе; выбирайте (q, p) тщательно
- Слишком большие шаги интегрирования — даже симплектические интеграторы ломаются при больших dt
- Переобучение гамильтониана — регуляризуйте H_theta для гладкости
Структура проекта
149_hamiltonian_nn_trading/├── README.md # Основной файл (English)├── README.ru.md # Этот файл├── readme.simple.md # Упрощённое объяснение (English)├── readme.simple.ru.md # Упрощённое объяснение (Русский)│├── python/│ ├── __init__.py│ ├── requirements.txt│ ├── hamiltonian_nn.py # Базовая модель HNN│ ├── dissipative_hnn.py # Диссипативное расширение HNN│ ├── symplectic_integrator.py # Интегратор Leapfrog│ ├── data_loader.py # Загрузка данных Bybit + акции│ ├── train.py # Конвейер обучения│ ├── visualize.py # Фазовые портреты и графики│ └── backtest.py # Бэктестер торговой стратегии│└── rust_hamiltonian_nn/ ├── Cargo.toml ├── src/ │ ├── lib.rs # Основная библиотека HNN │ └── bin/ │ ├── train.rs # Бинарник обучения │ ├── predict.rs # Бинарник прогнозирования │ └── fetch_data.rs # Загрузчик данных Bybit └── examples/ └── phase_portrait.rs # Визуализация фазового портретаБыстрый старт
Python
cd pythonpip install -r requirements.txt
# Получить данные с Bybitpython data_loader.py --symbol BTCUSDT --interval 5 --limit 5000
# Обучить модель HNNpython train.py --model hnn --epochs 500 --lr 1e-3
# Обучить диссипативную HNNpython train.py --model dissipative --epochs 500
# Визуализировать фазовое пространствоpython visualize.py --model saved_model.pt
# Запустить бэктестpython backtest.py --model saved_model.pt --initial-capital 100000Rust
cd rust_hamiltonian_nn
# Получить данные с Bybitcargo run --bin fetch_data -- --symbol BTCUSDT --interval 5
# Обучить модельcargo run --release --bin train -- --epochs 500 --lr 0.001
# Запустить прогнозыcargo run --release --bin predict -- --model model.bin --horizon 20Ссылки
- Greydanus, S., Dzamba, M., & Sprague, J. (2019). “Hamiltonian Neural Networks.” NeurIPS 2019.
- Zhong, Y.D., Dey, B., & Chakraborty, A. (2020). “Dissipative SymODEN: Encoding Hamiltonian Dynamics with Dissipation and Control into Deep Learning.”
- Cranmer, M., Greydanus, S., Hoyer, S., Battaglia, P., Spergel, D., & Ho, S. (2020). “Lagrangian Neural Networks.” ICLR 2020 Workshop.
- Chen, R.T.Q., Rubanova, Y., Bettencourt, J., & Duvenaud, D. (2018). “Neural Ordinary Differential Equations.” NeurIPS 2018.
- Hairer, E., Lubich, C., & Wanner, G. (2006). “Geometric Numerical Integration: Structure-Preserving Algorithms for Ordinary Differential Equations.”
Глава 149 книги «Машинное обучение для трейдинга». Полный код: github.com/suenot/machine-learning-for-trading.