Комментарии пользователя Михаил Шардин
Переход от концепции пакетного обучения (Full-Batch) к непрерывному стримингу данных. Модель получает одну точку временного ряда, делает Out-of-Sample прогноз, узнает истинный ответ рынка и мгновенно корректирует параметры. Используется алгоритм Passive-Aggressive Regressor на базе стохастического градиентного спуска (SGD). Функция потерь определяется как epsilon-insensitive loss:
L = max(0, |y_hat_t — y_t| — epsilon)
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). Целью является прямая оптимизация параметров торговой политики (политики действий) без промежуточной оценки функции ценности.
Торговая среда интерпретируется как игровой автомат с двумя рычагами:
Используется алгоритм REINFORCE (Policy Gradient). Обучаемые параметры нейросети (логиты действий) трансформируются через слой Softmax в вероятностное распределение действий pi_theta(a|s).
В стационарных условиях (тренд вверх, монета падает орлом в 70% случаев) базовый алгоритм REINFORCE максимизирует вероятность прибыльного действия: pi(a_long) -> 1.0. При резком наступлении смены режима (вероятность падения орла падает до 20%, а шорт становится прибыльным в 80% случаев), Vanilla-агент полностью теряет способность к адаптации. Так как вероятность шорта была сведена к нулю, фаза исследования среды (Exploration) прекращается. Агент продолжает совершать 100% лонг-сделок, уходя в глубокую просадку.
Для сохранения уровня исследования (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) — гиперпараметр регуляризации, определяющий вес компоненты исследования.
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. |
Поведение модели |
Оптимизирует точность модели на текущей свече, игнорируя кумулятивные просадки капитала во времени. |
Агент способен временно удерживать позицию, фиксировать микро-убытки или выходить в кэш, если траектория этого действия максимизирует итоговую доходность портфеля на всей дистанции. |
Фёдор Г., прислали (Бомбасик):
Технический анализ методов адаптации торговых систем к смене парадигмы рынка (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)
В качестве отправной точки используется авторегрессионная модель первого порядка, где предиктором выступает лагированная доходность за предыдущий шаг:
r_hat_{t+1} = w * r_{t-1} + b
При обучении методом наименьших квадратов (OLS) на всей исторической выборке получены следующие параметры:
Критический дефект модели: Свободный член b по модулю существенно превосходит динамическую компоненту w * r_{t-1}. Как следствие, математическое ожидание прогноза практически всегда строго больше нуля. Распределение сигналов показало: Long — 1991 день, Short — 104 дня. Модель выродилась в пассивную стратегию удержание актива (Buy & Hold) и полностью сливает капитал в периоды затяжного медвежьего тренда.
Для придания модели локальной гибкости применяется подход переобучения на скользящем историческом окне фиксированной длины k. Оптимизация параметров OLS производится на интервале [t-k, t] для прогнозирования точки t+1.
Недостатки подхода: Экстремальная чувствительность к размеру окна k (короткое окно ловит шум, длинное — запаздывает) и полное стирание макро-памяти ряда за пределами выбранного интервала.
МЕТОД №2: Кодирование скрытых состояний (Feature Engineering / Memory)
Вместо подачи сырых, зашумленных лагов, история доходностей сжимается в низкоразмерное скрытое состояние (Hidden State), выступающее в роли рыночной «памяти».
В качестве предиктора выступает простое скользящее среднее логарифмических доходностей за окно 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, защищая капитал во время затяжного даунтренда.
Двухфакторная архитектура, оценивающая спред между локальным ценовым импульсом (быстрая компонента) и долгосрочной памятью рынка (медленная компонента):
r_hat_{t+1} = w_1 * r_{t-1} + w_2 * ((1 / N) * SUM_{i=1}^{N} r_{t-i}) + b
Полученные параметры оптимизации:
Вывод: Модель выстроила устойчивую структуру — взвешенный арбитраж между трендовой силой макро-памяти и контр-трендовым свойством локального микро-шума. Количество шорт-сигналов возросло до 549, обеспечивая стабильный рост эквити на фазах слома тренда.
cerberus, я частное лицо, не представитель фонда или брокера.
Что-то получается, что-то нет. Я пишу об этом открыто. Про какие-то свои эксперименты
cerberus, булочки моя слабость. А про алгоритмы — исследовательская работа.
Успешность торговли я в комментариях не доказываю и сигналы не продаю.
Если тема неинтересна — можно просто пройти мимо.
