← ДокументацияDOCS / Optimization / Методы оптимизации

Методы оптимизации параметров доходности и риска

Продвинутые алгоритмы обучения с подкреплением для оптимизации торговых стратегий

Обучение с подкреплением в трейдинге

Обучение с подкреплением (Reinforcement Learning, RL) представляет собой мощный подход к оптимизации торговых стратегий, где агент учится принимать решения в условиях неопределенности финансовых рынков.

Ключевая задача RL в трейдинге — найти оптимальный баланс между доходностью и риском, используя различные метрики оценки качества стратегий.

Индекс обучения (Train Index)

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

python
train_idx = (1 + dpnl) / (1 + dd_pct) - 1

Где:

  • dpnl — доходность (PNL / initial_balance)
  • dd_pct — максимальная просадка в диапазоне [0, 1]

Однако этот подход имеет ограничения: при равном индексе модель не сохраняется, даже если она заработала больше при пропорционально равном риске.

1. Линейный бонус к прибыли (Linear Bonus)

Первый метод добавляет пропорциональный коэффициент, который позволяет выбирать состояние с большей доходностью при пропорционально равном риске.

python
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)

Второй метод усиливает числитель формулы пропорционально безопасности стратегии.

python
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)

Третий метод использует сигмоидную функцию для плавного перехода между состояниями.

python
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)

Четвёртый метод штрафует только "вредную" часть просадки сверх порога.

python
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-подобный

Штрафует только вредную часть риска

QUANT LAB — Документация