Комментарии пользователя Михаил Шардин
за 3 минуты не спарсить все публикации.
4000 постов? А это запись номер 1310239
Дмитрий-Димас Ермаков, не думаю что это вообще как-то появлияет.
Слишком большой поток информации. Сложно отличить что работает, а что нет.
Тот же ИИ раскажет в 10 раз больше если задавать правильные вопросы.
Только как понять что именно они правильные...
Вот ещё мои расчеты: smart-lab.ru/blog/1307984.php
Если кратко, у биткоина BTC-5.26 на Московской бирже цене надо пройти почти 90 тиков чтобы просто окупить комиссии. Или можно записать по другому: комиссия составляет 0.116% от номинала контракта (6.38 / 5480 = 0.116%).
А у IBM6 Фьючерсный контракт на акции инвестиционного фонда IBIT Trust ETF: 6,2 тика.
Переход от концепции пакетного обучения (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. |
Поведение модели |
Оптимизирует точность модели на текущей свече, игнорируя кумулятивные просадки капитала во времени. |
Агент способен временно удерживать позицию, фиксировать микро-убытки или выходить в кэш, если траектория этого действия максимизирует итоговую доходность портфеля на всей дистанции. |