PortfolioAnalytics Package Questions on Initial Weights & Group Constraints

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

PortfolioAnalytics Package Questions on Initial Weights & Group Constraints

Ed Herranz
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?

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()

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?

Thanks & Regards,
-Ed

        [[alternative HTML version deleted]]

_______________________________________________
[hidden email] 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.
Reply | Threaded
Open this post in threaded view
|

Re: PortfolioAnalytics Package Questions on Initial Weights & Group Constraints

braverock
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

_______________________________________________
[hidden email] 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.
Reply | Threaded
Open this post in threaded view
|

Re: PortfolioAnalytics Package Questions on Initial Weights & Group Constraints

Ed Herranz
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 <[hidden email]>
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
>
> _______________________________________________
> [hidden email] 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]]

_______________________________________________
[hidden email] 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.