(!****************************************************** Mosel Example Problems ====================== file runfolio2.mos `````````````````` Master model running portfolio optimization model. Runs model foliomemio2.mos. -- Data input/output in memory -- -- Grouping arrays with identical index sets -- (c) 2009 Fair Isaac Corporation author: S.Heipcke, Feb. 2009 *******************************************************!) model "Run portfolio optimization model" uses "mmjobs" ! Use multiple model handling uses "mmsystem", "mmxprs" parameters MODELFILE = "foliomemio2.mos" ! Optimization model INPUTFILE = "folio10.dat" ! File with problem data MAXRISK = 1/3 ! Max. investment into high-risk values MINREG = 0.2 ! Min. investment per geogr. region MAXREG = 0.5 ! Max. investment per geogr. region MAXSEC = 0.25 ! Max. investment per ind. sector MAXVAL = 0.2 ! Max. investment per share MINVAL = 0.1 ! Min. investment per share MAXNUM = 15 ! Max. number of different assets end-parameters forward procedure write_html_results declarations SHARES: set of string ! Set of shares RISK: set of string ! Set of high-risk values among shares REGIONS: set of string ! Geographical regions TYPES: set of string ! Share types (ind. sectors) LOCTAB: dynamic array(REGIONS,SHARES) of boolean ! Shares per geogr. region RET: array(SHARES) of real ! Estimated return in investment SECTAB: dynamic array(TYPES,SHARES) of boolean ! Shares per industry sector returnsol: real ! Solution values numsharessol,status: integer fracsol: array(SHARES) of real ! Fraction of capital used per share buysol: array(SHARES) of real ! 1 if asset is in portfolio, 0 otherwise foliomod: Model end-declarations ! Compile and load the optimization model if compile("", MODELFILE, "shmem:bim") <> 0 then writeln("Error during model compilation") exit(1) end-if load(foliomod, "shmem:bim") fdelete("shmem:bim") ! Read in data from file initializations from INPUTFILE RISK RET LOCTAB SECTAB end-initializations ! Save data to memory initializations to "raw:" RISK as 'shmem:RISK' RET as 'shmem:RET' LOCTAB as 'shmem:LOCTAB' SECTAB as 'shmem:SECTAB' end-initializations run(foliomod, "MAXRISK=" + MAXRISK + ",MINREG=" + MINREG + ",MAXREG=" + MAXREG + ",MAXSEC=" + MAXSEC + ",MAXVAL=" + MAXVAL + ",MINVAL=" + MINVAL + ",MAXNUM=" + MAXNUM + ",DATAFILE='raw:',OUTPUTFILE='raw:'," + "RISKDATA='shmem:RISK',RETDATA='shmem:RET',LOCDATA='shmem:LOCTAB'," + "SECDATA='shmem:SECTAB',FRACBUYSOL='shmem:FRACBUY'," + "NUMSHARES='shmem:NUMSHARES',RETSOL='shmem:RETSOL'," + "SOLSTATUS='shmem:SOLSTATUS'") wait ! Wait for model termination dropnextevent ! Ignore termination event message initializations from "raw:" returnsol as 'shmem:RETSOL' numsharessol as 'shmem:NUMSHARES' [fracsol,buysol] as 'shmem:FRACBUY' status as 'shmem:SOLSTATUS' end-initializations case status of XPRS_OPT: writeln("Problem solved to optimality") XPRS_UNF: writeln("Problem solving unfinished") XPRS_INF: writeln("Problem is infeasible") XPRS_UNB,XPRS_OTH: writeln("No solution available") end-case ! Solution printing writeln("Total return: ", returnsol) writeln("Number of shares: ", numsharessol) forall(s in SHARES | fracsol(s)>0) writeln(s, ": ", fracsol(s)*100, "% (", buysol(s), ")") write_html_results ! *********** Writing an HTML result file *********** procedure write_html_results setparam("datetimefmt", "%0d-%N-%y, %0H:%0M:%0S") HTMLFILE:= INPUTFILE + "_sol.html" fopen(HTMLFILE, F_OUTPUT) writeln("") writeln("") writeln("") writeln("") writeln("") writeln("

Portfolio Optimization Results

") writeln("") writeln("") writeln("") writeln("") writeln("
Total return: ", returnsol, "Problem instance: ", INPUTFILE,"
Number of shares: ", numsharessol, "Date: ", datetime(SYS_NOW),"
 
") writeln("") writeln("") forall(s in SHARES | fracsol(s)>0) writeln("") writeln("
ValuePercentage
", s, "", strfmt(fracsol(s)*100,4,2), "%
") writeln("") writeln("") fclose(F_OUTPUT) end-procedure end-model