<div dir="ltr">Peter,<div><br></div><div>In commit r3216 I made revisions so that the ROI solvers recognize clean and any other arguments in the $arguments slot in each objective. I am really glad you brought this up because I realized that nothing in the $arguments slot was being recognized for optimize_method="ROI"... this was something I overlooked. This is corrected and cleaned returns can now be used with optimize_method="ROI" for the QP/LP problems. I also added "StdDev" as a valid objective name, but still use "var" to calculate the variance-covariance matrix used in the objective function.</div>

<div><br></div><div>Regarding your example above with the min SD portfolio having a lower mETL than the min mETL. I'm not 100% sure on this, but it could depend on if/how you call constrained_objective to calculate the objective measures. For example, the results of the minimum ETL portfolio with ROI will be different than the minimum mETL portfolio with RP. The LP formulation to minimize ETL uses empirical returns data whereas the optimization with random portfolios uses modified ETL by default which will likely result in different optimal weights. It is a case of comparing "apples to oranges".</div>
<div><br></div><div style>Attached is a quick script demonstrating this. Relevant outputs below.</div><div style><br></div><div style><div>> # Minimum ETL using ROI</div><div>> optROI <- optimize.portfolio(R=ret, portfolio=tmp1, optimize_method="ROI", trace=TRUE)</div>
<div>[1] 0.0833</div><div>> extractObjectiveMeasures(optROI)</div><div>$ES</div><div>[1] 0.01718848</div><div><br></div><div><div>> # Use constrained_objective to calculate mETL with the optimal weights from optROI</div>
<div>> constrained_objective(w=optROI$weights, R=ret, portfolio=tmp1, trace=TRUE)$objective_measures</div><div>$ES</div><div>         [,1]</div><div>ES 0.01761023</div><div>attr(,"names")</div><div>[1] "ES"</div>
</div><div><br></div><div><div>> # minimum mETL with random portfolios</div><div>> optRP <- optimize.portfolio(R=ret, portfolio=tmp1, optimize_method="random", search_size=2000, trace=TRUE)</div></div><div>
<div>> extractObjectiveMeasures(optRP)</div><div>$ES</div><div>         [,1]</div><div>ES 0.01740961</div><div>attr(,"names")</div><div>[1] "ES"</div></div></div><div><br></div><div style>Ross</div>
<div style><br></div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Oct 9, 2013 at 3:20 PM, Ross Bennett <span dir="ltr"><<a href="mailto:rossbennett34@gmail.com" target="_blank">rossbennett34@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Peter,<div><br></div><div>Thanks for the detailed description of what is going on. I will be able to dig into this deeper tomorrow afternoon, but here are some initial comments.</div>
<div><br></div>
<div>See comments in-line.</div><div><br></div><div class="gmail_extra"><br><br><div class="gmail_quote"><div><div class="h5">On Wed, Oct 9, 2013 at 1:38 PM, Peter Carl <span dir="ltr"><<a href="mailto:peter@braverock.com" target="_blank">peter@braverock.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Ross,<br>
<br>
I'm running into the following:<br>
<br>
> buoys.portfmeas<br>
                Mean      StdDev       mETL<br>
MinSD    0.005435103 0.009286484 0.01357282<br>
MinmETL  0.005846839 0.011196709 0.01371471<br>
<br>
Note that the minimum standard deviation portfolio has a lower mETL than<br>
the Min mETL portfolio.  Both were calculated with ROI.<br>
<br>
MinSD.portf <- add.objective(portfolio=init.portf,<br>
  type="risk", # the kind of objective this is<br>
  name="var", # name of the function<br>
  arguments=list(clean=clean)<br>
)<br>
<br>
> MinSD.ROI<-optimize.portfolio(R=R,<br>
+   portfolio=MinSD.portf,<br>
+   optimize_method='ROI'<br>
+   )<br>
Warning message:<br>
In constrained_objective(w = weights, R = R, portfolio, trace = TRUE,  :<br>
  some arguments stored for var do not match<br>
<br>
That warning is true, "var" doesn't take that list of arguments, including<br>
"clean".  But when I use name="StdDev" in the portfolio construction, I<br>
get the following error:<br>
<br>
Error in optimize.portfolio(R = R, portfolio = MinSD.portf,<br>
optimize_method = "ROI") :<br>
  ROI only solves mean, var, or sample ETL/ES/CVaR type business<br>
objectives, choose a different optimize_method.<br>
In addition: Warning message:<br>
In <a href="http://is.na" target="_blank">is.na</a>(le) : <a href="http://is.na" target="_blank">is.na</a>() applied to non-(list or vector) of type 'NULL'<br>
<br>
So the first issue is to map "StdDev" into the list of acceptable<br>
functions for that solver.  It should then accept the "clean" argument and<br>
that should fix part of the issue.<br></blockquote><div><br></div></div></div><div>Got it, I'll add functionality for StdDev to be accepted by the ROI solvers. I'll have to add StdDev, but still use "var" to calculate the variance-covariance matrix used in the objective function. I will also have to detect the "clean" argument so that the cleaned returns are used to calculate the variance-covariance matrix. </div>
<div class="im">
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
The second issue is that the Min mETL portfolio being identified isn't<br>
being plotted as the minimum mETL portfolio being identified in the cloud<br>
of random portfolios.  This is the same issue I saw earlier that turned<br>
out to be related to "clean" not being applied consistently across<br>
objectives.<br>
<br>
In this case, it should be:<br>
p=1-1/12<br>
clean="boudt"<br>
MinmETL.portf <- add.objective(portfolio=init.portf,<br>
  type="risk", # the kind of objective this is<br>
  name="ES", # the function to minimize<br>
  arguments=list(p=p, clean=clean)<br>
)<br>
<br>
> MinmETL.ROI<-optimize.portfolio(R=R,<br>
+   portfolio=MinmETL.portf,<br>
+   optimize_method='ROI',<br>
+   trace=TRUE, verbose=TRUE<br>
+   )<br>
Warning message:<br>
In <a href="http://is.na" target="_blank">is.na</a>(le) : <a href="http://is.na" target="_blank">is.na</a>() applied to non-(list or vector) of type 'NULL'<br>
<br>
I'm not sure if the warning is related.  But I'm wondering if "clean" is<br>
getting passed into "ES" with ROI.  If it isn't, then the optimizer is<br>
likely selecting the wrong portfolio.  Could you take a look at this when<br>
you have a moment?<br></blockquote><div><br></div></div><div>It could be related, in general, the "clean" argument is not passed to ROI. I should be able to make some changes so that the cleaned returns are used for the ROI solvers. I'll take a closer look and report back with my findings.</div>
<div class="im">
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Thanks,<br>
<br>
pcc<br>
<span><font color="#888888">--<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" target="_blank">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>
</font></span></blockquote></div></div><br></div></div>
</blockquote></div><br></div>