Разработка системы расчета Sortino Ratio
Sortino Ratio — улучшенная версия Sharpe Ratio, которая учитывает только нисходящую волатильность (downside deviation), игнорируя «риск» от положительных возвратов.
Формула: Sortino = (Rp − MAR) / DD
где MAR — минимально приемлемая доходность (Minimum Acceptable Return), DD — downside deviation.
Downside Deviation считается только по отрицательным отклонениям от MAR:
import numpy as np
def calculate_sortino_ratio(returns, mar=0.0, periods_per_year=365):
"""
mar: Minimum Acceptable Return (в дневных единицах)
Обычно 0 или risk_free_rate / periods_per_year
"""
excess_returns = returns - mar
# Только отрицательные отклонения
downside_returns = excess_returns[excess_returns < 0]
if len(downside_returns) == 0:
return float('inf') # нет убыточных периодов
# Downside deviation
downside_deviation = np.sqrt((downside_returns ** 2).mean())
if downside_deviation == 0:
return float('inf')
mean_excess_return = excess_returns.mean()
sortino = mean_excess_return / downside_deviation
# Аннуализируем
annualized_sortino = sortino * np.sqrt(periods_per_year)
return annualized_sortino
def rolling_sortino(returns, window=90, mar=0.0, periods_per_year=365):
results = []
for i in range(window, len(returns) + 1):
window_returns = returns.iloc[i-window:i]
sortino = calculate_sortino_ratio(window_returns, mar, periods_per_year)
results.append(sortino)
return results
Когда Sortino лучше Sharpe: стратегии с асимметричным распределением доходности (например, опционные стратегии, стратегии с большими winners и малыми losers). Sortino не «штрафует» за высокую правостороннюю асимметрию.
Типичные значения: Sortino > 1.5 — хорошо. > 2.5 — отлично. Для крипто стратегий Sortino обычно выше Sharpe (рынок имеет положительный skew в bull периоды).
Дополнительная метрика — Omega Ratio: вероятность получить доходность выше MAR к вероятности получить ниже MAR. Не требует предположений о нормальном распределении.
def omega_ratio(returns, mar=0.0):
above = returns[returns > mar] - mar
below = mar - returns[returns <= mar]
if below.sum() == 0:
return float('inf')
return above.sum() / below.sum()
Система включает расчёт Sortino и Omega Ratio, rolling window анализ, сравнение с Sharpe и визуализацию в торговом dashboard.







