def calculate_backtest_performance(self): # outputs a dataset with entries a) net_asset_value (a series) and b) holdings: a holdings dataframe net_asset_value_series = pd.Series() net_asset_value_series.loc[self.bt_dt_index[0]] = self.aum holdings_df = self.holdings for date in self.dt_df.index: # get previous date date_previous = self.dt_df.dt_previous.loc[date] # calculate pnl per instrument self.pnl_per_instrument.loc[date] = self._calculate_instruments_pnl(self.dt_df.loc[date]) net_asset_value_now = self._update_net_asset_value( self.dt_df.loc[date], net_asset_value_series.loc[date_previous], holdings_df.loc[date_previous]) # update nav at date t net_asset_value_series.loc[date] = net_asset_value_now # don't update holdings at last date as we have no open t+1 price # if date != self.trading_dt_index[-1]: if date != self.dt_df.index[-1]: holdings_df.loc[date] = self._update_holdings( self.dt_df.loc[date], holdings_df.loc[date_previous], self.aum) if date.is_year_end and date.time().hour is 23: print("\nStrategy value for date " + str(date) + " for strategy calculated \n") backtest_dataset = DataSet() backtest_dataset.holdings = holdings_df backtest_dataset.net_asset_value = net_asset_value_series self._backtest = backtest_dataset return self._backtest
def calculate_backtest_performance(self): """ :return: returns a DataSet object with 2 keys: net_asset_value (pd.Series), holdings (pd.DataFrame) """ net_asset_value_series = pd.Series() net_asset_value_series.loc[self.bt_dt_index[0]] = self.aum holdings_df = self.holdings for date in self.dt_df.index: # get previous date date_previous = self.dt_df.dt_previous.loc[date] # calculate pnl per instrument self.pnl_per_instrument.loc[date] = self._calculate_instruments_pnl(self.dt_df.loc[date]) net_asset_value_now = self._update_net_asset_value( self.dt_df.loc[date], net_asset_value_series.loc[date_previous], holdings_df.loc[date_previous]) # update nav at date t net_asset_value_series.loc[date] = net_asset_value_now # don't update holdings at last date as we have no open t+1 price if date != self.dt_df.index[-1]: holdings_df.loc[date] = self._update_holdings( self.dt_df.loc[date], holdings_df.loc[date_previous], net_asset_value_now) if date.is_year_end and date.time().hour is 23: print("\nStrategy value for date " + str(date) + " for strategy calculated \n") backtest_dataset = DataSet() backtest_dataset.holdings = holdings_df.resample(self.frequency).last() backtest_dataset.net_asset_value = net_asset_value_series.resample(self.frequency).last() backtest_dataset.cumulative_pnl_per_instrument = self._get_pnl_attribution() self._backtest = backtest_dataset return self._backtest