Skip to main content
Version: v5

sortino_ratio

Calculate the rolling annualized Sortino ratio of a price series.

The prices are converted to periodic returns. In each rolling window, the mean return in excess of the minimum acceptable return is divided by the downside deviation below that return and annualized assuming 252 periods per year. When adjusted, the ratio is scaled by 1/sqrt(2) so it can be compared directly with the Sharpe ratio.

Examples​

from openbb import obb
obb.quantitative.performance.sortino_ratio(target='close', window=20, data=[{'date': '2023-01-02', 'open': 110.0, 'high': 120.0, 'low': 100.0, 'close': 115.0, 'volume': 10000.0}, {'date': '2023-01-03', 'open': 165.0, 'high': 180.0, 'low': 150.0, 'close': 172.5, 'volume': 15000.0}, {'date': '2023-01-04', 'open': 146.67, 'high': 160.0, 'low': 133.33, 'close': 153.33, 'volume': 13333.33}, {'date': '2023-01-05', 'open': 137.5, 'high': 150.0, 'low': 125.0, 'close': 143.75, 'volume': 12500.0}, {'date': '2023-01-06', 'open': 132.0, 'high': 144.0, 'low': 120.0, 'close': 138.0, 'volume': 12000.0}, {'date': '2023-01-07', 'open': 128.33, 'high': 140.0, 'low': 116.67, 'close': 134.17, 'volume': 11666.67}, {'date': '2023-01-08', 'open': 125.71, 'high': 137.14, 'low': 114.29, 'close': 131.43, 'volume': 11428.57}, {'date': '2023-01-09', 'open': 123.75, 'high': 135.0, 'low': 112.5, 'close': 129.38, 'volume': 11250.0}, {'date': '2023-01-10', 'open': 122.22, 'high': 133.33, 'low': 111.11, 'close': 127.78, 'volume': 11111.11}, {'date': '2023-01-11', 'open': 121.0, 'high': 132.0, 'low': 110.0, 'close': 126.5, 'volume': 11000.0}, {'date': '2023-01-12', 'open': 120.0, 'high': 130.91, 'low': 109.09, 'close': 125.45, 'volume': 10909.09}, {'date': '2023-01-13', 'open': 119.17, 'high': 130.0, 'low': 108.33, 'close': 124.58, 'volume': 10833.33}, {'date': '2023-01-14', 'open': 118.46, 'high': 129.23, 'low': 107.69, 'close': 123.85, 'volume': 10769.23}, {'date': '2023-01-15', 'open': 117.86, 'high': 128.57, 'low': 107.14, 'close': 123.21, 'volume': 10714.29}, {'date': '2023-01-16', 'open': 117.33, 'high': 128.0, 'low': 106.67, 'close': 122.67, 'volume': 10666.67}, {'date': '2023-01-17', 'open': 116.88, 'high': 127.5, 'low': 106.25, 'close': 122.19, 'volume': 10625.0}, {'date': '2023-01-18', 'open': 116.47, 'high': 127.06, 'low': 105.88, 'close': 121.76, 'volume': 10588.24}, {'date': '2023-01-19', 'open': 116.11, 'high': 126.67, 'low': 105.56, 'close': 121.39, 'volume': 10555.56}, {'date': '2023-01-20', 'open': 115.79, 'high': 126.32, 'low': 105.26, 'close': 121.05, 'volume': 10526.32}, {'date': '2023-01-21', 'open': 115.5, 'high': 126.0, 'low': 105.0, 'close': 120.75, 'volume': 10500.0}, {'date': '2023-01-22', 'open': 115.24, 'high': 125.71, 'low': 104.76, 'close': 120.48, 'volume': 10476.19}, {'date': '2023-01-23', 'open': 115.0, 'high': 125.45, 'low': 104.55, 'close': 120.23, 'volume': 10454.55}, {'date': '2023-01-24', 'open': 114.78, 'high': 125.22, 'low': 104.35, 'close': 120.0, 'volume': 10434.78}, {'date': '2023-01-25', 'open': 114.58, 'high': 125.0, 'low': 104.17, 'close': 119.79, 'volume': 10416.67}, {'date': '2023-01-26', 'open': 114.4, 'high': 124.8, 'low': 104.0, 'close': 119.6, 'volume': 10400.0}, {'date': '2023-01-27', 'open': 114.23, 'high': 124.62, 'low': 103.85, 'close': 119.42, 'volume': 10384.62}, {'date': '2023-01-28', 'open': 114.07, 'high': 124.44, 'low': 103.7, 'close': 119.26, 'volume': 10370.37}, {'date': '2023-01-29', 'open': 113.93, 'high': 124.29, 'low': 103.57, 'close': 119.11, 'volume': 10357.14}, {'date': '2023-01-30', 'open': 113.79, 'high': 124.14, 'low': 103.45, 'close': 118.97, 'volume': 10344.83}, {'date': '2023-01-31', 'open': 113.67, 'high': 124.0, 'low': 103.33, 'close': 118.83, 'volume': 10333.33}, {'date': '2023-02-01', 'open': 113.55, 'high': 123.87, 'low': 103.23, 'close': 118.71, 'volume': 10322.58}, {'date': '2023-02-02', 'open': 113.44, 'high': 123.75, 'low': 103.12, 'close': 118.59, 'volume': 10312.5}, {'date': '2023-02-03', 'open': 113.33, 'high': 123.64, 'low': 103.03, 'close': 118.48, 'volume': 10303.03}, {'date': '2023-02-04', 'open': 113.24, 'high': 123.53, 'low': 102.94, 'close': 118.38, 'volume': 10294.12}, {'date': '2023-02-05', 'open': 113.14, 'high': 123.43, 'low': 102.86, 'close': 118.29, 'volume': 10285.71}, {'date': '2023-02-06', 'open': 113.06, 'high': 123.33, 'low': 102.78, 'close': 118.19, 'volume': 10277.78}, {'date': '2023-02-07', 'open': 112.97, 'high': 123.24, 'low': 102.7, 'close': 118.11, 'volume': 10270.27}, {'date': '2023-02-08', 'open': 112.89, 'high': 123.16, 'low': 102.63, 'close': 118.03, 'volume': 10263.16}, {'date': '2023-02-09', 'open': 112.82, 'high': 123.08, 'low': 102.56, 'close': 117.95, 'volume': 10256.41}, {'date': '2023-02-10', 'open': 112.75, 'high': 123.0, 'low': 102.5, 'close': 117.87, 'volume': 10250.0}, {'date': '2023-02-11', 'open': 112.68, 'high': 122.93, 'low': 102.44, 'close': 117.8, 'volume': 10243.9}, {'date': '2023-02-12', 'open': 112.62, 'high': 122.86, 'low': 102.38, 'close': 117.74, 'volume': 10238.1}, {'date': '2023-02-13', 'open': 112.56, 'high': 122.79, 'low': 102.33, 'close': 117.67, 'volume': 10232.56}, {'date': '2023-02-14', 'open': 112.5, 'high': 122.73, 'low': 102.27, 'close': 117.61, 'volume': 10227.27}, {'date': '2023-02-15', 'open': 112.44, 'high': 122.67, 'low': 102.22, 'close': 117.56, 'volume': 10222.22}, {'date': '2023-02-16', 'open': 112.39, 'high': 122.61, 'low': 102.17, 'close': 117.5, 'volume': 10217.39}, {'date': '2023-02-17', 'open': 112.34, 'high': 122.55, 'low': 102.13, 'close': 117.45, 'volume': 10212.77}, {'date': '2023-02-18', 'open': 112.29, 'high': 122.5, 'low': 102.08, 'close': 117.4, 'volume': 10208.33}, {'date': '2023-02-19', 'open': 112.24, 'high': 122.45, 'low': 102.04, 'close': 117.35, 'volume': 10204.08}, {'date': '2023-02-20', 'open': 112.2, 'high': 122.4, 'low': 102.0, 'close': 117.3, 'volume': 10200.0}, {'date': '2023-02-21', 'open': 112.16, 'high': 122.35, 'low': 101.96, 'close': 117.25, 'volume': 10196.08}, {'date': '2023-02-22', 'open': 112.12, 'high': 122.31, 'low': 101.92, 'close': 117.21, 'volume': 10192.31}, {'date': '2023-02-23', 'open': 112.08, 'high': 122.26, 'low': 101.89, 'close': 117.17, 'volume': 10188.68}, {'date': '2023-02-24', 'open': 112.04, 'high': 122.22, 'low': 101.85, 'close': 117.13, 'volume': 10185.19}, {'date': '2023-02-25', 'open': 112.0, 'high': 122.18, 'low': 101.82, 'close': 117.09, 'volume': 10181.82}, {'date': '2023-02-26', 'open': 111.96, 'high': 122.14, 'low': 101.79, 'close': 117.05, 'volume': 10178.57}, {'date': '2023-02-27', 'open': 111.93, 'high': 122.11, 'low': 101.75, 'close': 117.02, 'volume': 10175.44}, {'date': '2023-02-28', 'open': 111.9, 'high': 122.07, 'low': 101.72, 'close': 116.98, 'volume': 10172.41}, {'date': '2023-03-01', 'open': 111.86, 'high': 122.03, 'low': 101.69, 'close': 116.95, 'volume': 10169.49}, {'date': '2023-03-02', 'open': 111.83, 'high': 122.0, 'low': 101.67, 'close': 116.92, 'volume': 10166.67}])

Parameters​

data: Data | DataFrame | Series | dict | list | list[DataFrame] | list[Data] | list[Series] | ndarray
Input dataset.

target: str
Name of the price column to analyze.

target_return: float
Default: 0.0
Annualized minimum acceptable return, as a decimal fraction.

window: int
Default: 252
Number of observations in each rolling window.

adjusted: bool
Default: False
When true, scale the ratio by 1/sqrt(2) for comparability with the Sharpe ratio.

index: str
Default: date
Name of the index column.


Returns​

results: list[SortinoRatioData]

Serializable results.

provider: str

Provider name.

warnings: Optional[list[Warning_]]

List of warnings.

chart: Optional[Chart]

Chart object.

extra: dict[str, Any]

Extra info.


Data​

date: date | datetime | str
Observation date.

sortino_ratio: float
Rolling annualized Sortino ratio.