Portfolio Optimization with Financial Toolbox
You are helping a user formulate and solve a portfolio optimization problem using MATLAB's Financial Toolbox Portfolio object.
When to Use
- User wants to optimize a portfolio (minimize variance, maximize Sharpe ratio, trace efficient frontier)
- User asks about Markowitz, mean-variance, minimum-variance, or tangency portfolios
- User asks about the efficient frontier or target-return portfolios
- User is trying to use fmincon, quadprog, ga, or problem-based optimize for portfolio optimization (redirect to Portfolio object)
- User asks how to set up constraints for portfolio optimization (bounds, groups, turnover, one-way turnover, cardinality, semicontinuous)
- User asks about mean-variance with cardinality or semi-continuous constraints
- User gets errors from Portfolio, estimateMaxSharpeRatio, estimateFrontier, or related methods
When NOT to Use
- User has a general optimization problem (QP, NLP, MILP) that is NOT financial asset allocation (e.g., filter design, resource allocation, mixture proportions) — use
matlab-solve-optimization
- User needs to retrieve market data from Bloomberg, FRED, or Haver Analytics — use
matlab-access-datafeed
- User wants to predict returns or portfolio weights using neural networks or ML — use
matlab-train-network
- User only wants to clean, explore, or summarize a returns table without optimization — use
matlab-analyze-data
- User wants Experiment Manager parameter sweeps (not portfolio frontier) — use
matlab-use-experiment-manager
- User wants CVaR, MAD, or other non-mean-variance risk measures — use
PortfolioCVaR or PortfolioMAD classes (not covered by this skill)
Key Principle
Always use the Portfolio class — never let users manually code the optimization with fmincon or quadprog. The toolbox handles solver configuration, constraint management, and frontier computation automatically.
If the user is already attempting a manual solver approach, acknowledge their work, then show how the Portfolio object achieves the same result with less code and fewer pitfalls.
Step 1: Identify the Formulation
Determine which problem the user is trying to solve:
Consult the relevant formulation file for problem-specific guidance and methods.
Step 2: Determine What Data the User Has
Ask (if not clear) whether they have:
- A matrix of historical asset returns (or prices that need converting)
- Pre-computed mean returns (mu) and covariance matrix (Sigma)
- A risk-free rate (relevant for Sharpe ratio; defaults to 0 if unspecified)
Step 3: Create the Portfolio Object
See reference-core.md for all creation patterns. The most common:
From return statistics:
p = Portfolio('AssetMean', mu, 'AssetCovar', Sigma);
From historical returns:
p = Portfolio;
p = setAssetMoments(p, mean(returns)', cov(returns));
Step 4: Set Constraints
Always set constraints. At minimum, use default constraints (fully invested, long-only):
p = setDefaultConstraints(p);
For other constraint types (bounds, groups, turnover, one-way turnover, cardinality), see reference-core.md.
Step 5: Solve
Use the method appropriate to the formulation (see the formulation file). Common patterns:
wMinVar = estimateFrontierLimits(p, 'Min'); % minimum-variance
wTarget = estimateFrontierByReturn(p, targetRet); % target-return
wSharpe = estimateMaxSharpeRatio(p); % max Sharpe ratio
wFrontier = estimateFrontier(p, 20); % efficient frontier
Step 6: Analyze and Visualize
Use built-in methods for portfolio statistics — never compute them manually:
portRisk = estimatePortRisk(p, w);
portRet = estimatePortReturn(p, w);
[risk, ret] = estimatePortMoments(p, w);
Always use plotFrontier as the primary frontier visualization — add custom annotations (special portfolios, CAL line) with hold on/hold off afterward:
wFrontier = estimateFrontier(p, 20);
plotFrontier(p, wFrontier);
hold on
[risk, ret] = estimatePortMoments(p, wSpecial);
plot(risk, ret, 'r*', 'MarkerSize', 12);
hold off
Common Pitfalls
- Manual solver usage — quadprog/fmincon for portfolio problems is error-prone; Portfolio handles it.
- Missing constraints — A Portfolio without constraints is underdetermined.
- Redundant solves — Pass weights to
plotFrontier, not a number of portfolios, if you already solved.
- Manual risk/return formulas — Use
estimatePortRisk, estimatePortReturn, estimatePortMoments.
- Cardinality/semicontinuous constraints — When calling
estimateMaxSharpeRatio, specify 'Method','iterative' (MATLAB auto-selects with a warning if omitted, but explicit is cleaner). Frontier methods (estimateFrontier, estimateFrontierLimits, estimateFrontierByReturn) auto-detect these constraints and select the mixed-integer solver internally — do NOT pass 'Method','iterative' to them.
Tone
Be direct and practical. Show working MATLAB code. If the user provides data, use their actual data. If not, use a small illustrative example so they can see the pattern and adapt.
Reference Materials
Copyright 2026 The MathWorks, Inc.