| |||||||||
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 folioqp.c /******************************************************** Xpress-BCL C Example Problems ============================= file folioqp.c `````````````` Modeling a small QP problem to perform portfolio optimization. -- 1. QP: minimize variance 2. MIQP: limited number of assets --- (c) 2008-2024 Fair Isaac Corporation author: S.Heipcke, Dec. 2003, rev. Mar. 2011 ********************************************************/ #include <stdio.h> #include "xprb.h" #define DATAFILE XPRBDATAPATH "/GS/foliocppqp.dat" #define TARGET 9 /* Target yield */ #define MAXNUM 4 /* Max. number of different assets */ #define NSHARES 10 /* Number of 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 NA[] = {0,1,2,3}; /* Shares issued in N.-America */ double VAR[NSHARES][NSHARES]; /* Variance/covariance matrix of estimated returns */ int main(int argc, char **argv) { int s,t; XPRBprob prob; XPRBctr Variance,Na,Return,Cap,Num; XPRBvar frac[NSHARES]; /* Fraction of capital used per share */ XPRBvar buy[NSHARES]; /* 1 if asset is in portfolio, 0 otherwise */ FILE *datafile; prob = XPRBnewprob("FolioQP"); /* Initialize a new problem in BCL */ /* Read `VAR' data from file */ datafile=fopen(DATAFILE,"r"); for(s=0;s<NSHARES;s++) XPRBreadarrlinecb(XPRB_FGETS, datafile,200,"g ",VAR[s],NSHARES); fclose(datafile); /***** First problem: unlimited number of assets *****/ /* Create the decision variables */ for(s=0;s<NSHARES;s++) frac[s] = XPRBnewvar(prob, XPRB_PL, XPRBnewname("frac(%d)",s+1), 0, 0.3); /* Objective: mean variance */ Variance = XPRBnewctr(prob, "Variance", XPRB_N); for(s=0;s<NSHARES;s++) for(t=0;t<NSHARES;t++) XPRBaddqterm(Variance, frac[s], frac[t], VAR[s][t]); XPRBsetobj(prob, Variance); /* 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); /* Target yield */ Return = XPRBnewctr(prob, "Return", XPRB_G); for(s=0;s<NSHARES;s++) XPRBaddterm(Return, frac[s], RET[s]); XPRBaddterm(Return, NULL, TARGET); /* Solve the problem */ XPRBsetsense(prob, XPRB_MINIM); XPRBlpoptimize(prob, ""); /* Solution printing */ printf("With a target of %d minimum variance is %g\n", TARGET, XPRBgetobjval(prob)); for(s=0;s<NSHARES;s++) printf(" %d : %g%%\n", s, XPRBgetsol(frac[s])*100); /***** Second problem: limit total number of assets *****/ /* Create the decision variables */ for(s=0;s<NSHARES;s++) buy[s] = XPRBnewvar(prob, XPRB_BV, XPRBnewname("buy(%d)",s+1), 0, 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 */ XPRBmipoptimize(prob, ""); /* Solution printing */ printf("With a target of %d and at most %d assets, minimum variance is %g\n", TARGET, MAXNUM, 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. |