| |||||||||
Folio - Examples from 'Getting Started' Description Different versions of a portfolio optimization problem. Basic modelling and solving tasks:
Source Files By clicking on a file name, a preview is opened at the bottom of this page. Data Files foliolp.c /******************************************************** Xpress-BCL C Example Problems ============================= file foliolp.c `````````````` Modeling a small LP problem to perform portfolio optimization. (c) 2008-2024 Fair Isaac Corporation author: S.Heipcke, Dec. 2003, rev. Mar. 2011 ********************************************************/ #include <stdio.h> #include "xprb.h" #define NSHARES 10 /* Number of shares */ #define NRISK 5 /* Number of high-risk shares */ #define NNA 4 /* Number of North-American shares */ double RET[] = {5,17,26,12,8,9,7,6,31,21}; /* Estimated return in investment */ int RISK[] = {1,2,3,8,9}; /* High-risk values among shares */ int NA[] = {0,1,2,3}; /* Shares issued in N.-America */ int main(int argc, char **argv) { int s; XPRBprob prob; XPRBctr Risk,Na,Return,Cap; XPRBvar frac[NSHARES]; /* Fraction of capital used per share */ char *LPSTATUS[] = {"not loaded", "optimal", "infeasible", "worse than cutoff", "unfinished", "unbounded", "cutoff in dual", "unsolved", "nonconvex"}; prob = XPRBnewprob("FolioLP"); /* Initialize a new problem in BCL */ /* Create the decision variables */ for(s=0;s<NSHARES;s++) frac[s] = XPRBnewvar(prob, XPRB_PL, "frac", 0, XPRB_INFINITY); /* (prob, XPRB_PL, "frac", 0, 0.3); */ /* Objective: total return */ Return = XPRBnewctr(prob, "Return", XPRB_N); for(s=0;s<NSHARES;s++) XPRBaddterm(Return, frac[s], RET[s]); XPRBsetobj(prob,Return); /* Set the objective function */ /* Limit the percentage of high-risk values */ Risk = XPRBnewctr(prob, "Risk", XPRB_L); for(s=0;s<NRISK;s++) XPRBaddterm(Risk, frac[RISK[s]], 1); XPRBaddterm(Risk, NULL, 1.0/3); /* Minimum amount of North-American values */ Na = XPRBnewctr(prob, "NA", XPRB_G); for(s=0;s<NNA;s++) XPRBaddterm(Na, frac[NA[s]], 1); XPRBaddterm(Na, NULL, 0.5); /* Spend all the capital */ Cap = XPRBnewctr(prob, "Cap", XPRB_E); for(s=0;s<NSHARES;s++) XPRBaddterm(Cap, frac[s], 1); XPRBaddterm(Cap, NULL, 1); /* Upper bounds on the investment per share */ for(s=0;s<NSHARES;s++) XPRBsetub(frac[s], 0.3); /* Export matrix to a file */ /* XPRBexportprob(prob, XPRB_MPS, "Folio"); XPRBsetsense(prob, XPRB_MAXIM); XPRBexportprob(prob, XPRB_LP, "Folio"); */ /* Disable all BCL and Optimizer message printing, except error messages */ /* XPRBsetmsglevel(prob, 1); */ /* Solve the problem */ XPRBsetsense(prob, XPRB_MAXIM); XPRBlpoptimize(prob, ""); printf("Problem status: %s\n", LPSTATUS[XPRBgetlpstat(prob)]); /* Solution printing */ printf("Total return: %g\n", XPRBgetobjval(prob)); for(s=0;s<NSHARES;s++) printf(" %d : %g%%\n", s, XPRBgetsol(frac[s])*100); return 0; } | |||||||||
© Copyright 2023 Fair Isaac Corporation. |