(!****************************************************** Mosel Example Problems ====================== file foliomip2.mos `````````````````` Modeling a small MIP problem to perform portfolio optimization. -- Imposing a minimum investment per share -- (c) 2008 Fair Isaac Corporation author: S.Heipcke, Aug. 2003 *******************************************************!) model "Portfolio optimization with MIP" uses "mmxprs" parameters MAXRISK = 1/3 ! Max. investment into high-risk values MINAM = 0,5 ! Min. investment into N.-American values MAXVAL = 0,3 ! Max. investment per share MINVAL = 0,1 ! Min. investment per share end-parameters declarations SHARES: set of string ! Set of shares RISK: set of string ! Set of high-risk values among shares NA: set of string ! Set of shares issued in N.-America RET: array(SHARES) of real ! Estimated return in investment end-declarations initializations from "folio.dat" RISK RET NA end-initializations declarations frac: array(SHARES) of mpvar ! Fraction of capital used per share end-declarations ! Objective: total return Return:= sum(s in SHARES) RET(s)*frac(s) ! Limit the percentage of high-risk values sum(s in RISK) frac(s) <= MAXRISK ! Minimum amount of North-American values sum(s in NA) frac(s) >= MINAM ! Spend all the capital sum(s in SHARES) frac(s) = 1 ! Upper and lower bounds on the investment per share forall(s in SHARES) do frac(s) <= MAXVAL frac(s) is_semcont MINVAL end-do ! Solve the problem maximize(Return) ! Solution printing writeln("Total return: ", getobjval) forall(s in SHARES) writeln(s, ": ", getsol(frac(s))*100, "%") end-model