(!****************************************************** Mosel Example Problems ====================== file foliomip1.mos `````````````````` Modeling a small MIP problem to perform portfolio optimization. -- Limiting the total number of assets -- (c) 2008 Fair Isaac Corporation author: S.Heipcke, Aug. 2003, rev. Apr. 2021 *******************************************************!) model "Portfolio optimization with MIP" uses "mmxprs" parameters MAXRISK = 1/3 ! Max. investment into high-risk values MAXVAL = 0.3 ! Max. investment per share MINAM = 0.5 ! Min. investment into N.-American values MAXNUM = 4 ! Max. number of different assets 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 buy: array(SHARES) of mpvar ! 1 if asset is in portfolio, 0 otherwise 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 bounds on the investment per share forall(s in SHARES) frac(s) <= MAXVAL ! Limit the total number of assets sum(s in SHARES) buy(s) <= MAXNUM forall(s in SHARES) do buy(s) is_binary ! Turn variables into binaries frac(s) <= buy(s) ! Linking the variables end-do ! Uncomment this line to see the Optimizer log setparam("XPRS_VERBOSE",true) ! Enable logging output ! Uncomment the following lines to obtain a branch-and-bound tree (! setparam("XPRS_CUTSTRATEGY",0) ! Disable automatic cut generation setparam("XPRS_HEUREMPHASIS",0) ! Disable MIP heuristics setparam("XPRS_PRESOLVE",0) ! Disable presolve !) ! Solve the problem maximize(Return) ! Solution printing writeln("Total return: ", getobjval) forall(s in SHARES) writeln(s, ": ", getsol(frac(s))*100, "% (", getsol(buy(s)), ")") end-model