class_docstr: An object designed to perform optimisations based on minimising a cost/objective function.
  It can find parameters for portfolios with
  
  - minimum volatility
  - maximum Sharpe ratio
  - minimum volatility for a given target return
  - maximum Sharpe ratio for a given target volatility
  
  It also provides functions to compute the Efficient Frontier between a range
  of Returns, plot the Efficient Frontier, plot the optimal portfolios
  (minimum Volatility and maximum Sharpe Ratio).
class_docstr_tok: ["An","object","designed","to","perform","optimisations","based","on","minimising","a","cost\/objective","function",".","It","can","find","parameters","for","portfolios","with","-","minimum","volatility","-","maximum","Sharpe","ratio","-","minimum","volatility","for","a","given","target","return","-","maximum","Sharpe","ratio","for","a","given","target","volatility","It","also","provides","functions","to","compute","the","Efficient","Frontier","between","a","range","of","Returns",",","plot","the","Efficient","Frontier",",","plot","the","optimal","portfolios","(","minimum","Volatility","and","maximum","Sharpe","Ratio",")","."]
docstr: Calculates and prints out Expected annualised Return,
  Volatility and Sharpe Ratio of optimised portfolio.
  
  :param verbose: Whether to print out properties or not, default: ``False``
docstr_tok: ["Calculates","and","prints","out","Expected","annualised","Return",",","Volatility","and","Sharpe","Ratio","of","optimised","portfolio",".",":","param","verbose",":","Whether","to","print","out","properties","or","not",",","default",":","``","False","``"]
code: def properties(
      self, verbose: bool = False
  ) -> Tuple[NUMERIC, FLOAT, FLOAT]:
      """Calculates and prints out Expected annualised Return,
      Volatility and Sharpe Ratio of optimised portfolio.
  
      :param verbose: Whether to print out properties or not, default: ``False``
      """
      # Type validations:
      type_validation(verbose=verbose)
      if not isinstance(verbose, bool):
          raise ValueError("verbose is expected to be a boolean.")
      if self.weights.size == 0:
          raise ValueError(
              "Error: weights are empty. Please perform an optimisation first."
          )
      (
          expected_return,
          volatility,
          sharpe,
      ) = annualised_portfolio_quantities(
          self.weights,
          self.mean_returns,
          self.cov_matrix,
          risk_free_rate=self.risk_free_rate,
          freq=self.freq,
      )
      if verbose:
          string = "-" * 70
          string += (
              f"\nOptimised portfolio for {self.last_optimisation}"
          )
          string += f"\n\nTime window/frequency: {self.freq}"
          string += f"\nRisk free rate: {self.risk_free_rate}"
          string += f"\nExpected annual Return: {expected_return:.3f}"
          string += f"\nAnnual Volatility: {volatility:.3f}"
          string += f"\nSharpe Ratio: {sharpe:.3f}"
          string += "\n\nOptimal weights:"
          string += f"\n{str(self.df_weights.transpose())}"
          string += "\n"
          string += "-" * 70
          print(string)
      return (expected_return, volatility, sharpe)
  
imports: from typing import Any, Callable, Dict, List, Optional, Tuple, Union
  import matplotlib.pylab
  import numpy
  import pandas
  import scipy.optimize
  import finquant.minimise_fun
  from finquant.data_types import ARRAY_OR_DATAFRAME, ARRAY_OR_LIST, FLOAT, INT, NUMERIC
  from finquant.quants import annualised_portfolio_quantities
  from finquant.type_utilities import type_validation
label_desc: Use image node_id 10 for calling the EfficientFrontier obj's underlying member method code with example usage: obj.properties(verbose) and returns: expected_return,  volatility,  sharpe