Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: st: Re: Inequality constraints with optimization
From
Alberto Dorantes <[email protected]>
To
[email protected]
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 <[email protected]>:
> 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 <[email protected]>:
>>> 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/