[GSoC-PortA] Issue passing "clean"?

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


Works great - thanks again...

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

> 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
>>
>
> _______________________________________________
> 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