Skip to content

Commit 3e5c192

Browse files
committed
REF: Use math.copysign over np.sign to shave off a few ms per call
1 parent d305d4c commit 3e5c192

File tree

1 file changed

+7
-7
lines changed

1 file changed

+7
-7
lines changed

backtesting/backtesting.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,7 @@ def exit_time(self) -> Optional[Union[pd.Timestamp, int]]:
591591
@property
592592
def is_long(self):
593593
"""True if the trade is long (trade size is positive)."""
594-
return self.size > 0
594+
return self.__size > 0
595595

596596
@property
597597
def is_short(self):
@@ -608,7 +608,7 @@ def pl(self):
608608
def pl_pct(self):
609609
"""Trade profit (positive) or loss (negative) in percent."""
610610
price = self.__exit_price or self.__broker.last_price
611-
return np.sign(self.__size) * (price / self.__entry_price - 1)
611+
return copysign(1, self.__size) * (price / self.__entry_price - 1)
612612

613613
@property
614614
def value(self):
@@ -840,14 +840,14 @@ def _process_orders(self):
840840

841841
# Adjust price to include commission (or bid-ask spread).
842842
# In long positions, the adjusted price is a fraction higher, and vice versa.
843-
adjusted_price = price * (1 + (np.sign(order.size) * self._commission))
843+
adjusted_price = price * (1 + copysign(self._commission, order.size))
844844

845845
# If order size was specified proportionally,
846846
# precompute true size in units, accounting for margin and spread/commissions
847847
size = order.size
848848
if -1 < size < 1:
849-
size = np.sign(size) * int((self.margin_available * self._leverage * abs(size))
850-
// adjusted_price)
849+
size = copysign(int((self.margin_available * self._leverage * abs(size))
850+
// adjusted_price), size)
851851
# Not enough cash/margin even for a single unit
852852
if not size:
853853
self.orders.remove(order)
@@ -862,7 +862,7 @@ def _process_orders(self):
862862
for trade in list(self.trades):
863863
if trade.is_long == order.is_long:
864864
continue
865-
assert np.sign(trade.size) + np.sign(order.size) == 0
865+
assert trade.size * order.size < 0
866866

867867
# Order size greater than this opposite-directed existing trade,
868868
# so it will be closed completely
@@ -909,7 +909,7 @@ def _process_orders(self):
909909
self._process_orders()
910910

911911
def _reduce_trade(self, trade: Trade, price: float, size: float, time_index: int):
912-
assert np.sign(trade.size) != np.sign(size)
912+
assert trade.size * size < 0
913913
assert abs(trade.size) >= abs(size)
914914

915915
size_left = trade.size + size

0 commit comments

Comments
 (0)