Example #1
0
    def _add_heat_map_grid(self, tickers: Sequence[Ticker], parameters_list: Sequence[tuple], third_param=None):
        grid = GridElement(mode=PlottingMode.PDF, figsize=self.image_size)
        result_df = QFDataFrame()

        for param_tuple in parameters_list:
            row = param_tuple[0]
            column = param_tuple[1]
            trades_eval_result = self.backtest_evaluator.evaluate_params_for_tickers(param_tuple, tickers)
            result_df.loc[row, column] = trades_eval_result

        result_df.sort_index(axis=0, inplace=True, ascending=False)
        result_df.sort_index(axis=1, inplace=True)

        sqn_avg_nr_trades = result_df.applymap(lambda x: x.sqn_per_avg_nr_trades)
        sqn_per100trades = result_df.applymap(lambda x: x.sqn_per100trades)
        avg_nr_of_trades = result_df.applymap(lambda x: x.avg_nr_of_trades_1Y)
        annualised_return = result_df.applymap(lambda x: x.annualised_return)
        drawdown = result_df.applymap(lambda x: x.drawdown)

        grid.add_chart(self._create_single_heat_map("SQN / AVG #trades", sqn_avg_nr_trades, tickers, 0, 1, third_param))
        grid.add_chart(self._create_single_heat_map("SQN / 100 trades", sqn_per100trades, tickers, 0, 2, third_param))
        grid.add_chart(self._create_single_heat_map("Avg # trades 1Y", avg_nr_of_trades, tickers, 3, 30, third_param))
        grid.add_chart(self._create_single_heat_map("An Return", annualised_return, tickers, -0.1, 0.2, third_param))
        grid.add_chart(self._create_single_heat_map("Drawdown", drawdown, tickers, -0.5, -0.1, third_param))

        self.document.add_element(grid)
Example #2
0
    def _add_heat_maps(self, tickers: Sequence[Ticker]):
        parameters_list = sorted(
            self.backtest_evaluator.params_backtest_summary_elem_dict.keys())

        # Group plots by type, so that they appear in the given logical order
        title_to_grid = defaultdict(lambda: GridElement(
            mode=PlottingMode.PDF, figsize=self.image_size))
        for start_time, end_time in [
            (self.backtest_summary.start_date, self.out_of_sample_start_date),
            (self.out_of_sample_start_date, self.backtest_summary.end_date)
        ]:
            results = QFDataFrame()

            for param_tuple in parameters_list:
                trades_eval_result = self.backtest_evaluator.evaluate_params_for_tickers(
                    param_tuple, tickers, start_time, end_time)
                row, column = param_tuple
                results.loc[row, column] = trades_eval_result

            results.sort_index(axis=0, inplace=True, ascending=False)
            results.sort_index(axis=1, inplace=True)
            results.fillna(TradesEvaluationResult(), inplace=True)

            sqn_avg_nr_trades = results.applymap(
                lambda x: x.sqn_per_avg_nr_trades).fillna(0)
            avg_nr_of_trades = results.applymap(
                lambda x: x.avg_nr_of_trades_1Y).fillna(0)
            annualised_return = results.applymap(
                lambda x: x.annualised_return).fillna(0)

            adjusted_start_time = results.applymap(
                lambda x: x.start_date).min().min()
            adjusted_end_time = results.applymap(
                lambda x: x.end_date).max().max()
            if adjusted_start_time >= adjusted_end_time:
                adjusted_end_time = adjusted_start_time if adjusted_start_time <= self.backtest_summary.end_date \
                    else end_time
                adjusted_start_time = start_time
            title = "{} - {} ".format(adjusted_start_time.strftime("%Y-%m-%d"),
                                      adjusted_end_time.strftime("%Y-%m-%d"))

            title_to_grid["SQN (Arithmetic return) per year"].add_chart(
                self._create_single_heat_map(title, sqn_avg_nr_trades, 0, 0.5))

            title_to_grid["Avg # trades 1Y"].add_chart(
                self._create_single_heat_map(title, avg_nr_of_trades, 2, 15))

            if len(tickers) == 1:
                title_to_grid["Annualised return"].add_chart(
                    self._create_single_heat_map(title, annualised_return, 0.0,
                                                 0.3))

        tickers_used = "Many tickers" if len(tickers) > 1 else (
            tickers[0].name if isinstance(
                tickers[0], FutureTicker) else tickers[0].as_string())

        for description, grid in title_to_grid.items():
            self.document.add_element(
                HeadingElement(3, "{} - {}".format(description, tickers_used)))
            self.document.add_element(grid)