Esempio n. 1
0
    def get_ef_points(self):
        """
        Get all the points for the Efficient Frontier running optimizer.

        If verbose=True calculates elapsed time for each point and the total elapsed time.
        """
        main_start_time = time.time()
        df = pd.DataFrame()
        # left part of the EF
        for i, target_cagr in enumerate(self.target_cagr_range_left):
            start_time = time.time()
            row = self.minimize_risk(target_cagr)
            df = df.append(row, ignore_index=True)
            end_time = time.time()
            if self.verbose:
                print(f"left EF point #{i + 1}/{self.n_points} is done in {end_time - start_time:.2f} sec.")
        # right part of the EF
        range_right = self.target_cagr_range_right
        if range_right is not None:  # range_right can be a DataFrame. Must put an explicit "is not None"
            n = len(range_right)
            for i, target_cagr in enumerate(range_right):
                start_time = time.time()
                row = self.maximize_risk(target_cagr)
                df = df.append(row, ignore_index=True)
                end_time = time.time()
                if self.verbose:
                    print(f"right EF point #{i + 1}/{n} is done in {end_time - start_time:.2f} sec.")
        df = Frame.change_columns_order(df, ['Risk', 'CAGR'])
        main_end_time = time.time()
        if self.verbose:
            print(f"Total time taken is {(main_end_time - main_start_time) / 60:.2f} min.")
        self._ef_points = df
Esempio n. 2
0
 def ef_points(self) -> pd.DataFrame:
     """
     DataFrame of weights and risk/return values for the Efficient Frontier.
     The columns of the DataFrame:
     - weights
     - mean return
     - CAGR
     - risk (std)
     All the values are annualized.
     """
     target_rs = self.mean_return_range
     df = pd.DataFrame(dtype="float")
     for x in target_rs:
         row = self.minimize_risk(x, monthly_return=True)
         df = df.append(row, ignore_index=True)
     df = Frame.change_columns_order(df, ["Risk", "Mean return", "CAGR"])
     return df