[R-SIG-Finance] PortfolioAnalytics Package Questions on Initial Weights & Group Constraints
Brian G. Peterson
brian at braverock.com
Sun Jan 28 12:47:10 CET 2018
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
More information about the R-SIG-Finance
mailing list