Небольшая заметка — посмотрел интересное видео около ML о том как адаптировать торговые стратегии к изменениям рыночного режима (regime changes).
И здесь основная проблема в нестационарности финансовых временных рядов, где статистические свойства (среднее, дисперсия и др.) постоянно меняются со временем.
У видео есть автоперевод на русский язык.

Видео: https://www.youtube.com/watch?v=X5QcNyYRMqQ
Автор рассматривает три метода адаптации:
- Кодирование скрытых состояний (Encoding Hidden States): использование средних и других признаков для передачи «памяти» модели о предыдущей динамике рынка.
- Онлайн-обучение (Online Learning): использование алгоритмов, таких как Passive Aggressive Regressor, которые непрерывно корректируют веса модели при каждом новом тике данных, позволяя стратегии быстро переключаться между импульсной торговлей и возвратом к среднему.
- Обучение с подкреплением (Reinforcement Learning): моделирование торговли как задачи «двурукого бандита». Автор подчеркивает важность использования энтропийной регуляризации, которая предотвращает застревание модели в локальных оптимумах и заставляет её продолжать «исследование» рынка даже после изменения условий.
Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
cerberus, булочки моя слабость. А про алгоритмы — исследовательская работа.
Успешность торговли я в комментариях не доказываю и сигналы не продаю.
Если тема неинтересна — можно просто пройти мимо.
cerberus, я частное лицо, не представитель фонда или брокера.
Что-то получается, что-то нет. Я пишу об этом открыто. Про какие-то свои эксперименты
Михаил, добрый день! Спасибо за заметку.
Видео не посмотрел еще, поэтому вас спрошу — что автор на вход для обучения всех этих моделей подаёт?
И еще интересное: подписался, помимо прочего, на одного quant developer в линкед, и теперь у меня в ленте намного больше свежего и интересного по бирже и алготорговле, чем на СЛ. Это парадокс. Ни чем не хуже, чем в релевантных ветках реддита. Не удивлюсь, если и в инсте вместо жопастеньких скоро появляться начнут в рекомендациях интересные заметки и скрины по биржевой/алго тематике![]()
пысы: платный зарубежный траффик с осени — фейк или нет?
Михаил Шардин, интересно также (в кач-ве наблюдения), что и на покерных форумах про трейдинг и биржу гораздо больше и полезнее, чем на сл теперь
.
И, к моему удивлению, на многих публика в разы вежливее и обходительнее.
1 торговать тренд
2 контролировать риски
3 ждать прибыль
не надо ничего больше придумывать
просто смотрим на все 3 правила и ищем в какм из 3ех ошибся автор
Без иллюстраций на конкретном инструменте всё выглядит неубедительно. Должно быть показано, что перечисленное способно бороться с обычными проблемами технического анализа. Запаздывание куда девается?
1) А обычная МА не передаёт предыдущие состояния цены?
2) Линейную регрессию использовал каждый второй. Ну, стал наклон линии прогноза из положительного отрицательным, вот и 'переключение'. Только слишком поздно.
3) Надо показывать эффективность метода вычисления энтропии, а самое главное — правильное соотношение между ней и политикой, которое не должно сильно непредсказуемо меняться. Пока выглядит просто как создание новых сущностей.
Фёдор Г., прислали (Бомбасик):
Технический анализ методов адаптации торговых систем к смене парадигмы рынка (Regime Changes)При проектировании алгоритмических стратегий для высокоэффективных и зашумленных финансовых рынков (базовый актив — BTC/USDT) ключевым препятствием является нестационарность временного ряда логарифмических доходностей:
r_t = ln(P_t / P_{t-1})
Математическое ожидание, дисперсия и автокорреляционные функции распределения непрерывно мутируют во времени. Классические статические модели машинного обучения (Supervised Learning), обученные пакетным методом (Full-Batch) на фиксированном историческом интервале, демонстрируют неспособность адаптироваться к структурным сдвигам. Это ведет к накоплению системной ошибки (Bias) и критическому росту максимальной просадки (Max Drawdown).
В данном документе представлен подробный разбор четырех протестированных методов адаптации, их математический аппарат, результаты бэктестов и программная реализация на Python/PyTorch.
МЕТОД №1: Статический бенчмарк AR(1) и метод скользящего окна (Sliding Window)1.1. Базовая неадаптивная модель
В качестве отправной точки используется авторегрессионная модель первого порядка, где предиктором выступает лагированная доходность за предыдущий шаг:
r_hat_{t+1} = w * r_{t-1} + b
При обучении методом наименьших квадратов (OLS) на всей исторической выборке получены следующие параметры:
Критический дефект модели: Свободный член b по модулю существенно превосходит динамическую компоненту w * r_{t-1}. Как следствие, математическое ожидание прогноза практически всегда строго больше нуля. Распределение сигналов показало: Long — 1991 день, Short — 104 дня. Модель выродилась в пассивную стратегию удержание актива (Buy & Hold) и полностью сливает капитал в периоды затяжного медвежьего тренда.
1.2. Модификация: Скользящее окно (Sliding Window)
Для придания модели локальной гибкости применяется подход переобучения на скользящем историческом окне фиксированной длины k. Оптимизация параметров OLS производится на интервале [t-k, t] для прогнозирования точки t+1.
Недостатки подхода: Экстремальная чувствительность к размеру окна k (короткое окно ловит шум, длинное — запаздывает) и полное стирание макро-памяти ряда за пределами выбранного интервала.
МЕТОД №2: Кодирование скрытых состояний (Feature Engineering / Memory)Вместо подачи сырых, зашумленных лагов, история доходностей сжимается в низкоразмерное скрытое состояние (Hidden State), выступающее в роли рыночной «памяти».
2.1. Однофакторная модель памяти (Rolling Mean)
В качестве предиктора выступает простое скользящее среднее логарифмических доходностей за окно N=40:
X_t = (1 / N) * SUM_{i=1}^{N} r_{t-i}
r_hat_{t+1} = w * X_t + b
Результаты бэктеста: Вес линейной регрессии инвертировался в положительное состояние (w = +0.0898), превратив модель в Momentum-стратегию (следование за трендом). Количество шорт-сигналов увеличилось со 104 до 380, защищая капитал во время затяжного даунтренда.
2.2. Моделирование относительной памяти (Relative Memory)
Двухфакторная архитектура, оценивающая спред между локальным ценовым импульсом (быстрая компонента) и долгосрочной памятью рынка (медленная компонента):
r_hat_{t+1} = w_1 * r_{t-1} + w_2 * ((1 / N) * SUM_{i=1}^{N} r_{t-i}) + b
Полученные параметры оптимизации:
Вывод: Модель выстроила устойчивую структуру — взвешенный арбитраж между трендовой силой макро-памяти и контр-трендовым свойством локального микро-шума. Количество шорт-сигналов возросло до 549, обеспечивая стабильный рост эквити на фазах слома тренда.
Переход от концепции пакетного обучения (Full-Batch) к непрерывному стримингу данных. Модель получает одну точку временного ряда, делает Out-of-Sample прогноз, узнает истинный ответ рынка и мгновенно корректирует параметры. Используется алгоритм Passive-Aggressive Regressor на базе стохастического градиентного спуска (SGD). Функция потерь определяется как epsilon-insensitive loss:
L = max(0, |y_hat_t — y_t| — epsilon)
Программная реализация онлайн-цикла (Python)
from sklearn.linear_model import PassiveAggressiveRegressor
from sklearn.preprocessing import StandardScaler
# Инициализация онлайн-модели и потокового скалера
model = PassiveAggressiveRegressor(C=1.0, epsilon=0.001, random_state=42)
scaler = StandardScaler()
for t in range(41, len(df)):
X_t = df['close_log_return_lag_1'].iloc[t].values.reshape(-1, 1)
y_t = df['close_log_return'].iloc[t]
# Потоковое обновление параметров скалера
scaler.partial_fit(X_t)
X_t_scaled = scaler.transform(X_t)
# Out-of-Sample прогноз ДО корректировки весов
y_hat = model.predict(X_t_scaled)[0]
# Шаг градиентной коррекции параметров модели на основе истинного y_t
model.partial_fit(X_t_scaled, [y_t])
Статистические результаты: Точность направления (Directional Hit Rate) составила 50.41%. Распределение позиций: Long — 1071, Short — 976. Баланс сигналов приблизился к отношению 50/50, полностью ликвидировав лонг-сдвиг. Вектор весов непрерывно колеблется во времени, переключая модель между режимами Momentum (w > 0) и Mean Reversion (w < 0) без проклятия размерности.
МЕТОД №4: Обучение с подкреплением (Reinforcement Learning / Policy Gradient)Моделирование торговой логики в рамках частично наблюдаемого Марковского процесса принятия решений (POMDP). Целью является прямая оптимизация параметров торговой политики (политики действий) без промежуточной оценки функции ценности.
4.1. Концепция Двурукого Бандита (Two-Armed Bandit)
Торговая среда интерпретируется как игровой автомат с двумя рычагами:
Используется алгоритм REINFORCE (Policy Gradient). Обучаемые параметры нейросети (логиты действий) трансформируются через слой Softmax в вероятностное распределение действий pi_theta(a|s).
4.2. Ловушка Vanilla REINFORCE и локальный оптимум
В стационарных условиях (тренд вверх, монета падает орлом в 70% случаев) базовый алгоритм REINFORCE максимизирует вероятность прибыльного действия: pi(a_long) -> 1.0. При резком наступлении смены режима (вероятность падения орла падает до 20%, а шорт становится прибыльным в 80% случаев), Vanilla-агент полностью теряет способность к адаптации. Так как вероятность шорта была сведена к нулю, фаза исследования среды (Exploration) прекращается. Агент продолжает совершать 100% лонг-сделок, уходя в глубокую просадку.
4.3. Архитектурное решение: Регуляризация энтропии Шеннона (Shannon Entropy)
Для сохранения уровня исследования (Exploration) и предотвращения преждевременного коллапса распределения политики, в функцию потерь вводится штраф за чрезмерную уверенность — энтропия Шеннона H(pi):
H(pi) = — SUM_{i} pi(a_i) * log pi(a_i)
Loss_total = Loss_policy — beta * H(pi)
Loss_total = -log pi_theta(a_t | s_t) * R_t — beta * H(pi)
Где beta (Entropy Beta) — гиперпараметр регуляризации, определяющий вес компоненты исследования.
Реализация кастомного шага обучения на PyTorch
import torch
import torch.nn as nn
from torch.distributions import Categorical
class PolicyNetwork(nn.Module):
def __init__(self):
super(PolicyNetwork, self).__init__()
self.theta = nn.Parameter(torch.zeros(2))
def forward(self):
return torch.softmax(self.theta, dim=0)
def train_rl_step(policy, optimizer, action_index, reward, beta=0.5):
probs = policy()
m = Categorical(probs)
# Расчет базового лосса политики: -log(prob) * Reward
policy_loss = -m.log_prob(torch.tensor(action_index)) * reward
# Расчет дискретной энтропии распределения
entropy_loss = m.entropy()
# Комбинированный функционал потерь
total_loss = policy_loss — beta * entropy_loss
optimizer.zero_grad()
total_loss.backward()
optimizer.step()
Результаты симуляции смены режима (эпизод 1000): Vanilla REINFORCE застревает на вероятности лонга 100% и полностью сливает профит. Модель с регуляризацией энтропии удерживает базовую вероятность лонга на уровне ~0.93, оставляя стабильные 7% на случайное сэмплирование коротких позиций. При наступлении смены режима скрытые шорты начинают приносить профит (R_t = +1.0). Градиент мгновенно считывает изменение знака награды, и модель за 150 шагов полностью перестраивает логиты, адаптируясь под медвежью фазу.
Сравнение целевых функций: Online Learning против Reinforcement LearningКритерий
Online Learning (Passive-Aggressive SGD)
Reinforcement Learning (Policy Gradient + Entropy)
Горизонт планирования
Локальный, «жадный» (минимизация ошибки на шаге t+1).
Глобальный, долгосрочный (максимизация кумулятивной дисконтированной награды).
Целевая функция
Точность прогнозирования движения знака цены.
Траектория геометрической доходности и минимизация Max Drawdown.
Поведение модели
Оптимизирует точность модели на текущей свече, игнорируя кумулятивные просадки капитала во времени.
Агент способен временно удерживать позицию, фиксировать микро-убытки или выходить в кэш, если траектория этого действия максимизирует итоговую доходность портфеля на всей дистанции.