foliolp.mos |
(!******************************************************
Mosel Example Problems
======================
file foliolp.mos
````````````````
Modeling a small LP problem
to perform portfolio optimization.
(c) 2008 Fair Isaac Corporation
author: S.Heipcke, Aug. 2003
*******************************************************!)
model "Portfolio optimization with LP"
uses "mmxprs"
declarations
SHARES = 1..10 ! Set of shares
RISK = {2,3,4,9,10} ! Set of high-risk values among shares
NA = {1,2,3,4} ! Set of shares issued in N.-America
RET: array(SHARES) of real ! Estimated return in investment
frac: array(SHARES) of mpvar ! Fraction of capital used per share
end-declarations
RET:: [5,17,26,12,8,9,7,6,31,21]
! 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) <= 1/3
! Minimum amount of North-American values
sum(s in NA) frac(s) >= 0.5
! Spend all the capital
sum(s in SHARES) frac(s) = 1
! Upper bounds on the investment per share
forall(s in SHARES) frac(s) <= 0.3
! Solve the problem
maximize(Return)
(!
declarations
Status:array({XPRS_OPT,XPRS_UNF,XPRS_INF,XPRS_UNB,XPRS_OTH}) of string
end-declarations
Status::([XPRS_OPT,XPRS_UNF,XPRS_INF,XPRS_UNB,XPRS_OTH])[
"Optimum found","Unfinished","Infeasible","Unbounded","Failed"]
writeln("Problem status: ", Status(getprobstat))
!)
! Solution printing
writeln("Total return: ", getobjval)
forall(s in SHARES) writeln(s, ": ", getsol(frac(s))*100, "%")
end-model
|
|
foliolperr.mos |
(!******************************************************
Mosel Example Problems
======================
file foliolperr.mos
```````````````````
Modeling a small LP problem
to perform portfolio optimization.
-- Model with syntax errors --
(c) 2008 Fair Isaac Corporation
author: S.Heipcke, Aug. 2003
*******************************************************!)
model "Portfolio optimization with LP"
declarations
SHARES = 1..10 ! Set of shares
RISK = {2,3,4,9,10} ! Set of high-risk values among shares
NA = {1,2,3,4} ! Set of shares issued in N.-America
RET: array(SHARES) of real ! Estimated return in investment
frac: array(SHARES) of mpvar ! Fraction of capital used per share
end-declarations
RET:: [5,17,26,12,8,9,7,6,31,21
! 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) <= 1/3
! Minimum amount of North-American values
sum(s in NA) frac(s) >= 0.5
! Spend all the capital
sum(s in SHARES) frac(s) = 1
! Upper bounds on the investment per share
forall(s in SHARES) frac(s) <= 0.3
! Solve the problem
maximize(Return)
! Solution printing
writeln("Total return: ", getobjval)
forall(s in SHARES) writeln(s, ": ", getsol(frac(s))*100, "%")
end-model
|
|
foliolps.mos |
(!******************************************************
Mosel Example Problems
======================
file foliolps.mos
`````````````````
Modeling a small LP problem
to perform portfolio optimization.
-- Using string indices --
(c) 2008 Fair Isaac Corporation
author: S.Heipcke, Mar. 2006
*******************************************************!)
model "Portfolio optimization with LP"
uses "mmxprs"
declarations
! Set of shares
SHARES = {"treasury", "hardware", "theater", "telecom", "brewery",
"highways", "cars", "bank", "software", "electronics"}
! Set of high-risk values among shares
RISK = {"hardware", "theater", "telecom", "software", "electronics"}
! Set of shares issued in N.-America
NA = {"treasury", "hardware", "theater", "telecom"}
RET: array(SHARES) of real ! Estimated return in investment
frac: array(SHARES) of mpvar ! Fraction of capital used per share
end-declarations
RET::(["treasury", "hardware", "theater", "telecom", "brewery", "highways",
"cars", "bank", "software", "electronics"])[5,17,26,12,8,9,7,6,31,21]
! 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) <= 1/3
! Minimum amount of North-American values
sum(s in NA) frac(s) >= 0.5
! Spend all the capital
sum(s in SHARES) frac(s) = 1
! Upper bounds on the investment per share
forall(s in SHARES) frac(s) <= 0.3
! Solve the problem
maximize(Return)
! Solution printing
writeln("Total return: ", getobjval)
forall(s in SHARES) writeln(s, ": ", getsol(frac(s))*100, "%")
end-model
|
|
foliolps_graph.mos |
(!******************************************************
Mosel Example Problems
======================
file foliolps_graph.mos
```````````````````````
Modeling a small LP problem
to perform portfolio optimization.
-- Using string indices --
-- Graphical representation of the solution --
(c) 2017 Fair Isaac Corporation
author: S.Heipcke, June 2017, Sep. 2017
*******************************************************!)
model "Portfolio optimization with LP - graph"
uses "mmxprs" ! Use Xpress Optimizer
uses "mmsvg"
declarations
! Set of shares
SHARES = {"treasury", "hardware", "theater", "telecom", "brewery",
"highways", "cars", "bank", "software", "electronics"}
! Set of high-risk values among shares
RISK = {"hardware", "theater", "telecom", "software", "electronics"}
! Set of shares issued in N.-America
NA = {"treasury", "hardware", "theater", "telecom"}
RET: array(SHARES) of real ! Estimated return in investment
frac: array(SHARES) of mpvar ! Fraction of capital used per share
end-declarations
RET::(["treasury", "hardware", "theater", "telecom", "brewery", "highways",
"cars", "bank", "software", "electronics"])[5,17,26,12,8,9,7,6,31,21]
! 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) <= 1/3
! Minimum amount of North-American values
sum(s in NA) frac(s) >= 0.5
! Spend all the capital
sum(s in SHARES) frac(s) = 1
! Upper bounds on the investment per share
forall(s in SHARES) frac(s) <= 0.3
! Solve the problem
maximize(Return)
! Solution printing
writeln("Total return: ", getobjval)
forall(s in SHARES) writeln(s, ": ", getsol(frac(s))*100, "%")
! Solution drawing
forall(s in SHARES) svgaddgroup("gr"+s,s)
ttl:=0.0
forall(s in SHARES | frac(s).sol>0) do
svgaddpie("gr"+s, 200,200, 150, ttl, ttl+frac(s).sol)
svgsetstyle(svggetlastobj, SVG_STROKE, SVG_GRAY)
ttl+=frac(s).sol
end-do
! Optionally save graphic to file
svgsave("foliolps.svg")
! Set graph size
svgsetgraphviewbox(0,0,500,500)
! Display the graph and wait for window to be closed by the user
svgrefresh
svgwaitclose("Close browser window to terminate model execution.", 1)
end-model
|
|
foliodata.mos |
(!******************************************************
Mosel Example Problems
======================
file foliodata.mos
``````````````````
Modeling a small LP problem
to perform portfolio optimization.
-- Parameters, data input from file,
result output to file --
(c) 2008 Fair Isaac Corporation
author: S.Heipcke, Aug. 2003, rev. June 2018
*******************************************************!)
model "Portfolio optimization with LP"
uses "mmxprs"
parameters
DATAFILE= "folio.dat" ! File with problem data
OUTFILE= "result.dat" ! Output file
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
end-parameters
public 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 DATAFILE
RISK RET NA
end-initializations
public declarations
frac: array(SHARES) of mpvar ! Fraction of capital used per share
Return: linctr ! Objective function
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
! Solve the problem
maximize(Return)
! Solution printing to a file
fopen(OUTFILE, F_OUTPUT)
writeln("Total return: ", getobjval)
forall(s in SHARES)
writeln(strfmt(s,-12), ": \t", strfmt(getsol(frac(s))*100,5,2), "%")
fclose(F_OUTPUT)
end-model
|
|
folioodbc.mos |
(!******************************************************
Mosel Example Problems
======================
file folioodbc.mos
``````````````````
Modeling a small LP problem
to perform portfolio optimization.
-- Parameters, data input through ODBC,
result output through ODBC --
IMPORTANT:
If this example is run more than once,
you need to delete the solution data from the
previous run in the database.
The mysql database 'folio' is not provided.
You can create the database contents by
executing model 'genfoliodb.mos'.
(c) 2008 Fair Isaac Corporation
author: S.Heipcke, Mar. 2006, rev. Aug. 2023
*******************************************************!)
model "Portfolio optimization with LP (ODBC)"
uses "mmxprs", "mmodbc"
parameters
! DATAFILE = "folio.mdb" ! Access database with problem data
! DATAFILE = "DSN=mysql;DB=folio" ! MySQL database with problem data
DATAFILE = "folio.sqlite" ! SQLite database with problem data
DBDATA = "folio" ! Database table with problem data
DBSOL = "foliosol" ! Table for solution data
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
end-parameters
declarations
SHARES: set of string ! Set of shares
RET: array(SHARES) of real ! Estimated return in investment
RISK: array(SHARES) of boolean ! List of high-risk values among shares
NA: array(SHARES) of boolean ! List of shares issued in N.-America
end-declarations
! Data input from database
initializations from "mmodbc.odbc:" + DATAFILE
[RET,RISK,NA] as DBDATA
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 SHARES | RISK(s)) frac(s) <= MAXRISK
! Minimum amount of North-American values
sum(s in SHARES | NA(s)) 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
! Solve the problem
maximize(Return)
! Solution printing
writeln("Total return: ", getobjval)
forall(s in SHARES)
writeln(strfmt(s,-12), ": \t", strfmt(getsol(frac(s))*100,5,2), "%")
! Solution output to database
declarations
Solfrac: array(SHARES) of real ! Solution values
end-declarations
forall(s in SHARES) Solfrac(s):= getsol(frac(s))*100
(! Cleaning up previous results: uncomment if the example is run more than once
SQLconnect(DATAFILE)
if not getparam("SQLsuccess"): setioerr("Database connection failed")
SQLexecute("delete from " + DBSOL)
SQLdisconnect
!)
! Data output to database
initializations to "mmodbc.odbc:" + DATAFILE
Solfrac as DBSOL
end-initializations
end-model
|
|
folioexcel.mos |
(!******************************************************
Mosel Example Problems
======================
file folioexcel.mos
```````````````````
Modeling a small LP problem
to perform portfolio optimization.
-- Parameters, data input from Excel,
result output to Excel --
(c) 2008 Fair Isaac Corporation
author: S.Heipcke, Feb. 2007
*******************************************************!)
model "Portfolio optimization with LP (Excel)"
uses "mmxprs", "mmsheet"
parameters
DATAFILE = "folio.xls" ! Spreadsheet with problem data
DBDATA = "foliodata" ! Spreadsheet range with problem data
DBSOL = "folioresult" ! Range for solution data
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
end-parameters
declarations
SHARES: set of string ! Set of shares
RET: array(SHARES) of real ! Estimated return in investment
RISK: array(SHARES) of boolean ! List of high-risk values among shares
NA: array(SHARES) of boolean ! List of shares issued in N.-America
end-declarations
! Data input from spreadsheet
initializations from "mmsheet.excel:" + DATAFILE
[RET,RISK,NA] as DBDATA
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 SHARES | RISK(s)) frac(s) <= MAXRISK
! Minimum amount of North-American values
sum(s in SHARES | NA(s)) 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
! Solve the problem
maximize(Return)
! Solution printing
writeln("Total return: ", getobjval)
forall(s in SHARES)
writeln(strfmt(s,-12), ": \t", strfmt(getsol(frac(s))*100,5,2), "%")
! Solution output to spreadsheet
declarations
Solfrac: array(SHARES) of real ! Solution values
end-declarations
forall(s in SHARES) Solfrac(s):= getsol(frac(s))*100
initializations to "mmsheet.excel:" + DATAFILE
Solfrac as "grow;"+DBSOL
end-initializations
end-model
|
|
foliosheet.mos |
(!******************************************************
Mosel Example Problems
======================
file foliosheet.mos
```````````````````
Modeling a small LP problem
to perform portfolio optimization.
-- Parameters, data input from Excel,
result output to Excel using
generic worksheet access --
(c) 2012 Fair Isaac Corporation
author: S.Heipcke, Nov. 2012
*******************************************************!)
model "Portfolio optimization with LP (Excel)"
uses "mmxprs", "mmsheet"
parameters
DATAFILE = "folio.xls" ! Spreadsheet with problem data
DBDATA = "foliodata" ! Spreadsheet range with problem data
DBSOL = "folioresult" ! Range for solution data
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
end-parameters
declarations
SHARES: set of string ! Set of shares
RET: array(SHARES) of real ! Estimated return in investment
RISK: array(SHARES) of boolean ! List of high-risk values among shares
NA: array(SHARES) of boolean ! List of shares issued in N.-America
end-declarations
! Data input from spreadsheet
initializations from "mmsheet.xls:" + DATAFILE
[RET,RISK,NA] as DBDATA
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 SHARES | RISK(s)) frac(s) <= MAXRISK
! Minimum amount of North-American values
sum(s in SHARES | NA(s)) 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
! Solve the problem
maximize(Return)
! Solution printing
writeln("Total return: ", getobjval)
forall(s in SHARES)
writeln(strfmt(s,-12), ": \t", strfmt(getsol(frac(s))*100,5,2), "%")
! Solution output to spreadsheet
declarations
Solfrac: array(SHARES) of real ! Solution values
end-declarations
forall(s in SHARES) Solfrac(s):= getsol(frac(s))*100
initializations to "mmsheet.xls:" + DATAFILE
Solfrac as "grow;"+DBSOL
end-initializations
end-model
|
|
foliocsv.mos |
(!******************************************************
Mosel Example Problems
======================
file foliocsv.mos
`````````````````
Modeling a small LP problem
to perform portfolio optimization.
-- Parameters, data input from CSV,
result output to CSV format --
(c) 2012 Fair Isaac Corporation
author: S.Heipcke, Nov. 2012
*******************************************************!)
model "Portfolio optimization with LP (CSV)"
uses "mmxprs", "mmsheet"
parameters
DATAFILE = "folio.csv" ! CSV spreadsheet with problem data
DBDATA = "[C6:F15]" ! Spreadsheet range with problem data
DBSOL = "[H6:I6]" ! Range for solution data
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
end-parameters
declarations
SHARES: set of string ! Set of shares
RET: array(SHARES) of real ! Estimated return in investment
RISK: array(SHARES) of boolean ! List of high-risk values among shares
NA: array(SHARES) of boolean ! List of shares issued in N.-America
end-declarations
! Data input from spreadsheet
initializations from "mmsheet.csv:" + DATAFILE
[RET,RISK,NA] as DBDATA
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 SHARES | RISK(s)) frac(s) <= MAXRISK
! Minimum amount of North-American values
sum(s in SHARES | NA(s)) 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
! Solve the problem
maximize(Return)
! Solution printing
writeln("Total return: ", getobjval)
forall(s in SHARES)
writeln(strfmt(s,-12), ": \t", strfmt(getsol(frac(s))*100,5,2), "%")
! Solution output to spreadsheet
declarations
Solfrac: array(SHARES) of real ! Solution values
end-declarations
forall(s in SHARES) Solfrac(s):= getsol(frac(s))*100
initializations to "mmsheet.csv:" + DATAFILE
Solfrac as "grow;"+DBSOL
end-initializations
end-model
|
|
folioloop.mos |
(!******************************************************
Mosel Example Problems
======================
file folioloop.mos
``````````````````
Modeling a small LP problem
to perform portfolio optimization.
-- Re-solving with varied parameter settings --
(c) 2008 Fair Isaac Corporation
author: S.Heipcke, Aug. 2003
*******************************************************!)
model "Portfolio optimization with LP"
uses "mmxprs"
parameters
DATAFILE= "folio.dat" ! File with problem data
DEVDATA= "foliodev.dat" ! File with deviation data
MAXVAL = 0.3 ! Max. investment per share
MINAM = 0.5 ! Min. investment into N.-American values
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
DEV: array(SHARES) of real ! Standard deviation
SOLRET: array(range) of real ! Solution values (total return)
SOLDEV: array(range) of real ! Solution values (average deviation)
end-declarations
initializations from DATAFILE
RISK RET NA
end-initializations
initializations from DEVDATA
DEV
end-initializations
declarations
frac: array(SHARES) of mpvar ! Fraction of capital used per share
Return, Risk: linctr
end-declarations
! Objective: total return
Return:= sum(s in SHARES) RET(s)*frac(s)
! 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
! Solve the problem for different limits on high-risk shares
ct:=0
forall(r in 0..20) do
! Limit the percentage of high-risk values
Risk:= sum(s in RISK) frac(s) <= r/20
maximize(Return) ! Solve the problem
if (getprobstat = XPRS_OPT) then ! Save the optimal solution value
ct+=1
SOLRET(ct):= getobjval
SOLDEV(ct):= getsol(sum(s in SHARES) DEV(s)*frac(s))
writeln(r/20, "%: ret ", SOLRET(ct), " dev ", SOLDEV(ct))
else
writeln("No solution for high-risk values <= ", 100*r/20, "%")
end-if
end-do
! Print the data
writeln("Low risk shares:")
forall (s in SHARES - RISK) writeln(s, ": ret ", RET(s), " dev ", DEV(s))
writeln("High risk shares:")
forall (s in RISK) writeln(s, ": ret ", RET(s), " dev ", DEV(s))
end-model
|
|
folioloop_graph.mos |
(!******************************************************
Mosel Example Problems
======================
file folioloop_graph.mos
````````````````````````
Modeling a small LP problem
to perform portfolio optimization.
-- Re-solving with varied parameter settings,
graphical solution display --
(c) 2008 Fair Isaac Corporation
author: S.Heipcke, Aug. 2003, rev. Sep. 2017
*******************************************************!)
model "Portfolio optimization with LP"
uses "mmxprs", "mmsvg" ! Use Xpress Optimizer with SVG graphing
parameters
DATAFILE= "folio.dat" ! File with problem data
DEVDATA= "foliodev.dat" ! File with deviation data
MAXVAL = 0.3 ! Max. investment per share
MINAM = 0.5 ! Min. investment into N.-American values
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
DEV: array(SHARES) of real ! Standard deviation
SOLRET: array(range) of real ! Solution values (total return)
SOLDEV: array(range) of real ! Solution values (average deviation)
end-declarations
initializations from DATAFILE
RISK RET NA
end-initializations
initializations from DEVDATA
DEV
end-initializations
declarations
frac: array(SHARES) of mpvar ! Fraction of capital used per share
Return, Risk: linctr
end-declarations
! Objective: total return
Return:= sum(s in SHARES) RET(s)*frac(s)
! 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
! Solve the problem for different limits on high-risk shares
ct:=0
forall(r in 0..20) do
! Limit the percentage of high-risk values
Risk:= sum(s in RISK) frac(s) <= r/20
maximize(Return) ! Solve the problem
if (getprobstat = XPRS_OPT) then ! Save the optimal solution value
ct+=1
SOLRET(ct):= getobjval
SOLDEV(ct):= getsol(sum(s in SHARES) DEV(s)*frac(s))
else
writeln("No solution for high-risk values <= ", 100*r/20, "%")
end-if
end-do
! Drawing a graph to represent results (`GrS') and data (`GrL' & `GrH')
svgaddgroup("GrS", "Solution values", SVG_GREY)
svgaddgroup("GrL", "Low risk", SVG_GREEN)
svgaddgroup("GrH", "High risk", SVG_RED)
forall(r in 1..ct) svgaddpoint("GrS", SOLRET(r), SOLDEV(r))
svgaddline("GrS", sum(r in 1..ct) [SOLRET(r), SOLDEV(r)])
forall(s in SHARES - RISK) do
svgaddpoint("GrL", RET(s), DEV(s))
svgaddtext("GrL", RET(s)+1, 1.3*(DEV(s)-1), s)
end-do
forall(s in RISK) do
svgaddpoint("GrH", RET(s), DEV(s))
svgaddtext("GrH", RET(s)-2.5, DEV(s)-1, s)
end-do
! Scale the size of the displayed graph
svgsetgraphscale(10)
svgsetgraphpointsize(2)
svgsetgraphlabels("Expected return", "Standard deviation")
! Optionally save graphic to file
svgsave("foliograph.svg")
! Display the graph and wait for window to be closed by the user
svgrefresh
svgwaitclose("Close browser window to terminate model execution.", 1)
end-model
|
|
foliomip1.mos |
(!******************************************************
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
|
|
foliomip2.mos |
(!******************************************************
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
|
|
folioqp.mos |
(!******************************************************
Mosel Example Problems
======================
file folioqp.mos
````````````````
Modeling a small QP problem
to perform portfolio optimization.
-- 1. QP: minimize variance
2. MIQP: limited number of assets ---
(c) 2008 Fair Isaac Corporation
author: S.Heipcke, Aug. 2003, rev. Sep. 2017
*******************************************************!)
model "Portfolio optimization with QP/MIQP"
uses "mmxprs", "mmnl"
parameters
MAXVAL = 0.3 ! Max. investment per share
MINAM = 0.5 ! Min. investment into N.-American values
MAXNUM = 4 ! Max. number of different assets
TARGET = 9.0 ! Minimum target yield
end-parameters
declarations
SHARES = 1..10 ! Set of shares
RISK: set of integer ! Set of high-risk values among shares
NA: set of integer ! Set of shares issued in N.-America
RET: array(SHARES) of real ! Estimated return in investment
VAR: array(SHARES,SHARES) of real ! Variance/covariance matrix of
! estimated returns
end-declarations
initializations from "folioqp.dat"
RISK RET NA VAR
end-initializations
declarations
frac: array(SHARES) of mpvar ! Fraction of capital used per share
end-declarations
! **** First problem: unlimited number of assets ****
! Objective: mean variance
Variance:= sum(s,t in SHARES) VAR(s,t)*frac(s)*frac(t)
! Minimum amount of North-American values
sum(s in NA) frac(s) >= MINAM
! Spend all the capital
sum(s in SHARES) frac(s) = 1
! Target yield
sum(s in SHARES) RET(s)*frac(s) >= TARGET
! Upper bounds on the investment per share
forall(s in SHARES) frac(s) <= MAXVAL
! Solve the problem
minimize(Variance)
! Solution printing
writeln("With a target of ", TARGET, " minimum variance is ", getobjval)
forall(s in SHARES) writeln(s, ": ", getsol(frac(s))*100, "%")
! **** Second problem: limit total number of assets ****
declarations
buy: array(SHARES) of mpvar ! 1 if asset is in portfolio, 0 otherwise
end-declarations
! Limit the total number of assets
sum(s in SHARES) buy(s) <= MAXNUM
forall(s in SHARES) do
buy(s) is_binary
frac(s) <= buy(s)
end-do
! Solve the problem
minimize(Variance)
writeln("With a target of ", TARGET," and at most ", MAXNUM,
" assets,\n minimum variance is ", getobjval)
forall(s in SHARES) writeln(s, ": ", getsol(frac(s))*100, "%")
end-model
|
|
folioqp_graph.mos |
(!******************************************************
Mosel Example Problems
======================
file folioqp_graph.mos
``````````````````````
Modeling a small QP problem
to perform portfolio optimization.
Minimize variance subject to different target return.
Graphical output.
(c) 2008 Fair Isaac Corporation
author: S.Heipcke, Aug. 2003, rev. Sep. 2017
*******************************************************!)
model "Portfolio optimization with QP, graphical output"
uses "mmxprs", "mmnl", "mmsvg" ! Use Xpress Optimizer with QP solver
parameters
MAXVAL = 0.3 ! Max. investment per share
MINAM = 0.5 ! Min. investment into N.-American values
end-parameters
declarations
SHARES = 1..10 ! Set of shares
RISK: set of integer ! Set of high-risk values among shares
NA: set of integer ! Set of shares issued in N.-America
RET: array(SHARES) of real ! Estimated return in investment
VAR: array(SHARES,SHARES) of real ! Variance/covariance matrix of
! estimated returns
SOLRET: array(range) of real ! Solution values (total return)
SOLDEV: array(range) of real ! Solution values (average deviation)
end-declarations
initializations from "folioqp.dat"
RISK RET NA VAR
end-initializations
declarations
frac: array(SHARES) of mpvar ! Fraction of capital used per share
end-declarations
! Objective: mean variance
Variance:= sum(s,t in SHARES) VAR(s,t)*frac(s)*frac(t)
! 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
! Solve the problem for a range of returns: this is the efficient frontier
target:= min(s in SHARES) RET(s)
RMAX:= max(s in SHARES) RET(s)
while(target < RMAX) do
Return:= sum(s in SHARES) RET(s)*frac(s) >= target ! Target yield
minimize(Variance) ! Solve the problem
if (getprobstat = XPRS_OPT) then ! Save the optimal solution value
ct+=1
SOLDEV(ct):= getobjval
SOLRET(ct):= target
else
writeln("No solution for target return >= ", ct, "%")
break
end-if
target += 1
end-do
! Drawing a graph to represent results (`GrS') and data (`GrL' & `GrH')
declarations
DEV: array(SHARES) of real ! Standard deviation
NAMES: array(SHARES) of string ! Names of shares
end-declarations
initializations from "folioqpgraph.dat"
DEV NAMES
end-initializations
svgaddgroup("GrS", "Solution values", SVG_GREY)
svgaddgroup("GrL", "Low risk", SVG_GREEN)
svgaddgroup("GrH", "High risk", SVG_RED)
forall(r in 1..ct) svgaddpoint("GrS", SOLRET(r), SOLDEV(r));
svgaddline("GrS", sum(r in 1..ct) [SOLRET(r), SOLDEV(r)])
forall (s in SHARES-RISK) do
svgaddpoint("GrL", RET(s), DEV(s))
svgaddtext("GrL", RET(s)+1, 1.3*(DEV(s)-1), NAMES(s))
end-do
forall (s in RISK) do
svgaddpoint("GrH", RET(s), DEV(s))
svgaddtext("GrH", RET(s)-2.5, DEV(s)-1, NAMES(s))
end-do
! Scale the size of the displayed graph
svgsetgraphscale(10)
svgsetgraphpointsize(2)
svgsetgraphlabels("Expected return", "Standard deviation")
! Optionally save graphic to file
svgsave("folioqpgraph.svg")
! Display the graph and wait for window to be closed by the user
svgrefresh
svgwaitclose("Close browser window to terminate model execution.", 1)
end-model
|
|
folioqc.mos |
(!******************************************************
Mosel Example Problems
======================
file folioqc.mos
````````````````
Modeling a small QCQP problem
to perform portfolio optimization.
-- Maximize return with limit on variance ---
(c) 2008 Fair Isaac Corporation
author: S.Heipcke, July 2008
*******************************************************!)
model "Portfolio optimization with QCQP"
uses "mmxprs", "mmnl"
parameters
MAXVAL = 0.3 ! Max. investment per share
MINAM = 0.5 ! Min. investment into N.-American values
MAXVAR = 0.55 ! Max. allowed variance
end-parameters
declarations
SHARES = 1..10 ! Set of shares
NA: set of integer ! Set of shares issued in N.-America
RET: array(SHARES) of real ! Estimated return in investment
VAR: array(SHARES,SHARES) of real ! Variance/covariance matrix of
! estimated returns
end-declarations
initializations from "folioqp.dat"
RET NA VAR
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)
! Minimum amount of North-American values
sum(s in NA) frac(s) >= MINAM
! Spend all the capital
sum(s in SHARES) frac(s) = 1
! Limit variance
sum(s,t in SHARES) VAR(s,t)*frac(s)*frac(t) <= MAXVAR
! Upper bounds on the investment per share
forall(s in SHARES) frac(s) <= MAXVAL
! Solve the problem
maximize(Return)
! Solution printing
writeln("With a max. variance of ", MAXVAR, " total return is ", getobjval)
forall(s in SHARES) writeln(s, ": ", getsol(frac(s))*100, "%")
end-model
|
|
foliomiqc.mos |
(!******************************************************
Mosel Example Problems
======================
file foliomiqc.mos
``````````````````
Modeling a small MIQCQP problem
to perform portfolio optimization.
-- Maximize return with limit on variance
and limited number of assets ---
(c) 2008 Fair Isaac Corporation
author: S.Heipcke, July 2008, rev. Mar. 2013
*******************************************************!)
model "Portfolio optimization with MIQCQP"
uses "mmxnlp"
parameters
MAXVAL = 0.3 ! Max. investment per share
MINAM = 0.5 ! Min. investment into N.-American values
MAXNUM = 4 ! Max. number of different assets
MAXVAR = 1.25 ! Max. allowed variance
end-parameters
declarations
SHARES = 1..10 ! Set of shares
NA: set of integer ! Set of shares issued in N.-America
RET: array(SHARES) of real ! Estimated return in investment
VAR: array(SHARES,SHARES) of real ! Variance/covariance matrix of
! estimated returns
end-declarations
initializations from "folioqp.dat"
RET NA VAR
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)
! Minimum amount of North-American values
sum(s in NA) frac(s) >= MINAM
! Spend all the capital
sum(s in SHARES) frac(s) = 1
! Limit variance
sum(s,t in SHARES) VAR(s,t)*frac(s)*frac(t) <= MAXVAR
! 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
frac(s) <= buy(s)
end-do
setparam("XPRS_verbose", true)
! Solve the problem
maximize(Return)
! Solution printing
writeln("With a max. variance of ", MAXVAR, " and at most ", MAXNUM,
" assets,\n total return is ", getsol(Return))
forall(s in SHARES) writeln(s, ": ", getsol(frac(s))*100, "%")
end-model
|
|
folioheur.mos |
(!******************************************************
Mosel Example Problems
======================
file folioheur.mos
``````````````````
Modeling a small MIP problem
to perform portfolio optimization.
-- Heuristic solution --
(c) 2008 Fair Isaac Corporation
author: S.Heipcke, Aug. 2003, rev. Apr. 2021
*******************************************************!)
model "Portfolio optimization solved heuristically"
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 assets
end-parameters
forward procedure solve_heur ! Binary variable fixing heuristic
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
frac(s) <= buy(s)
end-do
! Solve problem heuristically
solve_heur
! Solve the problem
maximize(Return)
! Solution printing
if getprobstat=XPRS_OPT then
writeln("Exact solution: Total return: ", getobjval)
forall(s in SHARES) writeln(s, ": ", getsol(frac(s))*100, "%")
else
writeln("Heuristic solution is optimal.")
end-if
!-----------------------------------------------------------------
procedure solve_heur
declarations
TOL: real ! Solution feasibility tolerance
fsol: array(SHARES) of real ! Solution values for `frac' variables
bas: basis ! LP basis
end-declarations
setparam("XPRS_VERBOSE",true) ! Enable message printing in mmxprs
setparam("XPRS_CUTSTRATEGY",0) ! Disable automatic cuts (optional)
setparam("XPRS_HEUREMPHASIS",0) ! Disable MIP heuristics (optional)
setparam("XPRS_PRESOLVE",0) ! Switch off presolve (required)
TOL:=getparam("XPRS_FEASTOL") ! Get feasibility tolerance
setparam("ZEROTOL",TOL) ! Set comparison tolerance
maximize(XPRS_LPSTOP,Return) ! Solve the LP problem
savebasis(bas) ! Save the current basis
! Fix all variables `buy' for which `frac' is at 0 or at a relatively
! large value
forall(s in SHARES) do
fsol(s):= getsol(frac(s))
if (fsol(s) = 0) then
setub(buy(s), 0)
elif (fsol(s) >= 0.2) then
setlb(buy(s), 1)
end-if
end-do
maximize(XPRS_CONT,Return) ! Solve the MIP problem
ifgsol:=false
if getprobstat=XPRS_OPT then ! If an integer feas. solution was found
ifgsol:=true
solval:=getobjval ! Get the value of the best solution
writeln("Heuristic solution: Total return: ", solval)
forall(s in SHARES) writeln(s, ": ", getsol(frac(s))*100, "%")
end-if
! Reset variables to their original bounds
forall(s in SHARES)
if ((fsol(s) = 0) or (fsol(s) >= 0.2)) then
setlb(buy(s), 0)
setub(buy(s), 1)
end-if
loadbasis(bas) ! Load the saved basis: bound changes are
! immediately passed on to the optimizer
! if the problem has not been modified
! in any other way, so that there is no
! need to reload the matrix
if ifgsol then ! Set cutoff to the best known solution
setparam("XPRS_MIPABSCUTOFF", solval+TOL)
end-if
end-procedure
end-model
|
|