* suppress some output to keep list file small $offlisting $offsymxref $offsymlist $offuelxref $offuellist $offupper option sysout = off; option solprint = off; ** Inputs data from input file $include 'portfolio.input' Parameter Return(I) Annual return on securities - percentages; Return(I) = RF + sum(J,IndBeta(I,J)*Factor(J)); Variables X(I) Portion invested in security I Beta(J) Factor betas of portfolio Ret Return on portfolio TotRisk Total betas in portfolio Positive variable X; Equations Fract Must total to 1 Pbeta(J) Portfolio beta for factor J Pret Portfolio return BetaCons(J) Beta of portfolio must be less than DesBeta RetCons Return of portfolio must be more than DesRet Risk Weighted average of portfolio betas; Fract.. sum(I,X(I)) =e= 1; Pbeta(J).. Beta(J) =e= sum(I,X(I)*IndBeta(I,J)); Pret.. Ret =e= sum(I,X(I)*Return(I)); BetaCons(J).. Beta(J) =l= DesBeta(J); RetCons.. Ret =g= DesRet; Risk.. TotRisk =e= sum((I,J),X(I)*IndBeta(I,J)); Model MinVar /Fract,Pbeta,Pret,RetCons,Risk/; Model MaxRet /Fract,Pbeta,Pret,BetaCons,Risk/; if (ModelNum = 1 OR ModelNum = 3, Solve MinVar using NLP minimizing TotRisk; else Solve MaxRet using NLP maximizing Ret; ); scalar change /0/; file progout output file /portfolio.output/; progout.pw=255; progout.pc=6; progout.nd=3; put progout; ** finds whether current solution is feasible change = 0; Loop(I, if((X.l(I)<0), change = 3; ); ); if (sum(I,X.l(I))>1.0001 OR sum(I,X.l(I))<.9999, change=3; ); if (ModelNum=2 or ModelNum=4, Loop(J, if(DesBeta(J)+.0011 or DesRet<0), change = 2; ); * check to see if new variable entered basis Loop(sI, if((OptX.l(sI)=0 AND X.l(sI)>0), change = 1; ); ); * check for feasibility Loop(sI, if((X.l(sI)<0), change = 3; ); ); if (sum(sI,X.l(sI))>1.0001 OR sum(sI,X.l(sI))<.9999, change=3; ); if(Ret.l.01), if ((change = 1), delta = -1*abs(.5 * delta); elseif (change=3), * change back to previous (feasible) value if (ULD = 0, DesRet = DesRet-delta; else DesRet = DesRet+delta; ); delta = abs(.5 * delta); else delta = -.5 * delta; ); if (ULD = 0, DesRet = DesRet+delta; else DesRet = DesRet-delta; ); Solve MinVar using NLP minimizing TotRisk; * now check for basis change or infeasibility change=0; Loop(sI, if((OptX.l(sI)=0 AND X.l(sI)>0), change = 1; ); ); Loop(sI, if((X.l(sI)<0), change = 3; ); ); if (sum(sI,X.l(sI))>1.0001 OR sum(sI,X.l(sI))<.9999, change=3; ); if(Ret.l2 or DesBeta(sJ)<(-2)), change = 2; ); * check for new variable in basis Loop(sI, if((OptX.l(sI)=0 AND X.l(sI)>0), change = 1; ); ); * check for infeasibility Loop(sI, if((X.l(sI)<0), change = 3; ); ); if (sum(sI,X.l(sI))>1.0001 OR sum(sI,X.l(sI))<.9999, change=3; ); Loop(lJ, if(DesBeta(lJ)+.001.02), if ((change = 1), delta = -1*abs(.5 * delta); elseif (change=3), * change back to previous (feasible) value if (ULD = 0, DesBeta(sJ) = DesBeta(sJ)-delta; else DesBeta(sJ) = DesBeta(sJ)+delta; ); delta = abs(.5 * delta); else delta = -.5 * delta; ); if (ULD = 0, DesBeta(sJ) = DesBeta(sJ)+delta; else DesBeta(sJ) = DesBeta(sJ)-delta; ); Solve MaxRet using NLP maximizing Ret; * now check for basis change or infeasibility change = 0; Loop(sI, If((OptX.l(sI)=0 AND X.l(sI)>0), change = 1; ); ); Loop(sI, if((X.l(sI)<0), change = 3; ); ); if (sum(sI,X.l(sI))>1.0001 OR sum(sI,X.l(sI))<.9999, change=3; ); Loop(lJ, if(DesBeta(lJ)+.001.2 or Factor(sJ)<(-.2)), change = 2; ); * Check for new basic variable Loop(sI, if((OptX.l(sI)=0 AND X.l(sI)>0), change = 1; ); ); * check for infeasibility Loop(sI, if((X.l(sI)<0), change = 3; ); ); if (sum(sI,X.l(sI))>1.0001 OR sum(sI,X.l(sI))<.9999, change=3; ); if (ModelNum=2, Loop(lJ, if(DesBeta(lJ)+.001.005), if ((change = 1), delta = -1*abs(.5 * delta); elseif (change=3), * change back to previous (feasible) value if (ULD = 0, Factor(sJ) = Factor(sJ)-delta; else Factor(sJ) = Factor(sJ)+delta; ); delta = abs(.5 * delta); else delta = -.5 * delta; ); if (ULD = 0, Factor(sJ) = Factor(sJ)+delta; else Factor(sJ) = Factor(sJ)-delta; ); if (ModelNum = 1, Solve MinVar using NLP minimizing TotRisk; else Solve MaxRet using NLP maximizing Ret; ); * check for basis change or infeasibility change = 0; Loop(sI, If((OptX.l(sI)=0 AND X.l(sI)>0), change = 1; ); ); Loop(sI, if((X.l(sI)<0), change = 3; ); ); if (sum(sI,X.l(sI))>1.0001 OR sum(sI,X.l(sI))<.9999, change=3; ); if (ModelNum=2, Loop(lJ, if(DesBeta(lJ)+.001