class_docstr: An object to perform a Monte Carlo run/simulation for finding
  optimised financial portfolios.
  
  Inherits from `MonteCarlo`.
class_docstr_tok: ["An","object","to","perform","a","Monte","Carlo","run\/simulation","for","finding","optimised","financial","portfolios",".","Inherits","from","`","MonteCarlo","`","."]
docstr: Plots the results of the Monte Carlo run, with all of the
  randomly generated weights/portfolios, as well as markers
  for the portfolios with the minimum Volatility and maximum
  Sharpe Ratio.
docstr_tok: ["Plots","the","results","of","the","Monte","Carlo","run",",","with","all","of","the","randomly","generated","weights\/portfolios",",","as","well","as","markers","for","the","portfolios","with","the","minimum","Volatility","and","maximum","Sharpe","Ratio","."]
code: def plot_results(self) -> None:
      """Plots the results of the Monte Carlo run, with all of the
      randomly generated weights/portfolios, as well as markers
      for the portfolios with the minimum Volatility and maximum
      Sharpe Ratio.
      """
      if (
          self.df_results is None
          or self.df_weights is None
          or self.opt_weights is None
          or self.opt_results is None
      ):
          raise ValueError(
              "Error: Cannot plot, run the Monte Carlo "
              + "optimisation first."
          )
      # create scatter plot coloured by Sharpe Ratio
      plt.scatter(
          self.df_results["Volatility"],
          self.df_results["Expected Return"],
          c=self.df_results["Sharpe Ratio"],
          cmap="RdYlBu",
          s=10,
          label=None,
      )
      cbar = plt.colorbar()
      # mark in green the minimum volatility
      plt.scatter(
          self.opt_results.loc["Min Volatility"]["Volatility"],
          self.opt_results.loc["Min Volatility"]["Expected Return"],
          marker="^",
          color="g",
          s=100,
          label="min Volatility",
      )
      # mark in red the highest sharpe ratio
      plt.scatter(
          self.opt_results.loc["Max Sharpe Ratio"]["Volatility"],
          self.opt_results.loc["Max Sharpe Ratio"]["Expected Return"],
          marker="^",
          color="r",
          s=100,
          label="max Sharpe Ratio",
      )
      # also set marker for initial portfolio, if weights were given
      if self.initial_weights is not None:
          # computed expected return and volatility of initial portfolio
          initial_values = annualised_portfolio_quantities(
              self.initial_weights,
              self.return_means,
              self.cov_matrix,
              self.risk_free_rate,
              self.freq,
          )
          initial_return = initial_values[0]
          initial_volatility = initial_values[1]
          plt.scatter(
              initial_volatility,
              initial_return,
              marker="^",
              color="k",
              s=100,
              label="Initial Portfolio",
          )
      plt.title(
          "Monte Carlo simulation to optimise the portfolio based "
          + "on the Efficient Frontier"
      )
      plt.xlabel("Volatility [period=" + str(self.freq) + "]")
      plt.ylabel("Expected Return [period=" + str(self.freq) + "]")
      cbar.ax.set_ylabel(
          "Sharpe Ratio [period=" + str(self.freq) + "]", rotation=90
      )
      plt.legend()
  
file_path: FinQuant/finquant/monte_carlo.py
imports: from typing import Any, Callable, Dict, Optional, Tuple
  import matplotlib.pylab
  import numpy
  import pandas
  from finquant.data_types import FLOAT, INT
  from finquant.quants import annualised_portfolio_quantities
  from finquant.type_utilities import type_validation
label_desc: Use image node_id 5 for calling the MonteCarloOpt obj's underlying member method code with example usage: obj.plot_results() without return types