From 79a57bc0edfea738687f9f7551bb274dee9990bf Mon Sep 17 00:00:00 2001 From: atakanokan Date: Tue, 21 Sep 2021 13:55:03 -0700 Subject: [PATCH 1/3] removed clipping to return negative SR, calmar and sortino ratios --- backtesting/_stats.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backtesting/_stats.py b/backtesting/_stats.py index 8435605c..ee8173e3 100644 --- a/backtesting/_stats.py +++ b/backtesting/_stats.py @@ -117,11 +117,11 @@ def _round_timedelta(value, _period=_data_period(index)): # Our Sharpe mismatches `empyrical.sharpe_ratio()` because they use arithmetic mean return # and simple standard deviation - s.loc['Sharpe Ratio'] = np.clip((s.loc['Return (Ann.) [%]'] - risk_free_rate) / (s.loc['Volatility (Ann.) [%]'] or np.nan), 0, np.inf) # noqa: E501 + s.loc['Sharpe Ratio'] = (s.loc['Return (Ann.) [%]'] - risk_free_rate) / (s.loc['Volatility (Ann.) [%]'] or np.nan) # noqa: E501 # Our Sortino mismatches `empyrical.sortino_ratio()` because they use arithmetic mean return - s.loc['Sortino Ratio'] = np.clip((annualized_return - risk_free_rate) / (np.sqrt(np.mean(day_returns.clip(-np.inf, 0)**2)) * np.sqrt(annual_trading_days)), 0, np.inf) # noqa: E501 + s.loc['Sortino Ratio'] = (annualized_return - risk_free_rate) / (np.sqrt(np.mean(day_returns.clip(-np.inf, 0)**2)) * np.sqrt(annual_trading_days)) # noqa: E501 max_dd = -np.nan_to_num(dd.max()) - s.loc['Calmar Ratio'] = np.clip(annualized_return / (-max_dd or np.nan), 0, np.inf) + s.loc['Calmar Ratio'] = annualized_return / (-max_dd or np.nan) s.loc['Max. Drawdown [%]'] = max_dd * 100 s.loc['Avg. Drawdown [%]'] = -dd_peaks.mean() * 100 s.loc['Max. Drawdown Duration'] = _round_timedelta(dd_dur.max()) From 762591a9def856859d4dd5872667dfaa18f1ce35 Mon Sep 17 00:00:00 2001 From: Atakan Okan Date: Tue, 28 Sep 2021 00:34:20 -0400 Subject: [PATCH 2/3] Removed parenthesis Co-authored-by: kernc --- backtesting/_stats.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backtesting/_stats.py b/backtesting/_stats.py index ee8173e3..1acc38ca 100644 --- a/backtesting/_stats.py +++ b/backtesting/_stats.py @@ -117,7 +117,7 @@ def _round_timedelta(value, _period=_data_period(index)): # Our Sharpe mismatches `empyrical.sharpe_ratio()` because they use arithmetic mean return # and simple standard deviation - s.loc['Sharpe Ratio'] = (s.loc['Return (Ann.) [%]'] - risk_free_rate) / (s.loc['Volatility (Ann.) [%]'] or np.nan) # noqa: E501 + s.loc['Sharpe Ratio'] = s.loc['Return (Ann.) [%]'] - risk_free_rate) / (s.loc['Volatility (Ann.) [%]'] or np.nan # noqa: E501 # Our Sortino mismatches `empyrical.sortino_ratio()` because they use arithmetic mean return s.loc['Sortino Ratio'] = (annualized_return - risk_free_rate) / (np.sqrt(np.mean(day_returns.clip(-np.inf, 0)**2)) * np.sqrt(annual_trading_days)) # noqa: E501 max_dd = -np.nan_to_num(dd.max()) From 9ce1f6692fd8edcbc2e65d2bb2912477eada39e6 Mon Sep 17 00:00:00 2001 From: Atakan Okan Date: Tue, 28 Sep 2021 00:34:36 -0400 Subject: [PATCH 3/3] removed parenthesis Co-authored-by: kernc --- backtesting/_stats.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backtesting/_stats.py b/backtesting/_stats.py index 1acc38ca..d4f0bdec 100644 --- a/backtesting/_stats.py +++ b/backtesting/_stats.py @@ -119,7 +119,7 @@ def _round_timedelta(value, _period=_data_period(index)): # and simple standard deviation s.loc['Sharpe Ratio'] = s.loc['Return (Ann.) [%]'] - risk_free_rate) / (s.loc['Volatility (Ann.) [%]'] or np.nan # noqa: E501 # Our Sortino mismatches `empyrical.sortino_ratio()` because they use arithmetic mean return - s.loc['Sortino Ratio'] = (annualized_return - risk_free_rate) / (np.sqrt(np.mean(day_returns.clip(-np.inf, 0)**2)) * np.sqrt(annual_trading_days)) # noqa: E501 + s.loc['Sortino Ratio'] = annualized_return - risk_free_rate) / (np.sqrt(np.mean(day_returns.clip(-np.inf, 0)**2)) * np.sqrt(annual_trading_days) # noqa: E501 max_dd = -np.nan_to_num(dd.max()) s.loc['Calmar Ratio'] = annualized_return / (-max_dd or np.nan) s.loc['Max. Drawdown [%]'] = max_dd * 100