| |||||||||||||||||||||||||||
| |||||||||||||||||||||||||||
|
Folio - Advanced modelling and solving tasks Description Advanced modelling and solving tasks for a portfolio optimization problem:
Source Files By clicking on a file name, a preview is opened at the bottom of this page. Data Files
folioinfcause.mos
(!******************************************************
Mosel Example Problems
======================
file folioinfcause.mos
``````````````````````
Modeling a MIP problem
to perform portfolio optimization.
Same model as in foliomip3.mos.
-- Infeasible model parameter values --
-- Retrieving infeasible row/column from presolve --
(c) 2012 Fair Isaac Corporation
author: S.Heipcke, Oct. 2012, rev. Sep. 2018
*******************************************************!)
model "Portfolio optimization with MIP"
uses "mmxprs"
parameters
MAXRISK = 1/3 ! Max. investment into high-risk values
MINREG = 0.1 ! Min. investment per geogr. region
MAXREG = 0.2 ! Max. investment per geogr. region
MAXSEC = 0.1 ! Max. investment per ind. sector
MAXVAL = 0.15 ! Max. investment per share
MINVAL = 0.15 ! Min. investment per share
MAXNUM = 4 ! Max. number of different assets
DATAFILE = "folio10.dat" ! File with problem data
end-parameters
forward procedure print_sol
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)
LOC: array(REGIONS) of set of string ! Sets of shares per geogr. region
RET: array(SHARES) of real ! Estimated return in investment
SEC: array(TYPES) of set of string ! Sets of shares per industry sector
end-declarations
initializations from DATAFILE
RISK RET LOC SEC
end-initializations
public 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
Return: linctr ! Total return
LimitRisk: linctr ! Max. percentage of high-risk values
LimitMinReg,LimitMaxReg: array(REGIONS) of linctr ! Min/max perc. per region
LimitSec: array(TYPES) of linctr ! Max. percentage per industry sector
TotalOne: linctr ! Spend all the capital
LimitNum: linctr ! Max. total number of assets
LinkUB,LinkLB: array(SHARES) of linctr ! Linking buy+frac variables
end-declarations
! Objective: total return
Return:= sum(s in SHARES) RET(s)*frac(s)
! Limit the percentage of high-risk values
LimitRisk:= sum(s in RISK) frac(s) <= MAXRISK
! Limits on geographical distribution
forall(r in REGIONS) do
LimitMinReg(r):= sum(s in LOC(r)) frac(s) >= MINREG
LimitMaxReg(r):= sum(s in LOC(r)) frac(s) <= MAXREG
end-do
! Diversification across industry sectors
forall(t in TYPES) LimitSec(t):= sum(s in SEC(t)) frac(s) <= MAXSEC
! Spend all the capital
TotalOne:= 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
LimitNum:= sum(s in SHARES) buy(s) <= MAXNUM
forall(s in SHARES) do
buy(s) is_binary ! Turn variables into binaries
LinkUB(s):= frac(s) <= MAXVAL*buy(s) ! Linking the variables
LinkLB(s):= frac(s) >= MINVAL*buy(s) ! Linking the variables
end-do
! Display Optimizer log
setparam("XPRS_verbose", true)
setparam("XPRS_LOADNAMES", true)
setparam("XPRS_TRACE", 1) ! Show detailed presolve log
! Solve the problem
maximize(XPRS_LIN,Return)
declarations
V: set of mpvar
C: set of linctr
end-declarations
probstat:= getprobstat
case probstat of
XPRS_OPT: do
writeln("Problem solved")
print_sol
end-do
XPRS_INF: do
setparam("XPRS_verbose", false) ! Disable Optimizer output
writeln("LP infeasible")
getinfcause(V, C) ! Retrieve inf. var. or constr.
forall(v in V) writeln("Infeasible variable: ", getname(v), " ")
forall(c in C) writeln("Infeasible constraint: ", getname(c), " ")
end-do
XPRS_OTH: writeln("Problem unbounded")
XPRS_UNF: writeln("Optimization unfinished")
else writeln("Unknown problem status")
end-case
! Solution printing
procedure print_sol
writeln("Solution ", getparam("XPRS_MIPSOLS"))
writeln("Total return: ", getsol(Return))
forall(s in SHARES | getsol(frac(s))>0)
writeln(s, ": ", getsol(frac(s))*100, "% (", getsol(buy(s)), ")")
end-procedure
end-model
| |||||||||||||||||||||||||||
| © Copyright 2025 Fair Isaac Corporation. |