Реализация кастомной функции потерь Sharpe Ratio в PyTorch

Реализация кастомной функции потерь Sharpe Ratio в PyTorch Анализ данных и Бэктесты
Руководство по созданию кастомной функции потерь для максимизации коэффициента Шарпа в нейронных сетях на PyTorch для количественного трейдинга.
Суть: Реализация дифференцируемой функции потерь на основе коэффициента Шарпа позволяет нейронной сети напрямую оптимизировать риск-скорректированную доходность, минуя промежуточные метрики вроде MSE.

В количественном трейдинге стандартные функции потерь, такие как MSELoss или CrossEntropyLoss, часто не учитывают специфику финансовых временных рядов. Прямая оптимизация коэффициента Шарпа позволяет модели фокусироваться на максимизации доходности при минимизации волатильности.

Перед тем как переходить к обучению, рекомендую ознакомиться с тем, как подготавливать данные, например, через Интеграция ArcticDB для хранения tick data в pandas, а также изучить Моделирование рыночных режимов с помощью марковских цепей на Python для фильтрации сигналов.

Исходный код

Ниже представлена реализация функции потерь, которая вычисляет отрицательный коэффициент Шарпа (так как PyTorch выполняет минимизацию).

import torch

def sharpe_loss(returns, risk_free_rate=0.0):
    # Вычисляем избыточную доходность
    excess_returns = returns - risk_free_rate
    
    # Среднее и стандартное отклонение
    mean_return = torch.mean(excess_returns)
    std_return = torch.std(excess_returns, unbiased=False) + 1e-9
    
    # Отрицательный Sharpe Ratio для минимизации
    return -(mean_return / std_return)

Разбор параметров

  • returns: Тензор доходностей стратегии, предсказанный нейронной сетью.
  • risk_free_rate: Безрисковая ставка, обычно принимается за 0 для дневных данных.
  • 1e-9: Эпсилон-добавка для обеспечения численной стабильности и предотвращения деления на ноль.

Как запустить

Для интеграции в цикл обучения используйте sharpe_loss вместо стандартных функций. Помните, что для корректной оценки стратегии после обучения стоит использовать Бэктестинг Mean Reversion стратегий на Python с VectorBT. При обучении убедитесь, что ваш тензор returns сохраняет вычислительный граф, иначе градиенты не будут переданы обратно в веса модели.

Оцените статью
FinFluct