Skip to content

Commit c0a266c

Browse files
committed
ENH: Show paid 'Commissions [$]' in stats
1 parent 8fbb902 commit c0a266c

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

backtesting/_stats.py

+4
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ def compute_stats(
5353

5454
if isinstance(trades, pd.DataFrame):
5555
trades_df: pd.DataFrame = trades
56+
commissions = None # Not shown
5657
else:
5758
# Came straight from Backtest.run()
5859
trades_df = pd.DataFrame({
@@ -68,6 +69,7 @@ def compute_stats(
6869
'Tag': [t.tag for t in trades],
6970
})
7071
trades_df['Duration'] = trades_df['ExitTime'] - trades_df['EntryTime']
72+
commissions = sum(t._commissions for t in trades)
7173
del trades
7274

7375
pl = trades_df['PnL']
@@ -92,6 +94,8 @@ def _round_timedelta(value, _period=_data_period(index)):
9294
s.loc['Exposure Time [%]'] = have_position.mean() * 100 # In "n bars" time, not index time
9395
s.loc['Equity Final [$]'] = equity[-1]
9496
s.loc['Equity Peak [$]'] = equity.max()
97+
if commissions:
98+
s.loc['Commissions [$]'] = commissions
9599
s.loc['Return [%]'] = (equity[-1] - equity[0]) / equity[0] * 100
96100
c = ohlc_data.Close.values
97101
s.loc['Buy & Hold Return [%]'] = (c[-1] - c[0]) / c[0] * 100 # long-only return

backtesting/backtesting.py

+10-2
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,7 @@ def __init__(self, broker: '_Broker', size: int, entry_price: float, entry_bar,
538538
self.__sl_order: Optional[Order] = None
539539
self.__tp_order: Optional[Order] = None
540540
self.__tag = tag
541+
self._commissions = 0
541542

542543
def __repr__(self):
543544
return f'<Trade size={self.__size} time={self.__entry_bar}-{self.__exit_bar or ""} ' \
@@ -1013,9 +1014,16 @@ def _close_trade(self, trade: Trade, price: float, time_index: int):
10131014
if trade._tp_order:
10141015
self.orders.remove(trade._tp_order)
10151016

1016-
self.closed_trades.append(trade._replace(exit_price=price, exit_bar=time_index))
1017+
closed_trade = trade._replace(exit_price=price, exit_bar=time_index)
1018+
self.closed_trades.append(closed_trade)
10171019
# Apply commission one more time at trade exit
1018-
self._cash += trade.pl - self._commission(trade.size, price)
1020+
commission = self._commission(trade.size, price)
1021+
self._cash += trade.pl - commission
1022+
# Save commissions on Trade instance for stats
1023+
trade_open_commission = self._commission(closed_trade.size, closed_trade.entry_price)
1024+
# applied here instead of on Trade open because size could have changed
1025+
# by way of _reduce_trade()
1026+
closed_trade._commissions = commission + trade_open_commission
10191027

10201028
def _open_trade(self, price: float, size: int,
10211029
sl: Optional[float], tp: Optional[float], time_index: int, tag):

0 commit comments

Comments
 (0)