[R-SIG-Finance] PortfolioAnalytics Package Questions on Initial Weights & Group Constraints

Ed Herranz ed.herranz at gmail.com
Sun Jan 28 23:41:21 CET 2018


Thank you Brian. I did not mean to put the same group in both calls; that
was a typo.

On Sun, Jan 28, 2018 at 6:47 AM Brian G. Peterson <brian at braverock.com>
wrote:

> On 01/26/2018 03:05 PM, Ed Herranz wrote:
> > Dear R-sig-finance Group,
> >
> > I have 3 of questions about the PortfolioAnalytics package:
> >
> > 1) I'm using DEOptim optimization.  And I use the following
> initialization:
> >
> >    i.portf <- portfolio.spec(assets=allInstruments,
> >                              weight_seq=generatesequence(min = 0.001,
> >                                                          max = 0.06,
> >                                                          by = 0.002))
> > I believe that the initial portfolios are generated randomly using
> > random_portfolios.   However, if I wanted to specifically pre-set one of
> > the portfolios to a given set of predefined weights, would that be
> possible
> > with DEOPtim?
>
> You are correct that the initial population is generated via
> random_portfolios.
>
> There are two ways to accomplish what you want, the first will work for
> only one 'special' seed portfolio, the second would work for any number
> of special seeds.
>
> In the first method, when you call portfolio.spec, instead of just
> specifying the names of the assets, you also specify the weights using a
> named vector.  This will include your current seed portfolio as the
> second portfolio in the seed matrix sent to DEoptim as an initial
> population.
>
> In the second method, you simply call random_portfolios by hand,
> specifying the number of portfolios to be slightly shorter than the
> number of portfolios that will be in each generation.  then add your
> seeds to this object, and specify your new matrix of weights including
> your seeds as the rp= parameter to optimize.portfolios.  You'll see that
> in many of our vignettes or seminar materials on PortfolioAnalytics we
> generate a random portfolio seed once, and then reuse it across many
> different scenarios.  You would be doing the same thing, only including
> your special seed portfolios in the initial population.
>
> > 2) I'm using group constraints to specify the sum of weights by group.
> For
> > example on Sectors:
> >
> >    for( jj in 1:length(uniqueSectors)){
> >      group_indices <- which(sectors == uniqueSectors[jj])
> >      groupsum <- sum(benchmark_weights[group_indices])
> >      groupmax <- 0.1 + groupsum
> >      groupmin <- -0.1 + groupsum
> >
> >      groupmins[jj]   <- groupmin
> >      groupmaxs[jj]   <- groupmax
> >      grouplist[[jj]] <- group_indices
> >    }
> >
> >      i.portf <- add.constraint(portfolio=i.portf,
> >                                type="group",
> >                                groups=grouplis,
> >                                group_min=groupmins,
> >                                group_max=groupmaxs,
> >                                group_labels=groupnames)
> >
> >    There is nothing stopping me from making two separate add.constraint()
> > group calls by splitting the initial groups' constraints into 2
> >
> >      i.portf <- add.constraint(portfolio=i.portf,
> >                                type="group",
> >                                groups=grouplist[1:5],
> >                                group_min=groupmins[1:5],
> >                                group_max=groupmaxs[1:5],
> >                                group_labels=groupnames[1:5])
> >      i.portf <- add.constraint(portfolio=i.portf,
> >                                type="group",
> >                                groups=grouplist[5:10],
> >                                group_min=groupmins[5:10],
> >                                group_max=groupmaxs[5:10],
> >                                group_labels=groupnames[5:10])
> >
> > What is the difference when I split the group constraints into two
> instead
> > of 1?  Based on my tests these two are not the same; it seems that
> > splitting the group constraints into 2 is less restrictive(?) than if I
> > just have one group add.constraint()
>
> I discussed this with Ross Bennett, who added the group constraint code
> to PortfolioAnalytics, and we are of the opinion that the two
> formulations should be the same.  So any variation you are seeing may be
> random.  This could be verified by using the same seed population rp as
> described above.
>
> Ross also noticed that both your groups contain asset 5, which may not
> be what you intended.
>
> > 3) There is a maximum position constraint--for example
> >
> > pspec <- add.constraint(portfolio=pspec, type="position_limit",
> max_pos=3)
> >
> > Is there a reason that a minimum position constraint was not/cannot be
> > implemented?
>
> I think a minimum position box constraint will do what you want, but
> otherwise no, we'd need to look at the code and think about it some more
> as to why it was implemented the way that it was.
>
> Regards,
>
> Brian
>
> --
> Brian G. Peterson
> http://braverock.com/brian/
> Ph: 773-459-4973
> IM: bgpbraverock
>
> _______________________________________________
> R-SIG-Finance at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-sig-finance
> -- Subscriber-posting only. If you want to post, subscribe first.
> -- Also note that this is not the r-help list where general R questions
> should go.
>

	[[alternative HTML version deleted]]



More information about the R-SIG-Finance mailing list