← Back to Algorithmic Glossary

Sortino Ratio in Python

A variation of the Sharpe Ratio that penalizes only downside volatility, not total volatility.

Definition

The Sortino Ratio refines the Sharpe Ratio by differentiating between harmful downside deviation and neutral upside volatility. A strategy that produces large, irregular upside gains should not be penalized for that asymmetry — the Sortino Ratio corrects this by using only the standard deviation of negative returns in its denominator. This makes it a far more precise risk-adjusted metric for asymmetric return distributions, which are common in momentum and options strategies.

Quantitative Formula

Ssortino=RpRfσdS_{sortino} = \frac{R_p - R_f}{\sigma_d}

Where RpR_p is the portfolio return, RfR_f is the risk-free rate, and σd\sigma_d is the downside deviation — the standard deviation computed using only returns that fall below the target threshold (typically zero or the risk-free rate).

Why It Matters in Backtesting

A strategy can have an average Sharpe Ratio yet a stellar Sortino Ratio if its losses are small and controlled while its gains are large and sporadic. In backtesting, always compute both: a divergence between them signals asymmetric return distribution, which is actually desirable. Institutional desks typically require a Sortino Ratio > 2.0 for deployment.

Python Implementation

import numpy as np
    import pandas as pd

    def calculate_sortino_ratio(returns: pd.Series, risk_free_rate: float = 0.02, trading_days: int = 252) -> float:
        """Calculates the annualized Sortino Ratio using downside deviation."""
        excess_returns = returns - (risk_free_rate / trading_days)
        annualized_return = excess_returns.mean() * trading_days
        downside_returns = excess_returns[excess_returns < 0]
        downside_std = downside_returns.std() * np.sqrt(trading_days)
        return annualized_return / downside_std if downside_std != 0 else 0.0

Test this in a live environment

Stop running Jupyter notebooks locally. Paste this Sortino Ratio code directly into Valetha's Strategy Lab and run a full historical backtest in seconds.

Open the Python Strategy Lab

Ready to find your edge ?

Start for Free