From 2723b7809ca352e3f6f6ebb56e2fbc47ad5a59b1 Mon Sep 17 00:00:00 2001 From: Juan Pablo Amoroso Date: Wed, 18 Dec 2019 10:31:52 -0300 Subject: [PATCH] Filter now returns a pd.Series of booleans --- backtester/datahandler/schema.py | 2 +- backtester/strategy/strategy.py | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/backtester/datahandler/schema.py b/backtester/datahandler/schema.py index ecd0403..99edfce 100644 --- a/backtester/datahandler/schema.py +++ b/backtester/datahandler/schema.py @@ -158,7 +158,7 @@ class Filter: def __call__(self, data): """Returns dataframe of filtered data""" - return data.query(self.query) + return data.eval(self.query) def __repr__(self): return "Filter(query='{}')".format(self.query) diff --git a/backtester/strategy/strategy.py b/backtester/strategy/strategy.py index 6c4613e..86bf741 100644 --- a/backtester/strategy/strategy.py +++ b/backtester/strategy/strategy.py @@ -60,12 +60,14 @@ class Strategy: return self def add_exit_thresholds(self, profit_pct=0.0, loss_pct=0.0): - """Adds maximum profit/loss thresholds. + """Adds maximum profit/loss thresholds. Both **must** be >= 0.0 Args: profit_pct (float, optional): Max profit level. Defaults to 0.0 loss_pct (float, optional): Max loss level. Defaults to 0.0 """ + assert profit_pct >= 0 + assert loss_pct >= 0 self.exit_thresholds = (profit_pct, loss_pct) def filter_entries(self, options): @@ -133,17 +135,17 @@ class Strategy: flt = leg.exit_filter cost_field = (~leg.direction).value - df = flt(options) + df = options[flt(options)] fields = self._signal_fields(cost_field) subset_df = df.loc[:, fields.keys()] subset_df.rename(columns=fields, inplace=True) order = get_order(leg.direction, signal) - subset_df["order"] = order.name + subset_df['order'] = order.name # Change sign of cost for SELL orders if leg.direction == Direction.SELL: - subset_df["cost"] = -subset_df["cost"] + subset_df['cost'] = -subset_df['cost'] dfs.append(subset_df.reset_index(drop=True))