diff --git a/backtesting/_stats.py b/backtesting/_stats.py index b22dfa2f..c1d45cae 100644 --- a/backtesting/_stats.py +++ b/backtesting/_stats.py @@ -73,6 +73,16 @@ def compute_stats( }) trades_df['Duration'] = trades_df['ExitTime'] - trades_df['EntryTime'] trades_df['Tag'] = [t.tag for t in trades] + + # Add indicator values + if len(trades_df): + for ind in strategy_instance._indicators: + ind = np.atleast_2d(ind) + for i, values in enumerate(ind): # multi-d indicators + suffix = f'_{i}' if len(ind) > 1 else '' + trades_df[f'Entry_{ind.name}{suffix}'] = values[trades_df['EntryBar'].values] + trades_df[f'Exit_{ind.name}{suffix}'] = values[trades_df['ExitBar'].values] + commissions = sum(t._commissions for t in trades) del trades diff --git a/backtesting/test/_test.py b/backtesting/test/_test.py index d5373f1a..30fdb8a6 100644 --- a/backtesting/test/_test.py +++ b/backtesting/test/_test.py @@ -333,10 +333,15 @@ def almost_equal(a, b): self.assertEqual(len(stats['_trades']), 66) + indicator_columns = [ + f'{entry}_SMA(C,{n})' + for entry in ('Entry', 'Exit') + for n in (SmaCross.fast, SmaCross.slow)] self.assertSequenceEqual( sorted(stats['_trades'].columns), sorted(['Size', 'EntryBar', 'ExitBar', 'EntryPrice', 'ExitPrice', 'SL', 'TP', - 'PnL', 'ReturnPct', 'EntryTime', 'ExitTime', 'Duration', 'Tag'])) + 'PnL', 'ReturnPct', 'EntryTime', 'ExitTime', 'Duration', 'Tag', + *indicator_columns])) def test_compute_stats_bordercase(self):