From 87d34df2849810438f39eac7a15ae6bcd43c6b8f Mon Sep 17 00:00:00 2001 From: Camilo1704 Date: Thu, 19 Mar 2020 14:39:58 -0300 Subject: [PATCH 1/4] sell_some_options fixed --- backtester/backtester.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/backtester/backtester.py b/backtester/backtester.py index dd39223..e437907 100644 --- a/backtester/backtester.py +++ b/backtester/backtester.py @@ -195,13 +195,19 @@ class Backtest: sold = 0 total_costs = sum([options_value[i]['cost'] for i in range(len(options_value))]) for i, (contract_per_row, inventory_row) in enumerate(zip(total_costs, self._options_inventory.iterrows())): - if to_sell - sold < -contract_per_row * inventory_row[1]['totals']['qty']: - qty_to_sell = to_sell // contract_per_row - self._options_inventory.at[i, ('totals', 'date')] = date - self._options_inventory.at[i, ('totals', 'qty')] += qty_to_sell - sold -= (qty_to_sell * contract_per_row) + if (to_sell - sold < -contract_per_row * inventory_row[1]['totals']['qty']) and (to_sell - sold) > 0: + qty_to_sell = (to_sell - sold) // contract_per_row + if qty_to_sell != 0: + trade_log_append = self._options_inventory.iloc[i].copy() + trade_log_append['totals', 'qty'] = qty_to_sell + trade_log_append['totals', 'date'] = date + self.trade_log = self.trade_log.append(trade_log_append, ignore_index=True) + self._options_inventory.at[i, ('totals', 'date')] = date + self._options_inventory.at[i, ('totals', 'qty')] += qty_to_sell - self.current_cash -= sold + sold += (qty_to_sell * contract_per_row) + + self.current_cash += sold - to_sell def _current_stock_capital(self, stocks): """Return the current value of the stocks inventory. From 5b87075c2225d8de91130155d28ec0ffca0afaed Mon Sep 17 00:00:00 2001 From: Camilo1704 Date: Thu, 19 Mar 2020 18:48:41 -0300 Subject: [PATCH 2/4] order and costs in trade_log modified in sell_some_options exits --- backtester/backtester.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/backtester/backtester.py b/backtester/backtester.py index e437907..4092579 100644 --- a/backtester/backtester.py +++ b/backtester/backtester.py @@ -201,6 +201,10 @@ class Backtest: trade_log_append = self._options_inventory.iloc[i].copy() trade_log_append['totals', 'qty'] = qty_to_sell trade_log_append['totals', 'date'] = date + trade_log_append['totals', 'cost'] *= -1 + for leg in self._options_strategy.legs: + trade_log_append[leg.name, 'order'] = ~trade_log_append[leg.name, 'order'] + trade_log_append[leg.name, 'cost'] *= -1 self.trade_log = self.trade_log.append(trade_log_append, ignore_index=True) self._options_inventory.at[i, ('totals', 'date')] = date self._options_inventory.at[i, ('totals', 'qty')] += qty_to_sell From 636b807be13eb517cf7072cea34acce1a9dff4d8 Mon Sep 17 00:00:00 2001 From: Camilo1704 Date: Fri, 20 Mar 2020 11:58:23 -0300 Subject: [PATCH 3/4] fixed exit cost in trade_log when exiting options --- backtester/backtester.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backtester/backtester.py b/backtester/backtester.py index 4092579..edf82ff 100644 --- a/backtester/backtester.py +++ b/backtester/backtester.py @@ -201,10 +201,10 @@ class Backtest: trade_log_append = self._options_inventory.iloc[i].copy() trade_log_append['totals', 'qty'] = qty_to_sell trade_log_append['totals', 'date'] = date - trade_log_append['totals', 'cost'] *= -1 - for leg in self._options_strategy.legs: + trade_log_append['totals', 'cost'] = contract_per_row + for j, leg in enumerate(self._options_strategy.legs): trade_log_append[leg.name, 'order'] = ~trade_log_append[leg.name, 'order'] - trade_log_append[leg.name, 'cost'] *= -1 + trade_log_append[leg.name, 'cost'] = options_value[j].iloc[i]['cost'] self.trade_log = self.trade_log.append(trade_log_append, ignore_index=True) self._options_inventory.at[i, ('totals', 'date')] = date self._options_inventory.at[i, ('totals', 'qty')] += qty_to_sell From 3124aa8a56cc4e41e7aed64efb9567448d17e692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Rodr=C3=ADguez=20Chatruc?= Date: Fri, 20 Mar 2020 12:33:52 -0300 Subject: [PATCH 4/4] Changed variable names to improve readability --- backtester/backtester.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/backtester/backtester.py b/backtester/backtester.py index edf82ff..5addb7c 100644 --- a/backtester/backtester.py +++ b/backtester/backtester.py @@ -188,28 +188,29 @@ class Backtest: self._execute_option_entries(date, options, options_allocation - options_capital) else: to_sell = options_capital - options_allocation - options_value = self._get_current_option_quotes(options) - self._sell_some_options(date, to_sell, options_value) + current_options = self._get_current_option_quotes(options) + self._sell_some_options(date, to_sell, current_options) - def _sell_some_options(self, date, to_sell, options_value): + def _sell_some_options(self, date, to_sell, current_options): sold = 0 - total_costs = sum([options_value[i]['cost'] for i in range(len(options_value))]) - for i, (contract_per_row, inventory_row) in enumerate(zip(total_costs, self._options_inventory.iterrows())): - if (to_sell - sold < -contract_per_row * inventory_row[1]['totals']['qty']) and (to_sell - sold) > 0: - qty_to_sell = (to_sell - sold) // contract_per_row + total_costs = sum([current_options[i]['cost'] for i in range(len(current_options))]) + for i, (exit_cost, inventory_row) in enumerate(zip(total_costs, self._options_inventory.iterrows())): + if (to_sell - sold < -exit_cost * inventory_row[1]['totals']['qty']) and (to_sell - sold) > 0: + qty_to_sell = (to_sell - sold) // exit_cost if qty_to_sell != 0: trade_log_append = self._options_inventory.iloc[i].copy() trade_log_append['totals', 'qty'] = qty_to_sell trade_log_append['totals', 'date'] = date - trade_log_append['totals', 'cost'] = contract_per_row + trade_log_append['totals', 'cost'] = exit_cost for j, leg in enumerate(self._options_strategy.legs): trade_log_append[leg.name, 'order'] = ~trade_log_append[leg.name, 'order'] - trade_log_append[leg.name, 'cost'] = options_value[j].iloc[i]['cost'] + trade_log_append[leg.name, 'cost'] = current_options[j].iloc[i]['cost'] + self.trade_log = self.trade_log.append(trade_log_append, ignore_index=True) self._options_inventory.at[i, ('totals', 'date')] = date self._options_inventory.at[i, ('totals', 'qty')] += qty_to_sell - sold += (qty_to_sell * contract_per_row) + sold += (qty_to_sell * exit_cost) self.current_cash += sold - to_sell