Методы оптимизации параметров доходности и риска
Продвинутые алгоритмы обучения с подкреплением для оптимизации торговых стратегий
Обучение с подкреплением в трейдинге
Обучение с подкреплением (Reinforcement Learning, RL) представляет собой мощный подход к оптимизации торговых стратегий, где агент учится принимать решения в условиях неопределенности финансовых рынков.
Ключевая задача RL в трейдинге — найти оптимальный баланс между доходностью и риском, используя различные метрики оценки качества стратегий.
Индекс обучения (Train Index)
Индекс обучения — это метрика, которая определяет, стала ли текущая модель лучше или хуже по сравнению с предыдущими состояниями. Традиционный подход использует простую формулу:
train_idx = (1 + dpnl) / (1 + dd_pct) - 1
Где:
- dpnl — доходность (PNL / initial_balance)
- dd_pct — максимальная просадка в диапазоне [0, 1]
Однако этот подход имеет ограничения: при равном индексе модель не сохраняется, даже если она заработала больше при пропорционально равном риске.
1. Линейный бонус к прибыли (Linear Bonus)
Первый метод добавляет пропорциональный коэффициент, который позволяет выбирать состояние с большей доходностью при пропорционально равном риске.
def train_index_linear(dpnl: float, # PNL / initial_balance
dd_pct: float, # max_dd in [0‥1]
thr: float = .10, # drawdown_threshold 10 %
k: float = .30): # «вес» бонуса
"""
• base = (1+dpnl)/(1+dd_pct) − 1 (как было)
• bonus = k·dpnl·max(0, 1 - dd_pct/thr) (0, если dd выше порога)
"""
base = (1.0 + dpnl) / (1.0 + dd_pct) - 1.0
bonus = k * dpnl * max(0.0, 1 - dd_pct / thr)
return base + bonusПоведение: при dd → 0 бонус = k·dpnl; при dd = thr бонус = 0; дальше индекс совпадает с базовым.
2. Пропорциональная «премия» к числителю (Scaled Profit)
Второй метод усиливает числитель формулы пропорционально безопасности стратегии.
def train_index_scaled(dpnl: float, dd_pct: float,
thr=.10, k=.50):
"""
• profit↑ → числитель усиливается
• risk больше thr → усиления нет
"""
scale = 1 + k * max(0.0, 1 - dd_pct/thr) # в диапазоне [1, 1+k]
return (1.0 + dpnl * scale) / (1.0 + dd_pct) - 1.0Поведение: безопасный (малый dd) вариант получает множитель меньше или равный 1+k прямо в числителе формулы.
3. Плавная S-образная надбавка (Sigmoid Bonus)
Третий метод использует сигмоидную функцию для плавного перехода между состояниями.
from math import exp
def train_index_sigmoid(dpnl, dd_pct, thr=.10, k=.40, sharp=15):
"""
• bonus весит k·dpnl
• активируется гладкой сигмоидой: wild→0 safe→~k
"""
# σ(dd) ≈ 1, пока dd меньше thr ; быстро →0, когда dd→thr
sigma = 1 / (1 + exp( sharp * (dd_pct - thr)))
base = (1+dpnl)/(1+dd_pct) - 1
bonus = k * dpnl * sigma
return base + bonusПоведение: даёт практически полный бонус при dd значительно ниже порога, снимает его по "S-кривой".
4. Улучшенный Sortino-подобный индекс (Sortino)
Четвёртый метод штрафует только "вредную" часть просадки сверх порога.
def train_index_sortino(dpnl, dd_pct, thr=.10):
"""
• штрафуем не весь drawdown, а только «вредную» часть сверх thr
"""
downside = max(0.0, dd_pct - thr)
return (1.0 + dpnl) / (1.0 + downside) - 1.0Поведение: если риск меньше или равен thr, denominator = 1, то есть индекс = чистая доходность; как только dd больше thr, получаем знакомый риск-adjust.
Сравнение методов
Каждый метод решает задачу "при прочем риске выбрать более прибыльный вариант" по-своему, предоставляя различные подходы к оптимизации:
Линейный бонус
Простой и понятный подход с линейным затуханием
Пропорциональная премия
Усиливает числитель пропорционально безопасности
S-образная надбавка
Плавный переход с использованием сигмоиды
Sortino-подобный
Штрафует только вредную часть риска