Exemplo n.º 1
0
    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
Exemplo n.º 2
0
    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