| |||||||||
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 folioqc.c /******************************************************** Xpress-BCL C Example Problems ============================= file folioqc.c `````````````` Modeling a small QCQP problem to perform portfolio optimization. -- Maximize return with limit on variance --- (c) 2008-2024 Fair Isaac Corporation author: S.Heipcke, July 2008, rev. Mar. 2011 ********************************************************/ #include <stdio.h> #include "xprb.h" #define DATAFILE XPRBDATAPATH "/GS/foliocppqp.dat" #define MAXVAR 0.55 /* Max. allowed variance */ #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; XPRBvar frac[NSHARES]; /* Fraction of capital used per share */ 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); /* 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: total return */ Return = XPRBnewctr(prob, "Return", XPRB_N); for(s=0;s<NSHARES;s++) XPRBaddterm(Return, frac[s], RET[s]); XPRBsetobj(prob, Return); /* 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 variance */ Variance = XPRBnewctr(prob, "Variance", XPRB_L); for(s=0;s<NSHARES;s++) for(t=0;t<NSHARES;t++) XPRBaddqterm(Variance, frac[s], frac[t], VAR[s][t]); XPRBaddterm(Variance, NULL, MAXVAR); /* Solve the problem */ XPRBsetsense(prob, XPRB_MAXIM); XPRBlpoptimize(prob, ""); /* Solution printing */ printf("With a max. variance of %g total return is %g\n", MAXVAR, XPRBgetobjval(prob)); for(s=0;s<NSHARES;s++) printf(" %d : %g%%\n", s, XPRBgetsol(frac[s])*100); return 0; } | |||||||||
© Copyright 2024 Fair Isaac Corporation. |