| |||||||||
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 foliomip1.c /******************************************************** Xpress-BCL C Example Problems ============================= file foliomip1.c ```````````````` Modeling a small MIP problem to perform portfolio optimization. -- Limiting the total number of assets -- (c) 2008-2024 Fair Isaac Corporation author: S.Heipcke, Dec. 2003, rev. Mar. 2011 ********************************************************/ #include <stdio.h> #include "xprb.h" #define MAXNUM 4 /* Max. number of different assets */ #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,Num; XPRBvar frac[NSHARES]; /* Fraction of capital used per share */ XPRBvar buy[NSHARES]; /* 1 if asset is in portfolio, 0 otherwise */ char *MIPSTATUS[] = {"not loaded", "not optimized", "LP optimized", "unfinished (no solution)", "unfinished (solution found)", "infeasible", "optimal", "unbounded"}; prob = XPRBnewprob("FolioMIP1"); /* Initialize a new problem in BCL */ /* Create the decision variables (including upper bounds for `frac') */ for(s=0;s<NSHARES;s++) { frac[s] = XPRBnewvar(prob, XPRB_PL, "frac", 0, 0.3); buy[s] = XPRBnewvar(prob, XPRB_BV, "buy", 0, 1); } /* 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); /* Limit the total number of assets */ Num = XPRBnewctr(prob, "Num", XPRB_L); for(s=0;s<NSHARES;s++) XPRBaddterm(Num, buy[s], 1); XPRBaddterm(Num, NULL, MAXNUM); /* Linking the variables */ for(s=0;s<NSHARES;s++) XPRBnewprec(prob, "Link", frac[s], 0, buy[s]); /* Solve the problem */ XPRBsetsense(prob, XPRB_MAXIM); XPRBmipoptimize(prob, ""); printf("Problem status: %s\n", MIPSTATUS[XPRBgetmipstat(prob)]); /* Solution printing */ printf("Total return: %g\n", XPRBgetobjval(prob)); for(s=0;s<NSHARES;s++) printf(" %d : %g%% (%g)\n", s, XPRBgetsol(frac[s])*100, XPRBgetsol(buy[s])); return 0; } | |||||||||
© Copyright 2024 Fair Isaac Corporation. |