[GSoC-PortA] Issue passing "clean"?

Peter Carl peter at braverock.com
Fri Oct 11 16:19:19 CEST 2013


Thanks for doing this - I'll test it today.

To your point on comparing different methods - I completely agree.  That
said, comparing the outputs of the different methods can be useful for
understanding methodological differences and ferreting out issues like
this one.

The heuristic methods are less accurate and possibly less precise than the
closed form methods (it isn't clear to me how much I care about this in
the face of estimation error), not to mention slower and more compute
intensive (but I know I care about those issues), and we'll always prefer
the latter when they are applicable.  The heuristic methods, of course,
have their place in visualization and developing intuition about the more
'abstract' methods, as well as in more complex objective sets.

I actually identified this issue comparing the two ROI-based methods,
noting that one of the dimensions was "off".  Although I'm guessing that
this will take care of the issue, I'm not entirely sure.  I'm glad you
told me that none of the arguments were being passed - it gives me some
comfort that the mETL measure was probably being calc'd at 95% instead of
91.7% in the ROI optimization - this change should impact the portfolio
selected significantly.  So hopefully this will work.

pcc
-- 
Peter Carl
http://www.braverock.com/peter

> Peter,
>
> 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.
>
> 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".
>
> Attached is a quick script demonstrating this. Relevant outputs below.
>
>> # Minimum ETL using ROI
>> optROI <- optimize.portfolio(R=ret, portfolio=tmp1,
> optimize_method="ROI", trace=TRUE)
> [1] 0.0833
>> extractObjectiveMeasures(optROI)
> $ES
> [1] 0.01718848
>
>> # Use constrained_objective to calculate mETL with the optimal weights
> from optROI
>> constrained_objective(w=optROI$weights, R=ret, portfolio=tmp1,
> trace=TRUE)$objective_measures
> $ES
>          [,1]
> ES 0.01761023
> attr(,"names")
> [1] "ES"
>
>> # minimum mETL with random portfolios
>> optRP <- optimize.portfolio(R=ret, portfolio=tmp1,
> optimize_method="random", search_size=2000, trace=TRUE)
>> extractObjectiveMeasures(optRP)
> $ES
>          [,1]
> ES 0.01740961
> attr(,"names")
> [1] "ES"
>
> Ross
>
>
>
> On Wed, Oct 9, 2013 at 3:20 PM, Ross Bennett
> <rossbennett34 at gmail.com>wrote:
>
>> Peter,
>>
>> 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.
>>
>> See comments in-line.
>>
>>
>>
>> On Wed, Oct 9, 2013 at 1:38 PM, Peter Carl <peter at braverock.com> wrote:
>>
>>> Ross,
>>>
>>> I'm running into the following:
>>>
>>> > buoys.portfmeas
>>>                 Mean      StdDev       mETL
>>> MinSD    0.005435103 0.009286484 0.01357282
>>> MinmETL  0.005846839 0.011196709 0.01371471
>>>
>>> Note that the minimum standard deviation portfolio has a lower mETL
>>> than
>>> the Min mETL portfolio.  Both were calculated with ROI.
>>>
>>> MinSD.portf <- add.objective(portfolio=init.portf,
>>>   type="risk", # the kind of objective this is
>>>   name="var", # name of the function
>>>   arguments=list(clean=clean)
>>> )
>>>
>>> > MinSD.ROI<-optimize.portfolio(R=R,
>>> +   portfolio=MinSD.portf,
>>> +   optimize_method='ROI'
>>> +   )
>>> Warning message:
>>> In constrained_objective(w = weights, R = R, portfolio, trace = TRUE,
>>> :
>>>   some arguments stored for var do not match
>>>
>>> That warning is true, "var" doesn't take that list of arguments,
>>> including
>>> "clean".  But when I use name="StdDev" in the portfolio construction, I
>>> get the following error:
>>>
>>> Error in optimize.portfolio(R = R, portfolio = MinSD.portf,
>>> optimize_method = "ROI") :
>>>   ROI only solves mean, var, or sample ETL/ES/CVaR type business
>>> objectives, choose a different optimize_method.
>>> In addition: Warning message:
>>> In is.na(le) : is.na() applied to non-(list or vector) of type 'NULL'
>>>
>>> So the first issue is to map "StdDev" into the list of acceptable
>>> functions for that solver.  It should then accept the "clean" argument
>>> and
>>> that should fix part of the issue.
>>>
>>
>> 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.
>>
>>
>>>
>>> The second issue is that the Min mETL portfolio being identified isn't
>>> being plotted as the minimum mETL portfolio being identified in the
>>> cloud
>>> of random portfolios.  This is the same issue I saw earlier that turned
>>> out to be related to "clean" not being applied consistently across
>>> objectives.
>>>
>>> In this case, it should be:
>>> p=1-1/12
>>> clean="boudt"
>>> MinmETL.portf <- add.objective(portfolio=init.portf,
>>>   type="risk", # the kind of objective this is
>>>   name="ES", # the function to minimize
>>>   arguments=list(p=p, clean=clean)
>>> )
>>>
>>> > MinmETL.ROI<-optimize.portfolio(R=R,
>>> +   portfolio=MinmETL.portf,
>>> +   optimize_method='ROI',
>>> +   trace=TRUE, verbose=TRUE
>>> +   )
>>> Warning message:
>>> In is.na(le) : is.na() applied to non-(list or vector) of type 'NULL'
>>>
>>> I'm not sure if the warning is related.  But I'm wondering if "clean"
>>> is
>>> getting passed into "ES" with ROI.  If it isn't, then the optimizer is
>>> likely selecting the wrong portfolio.  Could you take a look at this
>>> when
>>> you have a moment?
>>>
>>
>> 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.
>>
>>
>>>
>>> Thanks,
>>>
>>> pcc
>>> --
>>> Peter Carl
>>> http://www.braverock.com/peter
>>>
>>>
>>> _______________________________________________
>>> GSoC-PortA mailing list
>>> GSoC-PortA at lists.r-forge.r-project.org
>>> http://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/gsoc-porta
>>>
>>
>>
> _______________________________________________
> GSoC-PortA mailing list
> GSoC-PortA at lists.r-forge.r-project.org
> http://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/gsoc-porta
>



More information about the GSoC-PortA mailing list