Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions backtesting/_stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ def _round_timedelta(value, _period=_data_period(index)):
1 if freq_days == 365 else
(365 if have_weekends else 252))
freq = {7: 'W', 31: 'ME', 365: 'YE'}.get(freq_days, 'D')
day_returns = equity_df['Equity'].resample(freq).last().dropna().pct_change()
day_returns = equity_df['Equity'].resample(freq).last().dropna().pct_change().dropna()
gmean_day_return = geometric_mean(day_returns)

# Annualized return and risk metrics are computed based on the (mostly correct)
Expand All @@ -142,7 +142,7 @@ def _round_timedelta(value, _period=_data_period(index)):
# s.loc['Return (Ann.) [%]'] = gmean_day_return * annual_trading_days * 100
# s.loc['Risk (Ann.) [%]'] = day_returns.std(ddof=1) * np.sqrt(annual_trading_days) * 100
if is_datetime_index:
time_in_years = (s.loc['Duration'].days + s.loc['Duration'].seconds / 86400) / annual_trading_days
time_in_years = (s.loc['Duration'].days + s.loc['Duration'].seconds / 86400) / 365.25
s.loc['CAGR [%]'] = ((s.loc['Equity Final [$]'] / equity[0])**(1 / time_in_years) - 1) * 100 if time_in_years else np.nan # noqa: E501

# Our Sharpe mismatches `empyrical.sharpe_ratio()` because they use arithmetic mean return
Expand Down
12 changes: 6 additions & 6 deletions backtesting/test/_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@ def test_compute_stats(self):
'Avg. Trade [%]': 2.531715975158555,
'Best Trade [%]': 53.59595229490424,
'Buy & Hold Return [%]': 522.0601851851852,
'Calmar Ratio': 0.4414380935608377,
'Calmar Ratio': 0.44166409202994605,
'Duration': pd.Timedelta('3116 days 00:00:00'),
'End': pd.Timestamp('2013-03-01 00:00:00'),
'Equity Final [$]': 51422.98999999996,
Expand All @@ -330,14 +330,14 @@ def test_compute_stats(self):
'Max. Drawdown [%]': -47.98012705007589,
'Max. Trade Duration': pd.Timedelta('183 days 00:00:00'),
'Profit Factor': 2.167945974262033,
'Return (Ann.) [%]': 21.180255813792282,
'Return (Ann.) [%]': 21.191099249053224,
'Return [%]': 414.2298999999996,
'Volatility (Ann.) [%]': 36.49390889140787,
'CAGR [%]': 14.159843619607383,
'Volatility (Ann.) [%]': 36.49716090702389,
'CAGR [%]': 21.160245705962623,
'SQN': 1.0766187356697705,
'Kelly Criterion': 0.1518705127029717,
'Sharpe Ratio': 0.5803778344714113,
'Sortino Ratio': 1.0847880675854096,
'Sharpe Ratio': 0.5806232244485349,
'Sortino Ratio': 1.0853434352488662,
'Start': pd.Timestamp('2004-08-19 00:00:00'),
'Win Rate [%]': 46.96969696969697,
'Worst Trade [%]': -18.39887353835481,
Expand Down