Skip to content
6 changes: 6 additions & 0 deletions backtesting/_stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,12 @@ def _round_timedelta(value, _period=_data_period(index)):
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)
# calculate returns using vectorized operations
equity_log_returns = np.log(equity[1:] / equity[:-1])
market_log_returns = np.log(c[1:] / c[:-1])
cov_matrix = np.cov(equity_log_returns, market_log_returns)
s.loc['Beta'] = cov_matrix[0, 1] / cov_matrix[1, 1]
s.loc['Alpha [%]'] = (s.loc['Return [%]'] - risk_free_rate * 100) - s.loc['Beta'] * (s.loc['Buy & Hold Return [%]'] - risk_free_rate * 100)
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())
Expand Down
Loading