Перейти к содержимому

Глава 149: Гамильтоновы нейронные сети для трейдинга

Обзор

Гамильтоновы нейронные сети (HNN) привносят физически-обоснованные индуктивные смещения в финансовое моделирование, обучаясь сохраняющимся величинам из рыночных данных. Вместо того чтобы рассматривать динамику цен как произвольный временной ряд, HNN моделируют её как гамильтонову систему, где «энергия» сохраняется — импульс накапливается, преобразуется в изменения цены и возвращается обратно. Эта глава показывает, как строить, обучать и применять HNN для торговли на фондовом и криптовалютном рынках (биржа Bybit).

Ключевая идея: Рынки демонстрируют квази-гамильтонову динамику — моментум и возврат к среднему являются двумя сторонами одной медали сохранения энергии. Обучая гамильтонову функцию H(q, p) по данным, мы получаем динамику, которая по своей природе стабильна на длинных горизонтах и учитывает естественную фазово-пространственную структуру взаимодействий цены и импульса.

Торговая стратегия

Базовая стратегия: Обучить гамильтониан фазового пространства цена-импульс, затем использовать симплектическое интегрирование для прогнозирования будущих траекторий. Торговать, когда предсказанные траектории отклоняются от текущих цен больше порогового значения.

Факторы преимущества:

  1. Сохранение энергии предотвращает неограниченный дрейф прогнозов (типичная проблема стандартных RNN/MLP)
  2. Симплектическая структура сохраняет объём фазового пространства, избегая искусственного схлопывания траекторий
  3. Диссипативные расширения реалистично моделируют транзакционные издержки и рыночное трение
  4. Долгосрочная стабильность позволяет строить многошаговые стратегии

Целевые активы: Криптовалютные пары (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

Ключевые решения проектирования:

  1. Гладкие активации (tanh, softplus) — уравнения Гамильтона требуют существования вторых производных
  2. Скалярный выход — H_theta выдаёт одно число (энергию)
  3. 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 torch
import 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/dp
dp/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) = матрица связи входов

Этот фреймворк чётко разделяет:

  1. Внутренняя динамика (гамильтониан + диссипация)
  2. Внешнее воздействие (порт-соединения)
  3. Энергетический баланс (энергия от портов, рассеянная энергия, запасённая энергия)

Применение к микроструктуре рынка

Порт-гамильтонова модель рынка:
Внешние входы 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 обладают характеристиками, делающими их подходящими для гамильтонова моделирования:

  1. Торговля 24/7 — непрерывная динамика, без ночных разрывов
  2. Высокочастотные данные — богатые траектории в фазовом пространстве
  3. Возврат к среднему на коротких временных масштабах — маркет-мейкинг вокруг справедливой стоимости
  4. Моментум на средних временных масштабах — трендовое поведение
  5. Ставка финансирования бессрочных фьючерсов — явный механизм возврата к среднему

Конвейер данных

import requests
import 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 шагов с помощью leapfrog
3. Прогнозируем будущую траекторию цены 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)

  • Зависящая от положения эффективная масса (импульс, зависящий от волатильности)
  • Более выразительная, но сложнее в обучении
  • Лучше для сложных рыночных режимов

Замечания по реализации

Численная стабильность

  1. Обрезка градиентов — autograd через уравнения Гамильтона может давать большие градиенты
  2. Нормализация — q и p должны быть приведены к схожим масштабам
  3. Разогрев скорости обучения — начинать с малого lr, постепенно увеличивать
  4. Активация Softplus — для сети диссипации, гарантирует неотрицательность
  5. Инициализация весов — меньшие веса помогают начальным оценкам энергии

Гиперпараметры

ПараметрРекомендуемый диапазонПримечания
Размер скрытого слоя32-128Больше для мультиактивных
Число слоёв2-4Больше для сложного H
Скорость обучения1e-4 до 1e-3Используйте косинусное отжигание
Шаг интегрирования dt0.01-0.1Меньше для более высокой частоты
Горизонт прогноза5-50 шаговЗависит от актива
Вес диссипации0.01-0.1Выше для неликвидных рынков

Типичные ошибки

  1. Негладкие активации — ReLU создаёт точки недифференцируемости в уравнениях Гамильтона; используйте tanh или softplus
  2. Игнорирование диссипации — чистые HNN переоценивают амплитуду колебаний на реальных рынках
  3. Неправильные координаты фазового пространства — мусор на входе = мусор на выходе; выбирайте (q, p) тщательно
  4. Слишком большие шаги интегрирования — даже симплектические интеграторы ломаются при больших dt
  5. Переобучение гамильтониана — регуляризуйте 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 python
pip install -r requirements.txt
# Получить данные с Bybit
python data_loader.py --symbol BTCUSDT --interval 5 --limit 5000
# Обучить модель HNN
python train.py --model hnn --epochs 500 --lr 1e-3
# Обучить диссипативную HNN
python train.py --model dissipative --epochs 500
# Визуализировать фазовое пространство
python visualize.py --model saved_model.pt
# Запустить бэктест
python backtest.py --model saved_model.pt --initial-capital 100000

Rust

Окно терминала
cd rust_hamiltonian_nn
# Получить данные с Bybit
cargo 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

Ссылки

  1. Greydanus, S., Dzamba, M., & Sprague, J. (2019). “Hamiltonian Neural Networks.” NeurIPS 2019.
  2. Zhong, Y.D., Dey, B., & Chakraborty, A. (2020). “Dissipative SymODEN: Encoding Hamiltonian Dynamics with Dissipation and Control into Deep Learning.”
  3. Cranmer, M., Greydanus, S., Hoyer, S., Battaglia, P., Spergel, D., & Ho, S. (2020). “Lagrangian Neural Networks.” ICLR 2020 Workshop.
  4. Chen, R.T.Q., Rubanova, Y., Bettencourt, J., & Duvenaud, D. (2018). “Neural Ordinary Differential Equations.” NeurIPS 2018.
  5. 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.