<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>I am just catching up with this thread.  Offhand, I think that combining a bunch of objectives in a list and embedding in the portfolio$objectives slot may be useful.  On the other hand, having a bunch of different objectives of varying complexity “hidden” away in a singled list object in this manner may be hard for the user to keep up with.  Minimally a good simple extraction method for viewing, reminding yourself what they are would be key.  I will think some more about this and discuss with Ross and Guy.<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Thanks,<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>Doug<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p> </o:p></span></p><p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'> gsoc-porta-bounces@lists.r-forge.r-project.org [mailto:gsoc-porta-bounces@lists.r-forge.r-project.org] <b>On Behalf Of </b>Ross Bennett<br><b>Sent:</b> Friday, October 04, 2013 1:55 PM<br><b>To:</b> PortfolioAnalytics<br><b>Subject:</b> Re: [GSoC-PortA] Some feedback...<o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p><div><p class=MsoNormal>I think I have a good first step in combining objective measures for all portfolios in an opt.list object. My apologies in advance for the long email, but I wanted to put this out there as this could be a pretty unique feature in PortfolioAnalytics. <o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Here is an outline of what I am doing.<o:p></o:p></p><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Step 1: Get the objectives from the portfolio$objectives slot from each optimize.portfolio object in the opt.list object and combine into a single list of objectives. I am careful with how I construct the list so that risk_budget objectives are added last.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Step 2: Detect and remove duplicates by objective name and type. The last objective is the one that is kept. This is the comprehensive objectives list of all objectives from each optimize.portfolio object in opt.list.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Step 3: Insert the comprehensive objectives list into the portfolio$objectives slot in each optimize.portfolio object in the opt.list object. Then call constrained_objective given the returns, weights, and portfolio of each optimize.portfolio object. This allows the use of different returns, assets, and constraints, but calculates the same objectives.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>The drawbacks of this approach is that the objective_measures are recalculated and handling multiple arguments with different values is tricky. <o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>For example, say we combine two optimize.portfolio objects and both have ES as the only objective. The first object uses arguments=list(p=0.95, clean="boudt") and the second object uses arguments=list(p=0.90, clean="none") for the ES objective. The steps described above will use p=0.90 and clean="none" to calculate the objective_measure.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>One solution I thought of was to add a ... argument to extractObjectiveMeasures() so the user can pass in arguments, otherwise default to the steps described above.<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>This is obviously a simple case where the previous way of extracting the objective_measures from multiple optimize.portfolio objects worked better, but that way only worked if all portfolio objects had the exact same objectives and types. <o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Typing this I just realized I should probably do the following:<o:p></o:p></p></div><div><p class=MsoNormal>if( all objectives are identical) {<o:p></o:p></p></div><div><p class=MsoNormal>  extract objective_measures the previous way<o:p></o:p></p></div><div><p class=MsoNormal>} else {<o:p></o:p></p></div><div><p class=MsoNormal>  extract objective_measures using steps above<o:p></o:p></p></div><div><p class=MsoNormal>}<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div></div><div><p class=MsoNormal>Any comments or suggestions?<o:p></o:p></p></div><div><p class=MsoNormal><o:p> </o:p></p></div><div><p class=MsoNormal>Thanks,<o:p></o:p></p></div><div><p class=MsoNormal>Ross<o:p></o:p></p></div></div><div><p class=MsoNormal style='margin-bottom:12.0pt'><o:p> </o:p></p><div><p class=MsoNormal>On Tue, Sep 24, 2013 at 4:00 AM, Peter Carl <<a href="mailto:peter@braverock.com" target="_blank">peter@braverock.com</a>> wrote:<o:p></o:p></p><p class=MsoNormal>Now that I think about it a bit more, I think that returns and assets CAN<br>differ, as long as the measures are calculable at the portfolio level.<br>I'm not sure which of the processes you outlined below are preferable, but<br>they are definitely in the right direction.<o:p></o:p></p><div><div><p class=MsoNormal><br>pcc<br>--<br>Peter Carl<br><a href="http://www.braverock.com/peter" target="_blank">http://www.braverock.com/peter</a><br><br>> On Mon, Sep 23, 2013 at 1:19 PM, Peter Carl <<a href="mailto:peter@braverock.com">peter@braverock.com</a>> wrote:<br>><br>>> Here's your comment from below:<br>>><br>>> "It is tough to tell with the formatting on the email, but I'll take a<br>>> closer look at the script in the sandbox to see if I can tell what is<br>>> going on. The idea is that extractObjectiveMeasures will return a matrix<br>>> of the objective measures for all optimize.portfolio objects in the<br>>> opt.list object. For example, the meanSD row should have NAs under the<br>>> ETL<br>>> and ETL component contribution columns. I am only stitching together the<br>>> objective measures, I do not re-calculate StdDev or component StdDev for<br>>> the portfolios with ETL as an objective. Basically, I just take whatever<br>>> objectives are in the $objective_measures slot of each<br>>> optimize.portfolio<br>>> object. Should I be doing something such that all cells in the matrix<br>>> have<br>>> values? "<br>>><br>>> I think so, although I doubt this has been well spelled out before.  The<br>>> question is: can we anticipate how to fill in these values given the<br>>> information in each object?<br>>><br>><br>> I think we might be able to depending on how the objective measures are<br>> calculated on the weights.<br>><br>> One way would be to pick out the objective names, match the name to the<br>> function, and then calculate the objectives on the weights. The parameters<br>> could be pulled from the $arguments list in each objective. This might be<br>> tricky if there are multiple arguments with different arguments. This is<br>> likely the simplest solution. If "ES" is an objective name, we could by<br>> default calculate it with portfolio_method="component" since the<br>> univariate<br>> ES also calculated.<br>><br>> Another way is to combine all the objectives from each object, try to<br>> detect and remove duplicate objectives objects, then pass that portfolio<br>> object to constrained_objective to calculate over the weights.<br>><br>> Not sure which way is better, I'll have to give this some thought and try<br>> out a few things.<br>><br>><br>>><br>>> When I do this by hand, I'm just calculating for the list of optimal<br>>> weights of each objective for each measure.  At that point, I can make<br>>> comparisons I couldn't otherwise.<br>>><br>>> Note that the objectives can be vastly different, as long as the assets<br>>> are the same and the parameters for each of the metrics are the same.<br>>><br>><br>> I could add a check to make sure that the assets and returns are the same<br>> in each optimize.portfolio object. I think this will only work if that is<br>> the case. It would be nice to have the flexibility to have different<br>> assets<br>> and returns, but that may not be doable.<br>><br>><br>>><br>>> Does that make sense?<br>>><br>><br>> It does make sense, thanks for the feedback.<br>><br>><br>>><br>>> pcc<br>>> --<br>>> Peter Carl<br>>> <a href="http://www.braverock.com/peter" target="_blank">http://www.braverock.com/peter</a><br>>><br>>> > Peter,<br>>> ><br>>> > Thanks for the feedback, I really appreciate it.<br>>> ><br>>> > see comments in line.<br>>> ><br>>> ><br>>> > On Sun, Sep 22, 2013 at 4:41 PM, Peter Carl <<a href="mailto:peter@braverock.com">peter@braverock.com</a>><br>>> wrote:<br>>> ><br>>> >> Ross,<br>>> >><br>>> >> I've been working through your vignette to hopefully give you some<br>>> more<br>>> >> detailed feedback, including on your questions from a few days ago.<br>>> >> Sorry<br>>> >> this has taken so long, but I wanted to spend some focused time on<br>>> the<br>>> >> package.<br>>> >><br>>> >> I realize that you've got different plot methods for each type, and I<br>>> >> appreciate what a hassle it is to keep such methods relatively<br>>> >> consistent.<br>>> >>  In <a href="http://chart.RiskReturn.DE" target="_blank">chart.RiskReturn.DE</a>, when the function doesn't find anything that<br>>> >> fits<br>>> >> its defaults:<br>>> >> > plot(RiskBudget.DE)<br>>> >> Error in plot.window(...) : need finite 'xlim' values<br>>> >> In addition: Warning messages:<br>>> >> 1: In <a href="http://chart.Scatter.DE" target="_blank">chart.Scatter.DE</a>(object = DE, risk.col = risk.col, return.col =<br>>> >> return.col,  :<br>>> >>   mean or ES do  not match extractStats output of $objective_measures<br>>> >> slot<br>>> >> 2: In min(x) : no non-missing arguments to min; returning Inf<br>>> >> 3: In max(x) : no non-missing arguments to max; returning -Inf<br>>> >><br>>> >> It's a risk budget on ETL, so if I tell it that, it works:<br>>> >> > plot(RiskBudget.DE, risk.col="ETL", return.col="mean")<br>>> >><br>>> ><br>>> > The default is risk.col="ES". Because your objective name is "ETL",<br>>> you<br>>> > need to explicitly do risk.col="ETL".<br>>> ><br>>> ><br>>> >><br>>> >> ...but it doesn't recover well when I try to plot the results in<br>>> >> variance<br>>> >> space:<br>>> >> > plot(RiskBudget.DE, risk.col="StdDev", return.col="mean")<br>>> >> Error in plot.window(...) : need finite 'xlim' values<br>>> >> In addition: Warning messages:<br>>> >> 1: In <a href="http://chart.Scatter.DE" target="_blank">chart.Scatter.DE</a>(object = DE, risk.col = risk.col, return.col =<br>>> >> return.col,  :<br>>> >>   mean or StdDev do  not match extractStats output of<br>>> >> $objective_measures<br>>> >> slot<br>>> >> 2: In min(x) : no non-missing arguments to min; returning Inf<br>>> >> 3: In max(x) : no non-missing arguments to max; returning -Inf<br>>> >><br>>> >><br>>> >> I'm not exactly sure what the issue is here, but maybe it's related:<br>>> >> > chart.RiskBudget(RiskBudget.DE, risk.type="percentage",<br>>> neighbors=5)<br>>> >> Error in subsetx[i, riskcols] : incorrect number of dimensions<br>>> >> > traceback()<br>>> >> 3: points(subsetx[i, riskcols], type = "b", col = "lightblue")<br>>> >> 2: chart.RiskBudget.optimize.portfolio(RiskBudget.DE, risk.type =<br>>> >> "percentage",<br>>> >>        neighbors = 5)<br>>> >> 1: chart.RiskBudget(RiskBudget.DE, risk.type = "percentage",<br>>> neighbors =<br>>> >> 5)<br>>> >><br>>> ><br>>> > Not sure either what the issue is, but I'll take a look.<br>>> ><br>>> ><br>>> >> In chart.RiskReturnScatter.RP, it looks like 'rp' is being passed<br>>> into<br>>> >> plot through dots.<br>>> >> > plot(EqmETL.RND, risk.col="StdDev", return.col="mean", rp=1000,<br>>> >> chart.assets=TRUE)<br>>> >> There were 13 warnings (use warnings() to see them)<br>>> >> > warnings()<br>>> >> Warning messages:<br>>> >> 1: "rp" is not a graphical parameter<br>>> >> 2: "rp" is not a graphical parameter<br>>> >> 3: "rp" is not a graphical parameter<br>>> >><br>>> ><br>>> > The 'rp' argument is meant for optimize.portfolio.ROI and<br>>> > optimize.portfolio.GenSA objects. Since ROI and GenSA do not return<br>>> trace<br>>> > information like DEoptim or random portfolios, I added this as an<br>>> option<br>>> > to<br>>> > generate random portfolios to plot the feasible space. If you are<br>>> already<br>>> > passing in an optimize.portfolio.random object, there is no need to<br>>> pass<br>>> > in<br>>> > rp as an argument.<br>>> ><br>>> ><br>>> >><br>>> >><br>>> >> > extractWeights(buoys)<br>>> >>          Convertible Arbitrage Equity Market Neutral Fixed Income<br>>> >> Arbitrage Event Driven CTA Global Global Macro Long/Short Equity<br>>> >> MeanSD              0.05000000                 0.050<br>>> >> 0.050   0.30000000  0.0500000    0.2000000             0.300<br>>> >> MeanmETL            0.05000000                 0.300<br>>> >> 0.050   0.05000000  0.2000000    0.3000000             0.050<br>>> >> MinSD               0.06042904                 0.300<br>>> >> 0.300   0.05234676  0.1735858    0.0636384             0.050<br>>> >> MinmETL             0.05000000                 0.300<br>>> >> 0.050   0.05000000  0.2000000    0.3000000             0.050<br>>> >> EqSD                0.12500000                 0.240<br>>> >> 0.200   0.08500000  0.1050000    0.1700000             0.075<br>>> >> EqmETL              0.06000000                 0.265<br>>> >> 0.165   0.09000000  0.2050000    0.1300000             0.080<br>>> >> RB                  0.05200000                 0.410<br>>> >> 0.060   0.05200000  0.1438995    0.2220000             0.058<br>>> >><br>>> >> ...but this doesn't:<br>>> >> > extractObjectiveMeasures(buoys)<br>>> >>                 mean     StdDev         ES StdDev.contribution1<br>>> >> StdDev.contribution2 StdDev.contribution3<br>>> >> StdDev.contribution4<br>>> >> MeanSD   0.006782814 0.01546759         NA                   NA<br>>> >>        NA                   NA                   NA<br>>> >> MeanmETL 0.005897789         NA 0.01505626                   NA<br>>> >>        NA                   NA                   NA<br>>> >> MinSD             NA 0.01009001         NA                   NA<br>>> >>        NA                   NA                   NA<br>>> >> MinmETL           NA         NA 0.01505626                   NA<br>>> >>        NA                   NA                   NA<br>>> >> EqSD              NA 0.01113716         NA          0.001763096<br>>> >> 0.001565752          0.001886988          0.001258567<br>>> >> EqmETL            NA         NA 0.01646509                   NA<br>>> >>        NA                   NA                   NA<br>>> >> RB       0.005812997         NA         NA                   NA<br>>> >>        NA                   NA                   NA<br>>> >>          StdDev.contribution5 StdDev.contribution6<br>>> StdDev.contribution7<br>>> >> StdDev.pct_contrib_StdDev1 StdDev.pct_contrib_StdDev2<br>>> >> MeanSD                     NA                   NA<br>>> NA<br>>> >>                      NA                         NA<br>>> >> MeanmETL                   NA                   NA<br>>> NA<br>>> >>                      NA                         NA<br>>> >> MinSD                      NA                   NA<br>>> NA<br>>> >>                      NA                         NA<br>>> >> MinmETL                    NA                   NA<br>>> NA<br>>> >>                      NA                         NA<br>>> >> EqSD              0.001039908          0.002296903<br>>> 0.001325947<br>>> >>               0.1583075                  0.1405881<br>>> >> EqmETL                     NA                   NA<br>>> NA<br>>> >>                      NA                         NA<br>>> >> RB                         NA                   NA<br>>> NA<br>>> >>                      NA                         NA<br>>> >> ...snip...<br>>> >><br>>> >><br>>> > It is tough to tell with the formatting on the email, but I'll take a<br>>> > closer look at the script in the sandbox to see if I can tell what is<br>>> > going<br>>> > on. The idea is that extractObjectiveMeasures will return a matrix of<br>>> the<br>>> > objective measures for all optimize.portfolio objects in the opt.list<br>>> > object. For example, the meanSD row should have NAs under the ETL and<br>>> ETL<br>>> > component contribution columns. I am only stitching together the<br>>> objective<br>>> > measures, I do not re-calculate StdDev or component StdDev for the<br>>> > portfolios with ETL as an objective. Basically, I just take whatever<br>>> > objectives are in the $objective_measures slot of each<br>>> optimize.portfolio<br>>> > object. Should I be doing something such that all cells in the matrix<br>>> have<br>>> > values?<br>>> ><br>>> ><br>>> >> As a consequence, only one portfolio appears in the following plot<br>>> >> (MeanSD):<br>>> >> > chart.RiskReward(buoys)<br>>> >><br>>> ><br>>> > This relates to my comment above about how I am not recalculating<br>>> > anything.<br>>> > Before the portfolios are plotted in risk-return space, I omit rows<br>>> that<br>>> > have NA values. For example, if you wanted to plot all the portfolios<br>>> in<br>>> > mean-ETL space, all portfolios should have mean and ETL as an<br>>> objective.<br>>> > You could set the multiplier to 0 so it does not affect the<br>>> optimization,<br>>> > but is returned in the $objective_measures slot.<br>>> ><br>>> ><br>>> >><br>>> >> All in all, this is all looking good.  I've got some scripts checked<br>>> in<br>>> >> under sandbox/symposium2013 if you want to follow along.<br>>> >><br>>> ><br>>> > I'll take a closer look and follow along, thanks!<br>>> ><br>>> ><br>>> >><br>>> >> pcc<br>>> >> --<br>>> >> Peter Carl<br>>> >> <a href="http://www.braverock.com/peter" target="_blank">http://www.braverock.com/peter</a><br>>> >><br>>> >><br>>> >> _______________________________________________<br>>> >> GSoC-PortA mailing list<br>>> >> <a href="mailto:GSoC-PortA@lists.r-forge.r-project.org">GSoC-PortA@lists.r-forge.r-project.org</a><br>>> >> <a href="http://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/gsoc-porta" target="_blank">http://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/gsoc-porta</a><br>>> >><br>>> ><br>>><br>>> _______________________________________________<br>>> GSoC-PortA mailing list<br>>> <a href="mailto:GSoC-PortA@lists.r-forge.r-project.org">GSoC-PortA@lists.r-forge.r-project.org</a><br>>> <a href="http://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/gsoc-porta" target="_blank">http://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/gsoc-porta</a><br>>><br>> _______________________________________________<br>> GSoC-PortA mailing list<br>> <a href="mailto:GSoC-PortA@lists.r-forge.r-project.org">GSoC-PortA@lists.r-forge.r-project.org</a><br>> <a href="http://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/gsoc-porta" target="_blank">http://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/gsoc-porta</a><br>><br><br><br>_______________________________________________<br>GSoC-PortA mailing list<br><a href="mailto:GSoC-PortA@lists.r-forge.r-project.org">GSoC-PortA@lists.r-forge.r-project.org</a><br><a href="http://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/gsoc-porta" target="_blank">http://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/gsoc-porta</a><o:p></o:p></p></div></div></div><p class=MsoNormal><o:p> </o:p></p></div></div></body></html>