docs: def portfolio_performance(self, verbose=False, risk_free_rate=0.02):
          """
          After optimising, calculate (and optionally print) the performance of the optimal
          portfolio. Currently calculates expected return, volatility, and the Sharpe ratio.
  
          :param verbose: whether performance should be printed, defaults to False
          :type verbose: bool, optional
          :param risk_free_rate: risk-free rate of borrowing/lending, defaults to 0.02
          :type risk_free_rate: float, optional
          :raises ValueError: if weights have not been calcualted yet
          :return: expected return, volatility, Sharpe ratio.
          :rtype: (float, float, float)
          """
          return base_optimizer.portfolio_performance(
              self.expected_returns,
              self.cov_matrix,
              self.weights,
              verbose,
              risk_free_rate,
          )