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]

From |
Alberto Dorantes <alberto.dorantes@finanzastec.net> |

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/

**References**:**Re: st: Re: Inequality constraints with optimization***From:*Alberto Dorantes <alberto.dorantes@finanzastec.net>

- Prev by Date:
**Re: st: Re: Inequality constraints with optimization** - Next by Date:
**st: forvalues problem** - Previous by thread:
**Re: st: Re: Inequality constraints with optimization** - Next by thread:
**st: forvalues problem** - Index(es):