| |||||||||
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. FolioMip2.java // (c) 2023-2024 Fair Isaac Corporation import static com.dashoptimization.objects.Utils.scalarProduct; import static com.dashoptimization.objects.Utils.sum; import static java.util.stream.IntStream.range; import com.dashoptimization.ColumnType; import com.dashoptimization.DefaultMessageListener; import com.dashoptimization.XPRSenumerations; import com.dashoptimization.objects.Variable; import com.dashoptimization.objects.XpressProblem; /** * Modeling a small LP problem to perform portfolio optimization. -- Imposing a * minimum investment per share -- */ public class FolioMip2 { /* Number of shares */ private static final int NSHARES = 10; /* Number of high-risk shares */ private static final int NRISK = 5; /* Number of North-American shares */ private static final int NNA = 4; /* Estimated return in investment */ private static final double[] RET = new double[] { 5, 17, 26, 12, 8, 9, 7, 6, 31, 21 }; /* High-risk values among shares */ private static final int[] RISK = new int[] { 1, 2, 3, 8, 9 }; /* Shares issued in N.-America */ private static final int[] NA = new int[] { 0, 1, 2, 3 }; private static void printProblemStatus(XpressProblem prob) { System.out.println(String.format("Problem status:%n\tSolve status: %s%n\tSol status: %s", prob.attributes().getSolveStatus(), prob.attributes().getSolStatus())); } public static void main(String[] args) { try (XpressProblem prob = new XpressProblem()) { // Output all messages. prob.callbacks.addMessageCallback(DefaultMessageListener::console); /**** VARIABLES ****/ Variable[] frac = prob.addVariables(NSHARES) /* Fraction of capital used per share */ .withName(i -> String.format("frac_%d", i)).withType(ColumnType.SemiContinuous) /* Upper bounds on the investment per share */ .withUB(0.3) /* Investment limit */ .withLimit(0.1).toArray(); /**** CONSTRAINTS ****/ /* Limit the percentage of high-risk values */ prob.addConstraint(sum(NRISK, i -> frac[RISK[i]]).leq(1.0 / 3.0).setName("Risk")); /* Minimum amount of North-American values */ prob.addConstraint(sum(NNA, i -> frac[NA[i]]).geq(0.5).setName("NA")); /* Spend all the capital */ prob.addConstraint(sum(frac).eq(1.0).setName("Cap")); /* Objective: maximize total return */ prob.setObjective(scalarProduct(frac, RET), XPRSenumerations.ObjSense.MAXIMIZE); /* Solve */ prob.optimize(); /* Solution printing */ printProblemStatus(prob); System.out.println("Total return: " + prob.attributes().getObjVal()); double[] sol = prob.getSolution(); range(0, NSHARES).forEach(i -> System.out .println(String.format("%s : %.2f%s", frac[i].getName(), 100.0 * frac[i].getValue(sol), "%"))); } } } | |||||||||
© Copyright 2024 Fair Isaac Corporation. |