Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.

# Re: st: Re: Inequality constraints with optimization

 From Alberto Dorantes To statalist@hsphsun2.harvard.edu Subject Re: st: Re: Inequality constraints with optimization Date Sat, 25 Aug 2012 15:05:17 -0500

I missed something in the code. Although it is not a clean code, this
trick has worked for me:

void myeval(todo, p, s, fml, g, H)

{ real matrix q
q=J(1,11,0)
q=ln(p - 0.02)

Return=variance(s)

fml=(p)*Return*(p)' +q[1] - q[1] + q[2] - q[2] + q[3] - q[3] + q[4]
- q[4] + q[5]-q[5]+q[6]-q[7]+q[8]-q[8]+q[9]-q[9]+q[10]-q[10]+q[11]-q[11]

}

Unfortunately, it seems that optimize do not have a way to add
inequality constraints, so this is a  trick. By doing this, you're
forcing Mata to use the vector q in the optimization function, and the
q's must be greater than zero, and p's will be greater than 0.02.

Alberto.

2012/8/25 Alberto Dorantes <alberto.dorantes@finanzastec.net>:
> Hi Jane.
> For your evaluation function, try this (I'm assuming you have 11
> instruments in the portfolio):
> void myeval(todo, p, s, fml, g, H)
>
>  { real matrix q
>  q=J(1,11,0)
>  q=ln(p - 0.02)
>
>  Return=variance(s)
>
>   fml=(p)*Return*(p)'
>
>   }
>
> Now, it is possible that optimize cannot find a solution after many
> interations, so you can use _optimize instead of optimize (to avoid
> the program to halt), and use the optimize_result_errorcode function
> to get the error number, and then if the error is not zero, initialize
> the optimizer again but changing the optimization technique wih the
> function optimize_init_technique (there are 4 types of techniques in
> Mata).  Also, you can change the criteria for convergence using the
> functions: optimize_init_conv_ptol, optimize_init_conv_vtol and
> optimize_init_nrtol.
>
> Late, but I hope this help.
>
> Alberto.
>
> 2012/7/30 Jane Ross <jross5137@gmail.com>:
>>> Im currently trying to construct the efficient frontier in a Markowitz portfolio using the command optimize-. I have a data set of returns:
>>>
>>>
>>>
>>>                 1       2       3       4
>>>
>>>                 +---------------------------------+
>>>
>>> 1              .111    .223    .122     .05
>>>
>>> 2              .114     .46    .003     .05
>>>
>>> 3              .323    -.09    .111     .05
>>>
>>> 4              .001   -.107    .054     .05
>>>
>>> 5              -.209     .12    .169     .05
>>>
>>> 6              .223    .309   -.035     .05
>>>
>>> 7              .26    .411    .133     .05
>>>
>>> 8              .21     .05    .732     .05
>>>
>>> 9              .144      .1    .021     .05
>>>
>>> 10           .412    .445    .131     .05
>>>
>>> 11           -.013    .123    .006     .05
>>>
>>> 12           .553     .55    .908     .05
>>>
>>>
>>>
>>> which I use to calculate the mean return (b) and the covariance (s) of the portfolio. I am trying to find the set of weights (p) which give the lowest variance of the portfolio = p*cov*p’
>>>
>>> subject to
>>>
>>> 1.       p*b’=.08
>>>
>>> 2.       p>=.02 for all p’s
>>>
>>> 3.       and sum(p)=1
>>>
>>>
>>>
>>> my code is:
>>>
>>>
>>>
>>> mata:
>>>
>>> mata clear
>>>
>>> void myeval(todo, p, s, fml, g, H)
>>>
>>> {
>>>
>>>   Return=variance(s)
>>>
>>> fml=(p)*Return*(p)'
>>>
>>>  }
>>>
>>> end
>>>
>>> import excel "C:\Users\New\Documents\MarkowitzOptimization.xlsx", sheet("Sheet2") firstrow clear \\this is the returns dataset mentioned above\\
>>>
>>> mkmat ATT GMC USX TBILL, mat(Ret)
>>>
>>> mean ATT GMC USX TBILL
>>>
>>> matrix b=e(b)
>>>
>>> mata:
>>>
>>> s=st_matrix("Ret")
>>>
>>> b=st_matrix("b")
>>>
>>> S=optimize_init()
>>>
>>> C=J(2,4,0)
>>>
>>> C[1,1..4]=b[1,1..4]
>>>
>>> C[2,1..4]=J(1,4,1)
>>>
>>> c = (.10\1)
>>>
>>> Cc = (C, c)
>>>
>>> optimize_init_constraints(S,Cc)
>>>
>>> optimize_init_which(S, "min")
>>>
>>> optimize_init_evaluator(S, &myeval())
>>>
>>> optimize_init_evaluatortype(S,"d0")
>>>
>>> optimize_init_params(S, J(1,4,.25))
>>>
>>> optimize_init_conv_maxiter(S, 100000000000000)
>>>
>>> optimize_init_argument(S, 1, s)
>>>
>>> p=optimize(S)
>>>
>>> end
>>>
>>>
>>>
>>>
>>>
>>> For this specific data set, I get a p vector of:
>>>
>>>                 +---------------------------------------------------------+
>>>
>>> 1              .0680515463       .1961302652       .0597523857       .6760658028
>>>
>>>
>>>
>>> And a total portfolio variance of .00356167 which fit my constraints.
>>>
>>>
>>>
>>> However, with larger more varied data sets, I would like to be able to constrain p in the optimization so that all the weights are >=.02. I have tried parameterization using the code below but I’m unsure how to get the variance back out of the equation after changing p and I don’t know if I need to reset the constraint matrix now that p is different. Does anyone have suggestions on how I should proceed?
>>>
>>>
>>>
>>> mata:
>>>
>>> mata clear
>>>
>>> void myeval(todo, p, s, fml, g, H)
>>>
>>> {
>>>
>>>   Return=variance(s)
>>>
>>> m=J(1,11,.02)
>>>
>>>   l=ln(p - m)
>>>
>>>  fml=(l)*Return*(l)'
>>>
>>>  }
>>>
>>> End
>>>
>>> import excel "C:\Users\New\Documents\MarkowitzOptimization.xlsx", sheet("Sheet2") firstrow clear
>>>
>>> mkmat ATT GMC USX TBILL, mat(Ret)
>>>
>>> mean ATT GMC USX TBILL
>>>
>>> matrix b=e(b)
>>>
>>> mata:
>>>
>>> s=st_matrix("Ret")
>>>
>>> b=st_matrix("b")
>>>
>>> S=optimize_init()
>>>
>>> C=J(2,4,0)
>>>
>>> C[1,1..4]=b[1,1..4]
>>>
>>> C[2,1..4]=J(1,4,1)
>>>
>>> c = (.10\1)
>>>
>>> Cc = (C, c)
>>>
>>> optimize_init_constraints(S,Cc)
>>>
>>> optimize_init_which(S, "min")
>>>
>>> optimize_init_evaluator(S, &myeval())
>>>
>>> optimize_init_evaluatortype(S,"d0")
>>>
>>> optimize_init_params(S, J(1,4,.25))
>>>
>>> optimize_init_conv_maxiter(S, 100000000000000)
>>>
>>> optimize_init_argument(S, 1, s)
>>>
>>> p=optimize(S)
>>>
>>> end
>>>
>>>  Thanks for any input
>>
>> *
>> *   For searches and help try:
>> *   http://www.stata.com/help.cgi?search
>> *   http://www.stata.com/support/statalist/faq
>> *   http://www.ats.ucla.edu/stat/stata/

*
*   For searches and help try:
*   http://www.stata.com/help.cgi?search
*   http://www.stata.com/support/statalist/faq
*   http://www.ats.ucla.edu/stat/stata/