| |||||||||
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 foliodata.c /******************************************************** Xpress-BCL C Example Problems ============================= file foliodata.c ```````````````` Modeling a small LP problem to perform portfolio optimization. -- Data input from file -- (c) 2008-2024 Fair Isaac Corporation author: S.Heipcke, Dec. 2003, rev. Mar. 2011 ********************************************************/ #include <stdio.h> #include "xprb.h" #define DATAFILE XPRBDATAPATH "/GS/foliocpplp.dat" #define NSHARES 10 /* Number of shares */ #define NRISK 5 /* Number of high-risk shares */ #define NNA 4 /* Number of North-American shares */ double RET[NSHARES]; /* Estimated return in investment */ char RISK[][100] = {"hardware", "theater", "telecom", "software", "electronics"}; /* High-risk values among shares */ char NA[][100] = {"treasury", "hardware", "theater", "telecom"}; /* Shares issued in N.-America */ XPRBidxset SHARES; /* Set of shares */ XPRBprob prob; void readData(void) { double value; int s; FILE *datafile; char name[100]; /* Create the `SHARES' index set */ SHARES = XPRBnewidxset(prob, "Shares", NSHARES); /* Read `RET' data from file */ datafile = fopen(DATAFILE,"r"); for(s=0;s<NSHARES;s++) { XPRBreadlinecb(XPRB_FGETS, datafile, 200, "T g", name, &value); RET[XPRBaddidxel(SHARES, name)] = value; } fclose(datafile); XPRBprintidxset(SHARES); /* Print out the set contents */ } int main(int argc, char **argv) { int s; XPRBctr Risk,Na,Return,Cap; XPRBvar frac[NSHARES]; /* Fraction of capital used per share */ prob = XPRBnewprob("FolioLP"); /* Initialize a new problem in BCL */ /* Read data from file */ readData(); /* Create the decision variables */ for(s=0;s<NSHARES;s++) frac[s] = XPRBnewvar(prob, XPRB_PL, "frac", 0, XPRB_INFINITY); /* 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[XPRBgetidxel(SHARES,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[XPRBgetidxel(SHARES,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); /* Solve the problem */ XPRBsetsense(prob, XPRB_MAXIM); XPRBlpoptimize(prob, ""); /* Solution printing */ printf("Total return: %g\n", XPRBgetobjval(prob)); for(s=0;s<NSHARES;s++) printf(" %s : %g%%\n", XPRBgetidxelname(SHARES,s), XPRBgetsol(frac[s])*100); return 0; } | |||||||||
© Copyright 2024 Fair Isaac Corporation. |