fmilthaler / FinQuant

A program for financial portfolio management, analysis and optimisation.
MIT License
1.37k stars 190 forks source link

Limit allocation weights #69

Open Hexik opened 2 years ago

Hexik commented 2 years ago

Thanks for the great work at this library.

How can I set the lower and upper limit for the allocation of shares in the portfolio when calculating EfficientFrontier? E.g. not less than 2% and not more than 15% per title.

Thank you

Mira

Leohanhart commented 1 year ago

Hi Mira,

I fixed this by extracting by Exctracing the values of the pf by doing :

set optimalization

    opt_w, opt_res = pf.mc_optimisation(num_trials=500)

creates frames of porfolios

    self.portfolio_strat_low_vol_stocks = self.process__stocks__to__df(
        opt_w.iloc[0], self.the_id_low_vol)
    self.portfolio_strat_high_sharp_stocks = self.process__stocks__to__df(
        opt_w.iloc[1], self.the_id_sharp__)

and after this simply extract the statistics.

sets vars

    self.low_vol_frame = self.portfolio_strat_low_vol_stocks
    self.high_sharp_frame = self.portfolio_strat_high_sharp_stocks

    # potfolio items.
    self.std_vol: float = float(self.low_vol_frame.balance.std())
    self.min_vol: float = float(self.low_vol_frame.balance.min())
    self.max_vol: float = float(self.low_vol_frame.balance.max())
    self.avg_vol: float = float(self.low_vol_frame.balance.mean())

    #
    self.std_sharp: float = float(self.high_sharp_frame.balance.std())
    self.min_sharp: float = float(self.high_sharp_frame.balance.min())
    self.max_sharp: float = float(self.high_sharp_frame.balance.max())
    self.avg_sharp: float = float(self.high_sharp_frame.balance.mean())

If you do this in on class like I did, you can just reject the class if the weights are not in you favor.