portopt Migration to Portfolio Object
Migrate portopt Without Output Arguments
This example shows how to migrate portopt without
output arguments to a Portfolio object.
The basic portopt functionality is
represented as:
ExpReturn = [ 0.0054; 0.0531; 0.0779; 0.0934; 0.0130 ]; ExpCovariance = [ 0.0569, 0.0092, 0.0039, 0.0070, 0.0022; 0.0092, 0.0380, 0.0035, 0.0197, 0.0028; 0.0039, 0.0035, 0.0997, 0.0100, 0.0070; 0.0070, 0.0197, 0.0100, 0.0461, 0.0050; 0.0022, 0.0028, 0.0070, 0.0050, 0.0573 ]; NumPorts = 10; portopt(ExpReturn, ExpCovariance, NumPorts);

To migrate a portopt syntax without
output arguments to a Portfolio object:
ExpReturn = [ 0.0054; 0.0531; 0.0779; 0.0934; 0.0130 ]; ExpCovariance = [ 0.0569, 0.0092, 0.0039, 0.0070, 0.0022; 0.0092, 0.0380, 0.0035, 0.0197, 0.0028; 0.0039, 0.0035, 0.0997, 0.0100, 0.0070; 0.0070, 0.0197, 0.0100, 0.0461, 0.0050; 0.0022, 0.0028, 0.0070, 0.0050, 0.0573 ]; NumPorts = 10; p = Portfolio; p = setAssetMoments(p, ExpReturn, ExpCovariance); p = setDefaultConstraints(p); plotFrontier(p, NumPorts);

Without output arguments, portopt plots the
efficient frontier. The Portfolio object has similar behavior although
the Portfolio object writes to the current figure window rather than
create a new window each time a plot is generated.
Migrate portopt with Output Arguments
This example shows how to migrate portopt with
output arguments to a Portfolio object.
With output arguments, the basic functionality of portopt returns
portfolio moments and weights. Once the Portfolio object is set up,
moments and weights are obtained in separate steps.
ExpReturn = [ 0.0054; 0.0531; 0.0779; 0.0934; 0.0130 ]; ExpCovariance = [ 0.0569, 0.0092, 0.0039, 0.0070, 0.0022; 0.0092, 0.0380, 0.0035, 0.0197, 0.0028; 0.0039, 0.0035, 0.0997, 0.0100, 0.0070; 0.0070, 0.0197, 0.0100, 0.0461, 0.0050; 0.0022, 0.0028, 0.0070, 0.0050, 0.0573 ]; NumPorts = 10; [PortRisk, PortReturn, PortWts] = portopt(ExpReturn, ExpCovariance, NumPorts); display(PortWts);
PortWts =
0.2103 0.2746 0.1157 0.1594 0.2400
0.1744 0.2657 0.1296 0.2193 0.2110
0.1386 0.2567 0.1436 0.2791 0.1821
0.1027 0.2477 0.1575 0.3390 0.1532
0.0668 0.2387 0.1714 0.3988 0.1242
0.0309 0.2298 0.1854 0.4587 0.0953
0 0.2168 0.1993 0.5209 0.0629
0 0.1791 0.2133 0.5985 0.0091
0 0.0557 0.2183 0.7260 0
0 0 0 1.0000 0To migrate a portopt syntax with output
arguments:
ExpReturn = [ 0.0054; 0.0531; 0.0779; 0.0934; 0.0130 ]; ExpCovariance = [ 0.0569, 0.0092, 0.0039, 0.0070, 0.0022; 0.0092, 0.0380, 0.0035, 0.0197, 0.0028; 0.0039, 0.0035, 0.0997, 0.0100, 0.0070; 0.0070, 0.0197, 0.0100, 0.0461, 0.0050; 0.0022, 0.0028, 0.0070, 0.0050, 0.0573 ]; NumPorts = 10; p = Portfolio; p = setAssetMoments(p, ExpReturn, ExpCovariance); p = setDefaultConstraints(p); PortWts = estimateFrontier(p, NumPorts); [PortRisk, PortReturn] = estimatePortMoments(p, PortWts); display(PortWts);
PortWts =
0.2103 0.1744 0.1386 0.1027 0.0668 0.0309 0 0 0 0
0.2746 0.2657 0.2567 0.2477 0.2387 0.2298 0.2168 0.1791 0.0557 0
0.1157 0.1296 0.1436 0.1575 0.1714 0.1854 0.1993 0.2133 0.2183 0
0.1594 0.2193 0.2791 0.3390 0.3988 0.4587 0.5209 0.5985 0.7260 1.0000
0.2400 0.2110 0.1821 0.1532 0.1242 0.0953 0.0629 0.0091 0 0The Portfolio object returns PortWts with
portfolios going down columns, not across rows. Portfolio risks and
returns are still in column format.
Migrate portopt for Target Returns Within Range of Efficient Portfolio Returns
This example shows how to migrate portopt target
returns within range of efficient portfolio returns to a Portfolio
object.
portopt can obtain portfolios with
specific targeted levels of return but requires that the targeted
returns fall within the range of efficient returns. The Portfolio
object handles this by selecting portfolios at the ends of the efficient
frontier.
ExpReturn = [ 0.0054; 0.0531; 0.0779; 0.0934; 0.0130 ];
ExpCovariance = [ 0.0569, 0.0092, 0.0039, 0.0070, 0.0022;
0.0092, 0.0380, 0.0035, 0.0197, 0.0028;
0.0039, 0.0035, 0.0997, 0.0100, 0.0070;
0.0070, 0.0197, 0.0100, 0.0461, 0.0050;
0.0022, 0.0028, 0.0070, 0.0050, 0.0573 ];
NumPorts = 10;
TargetReturn = [ 0.05; 0.06; 0.07; 0.08; 0.09 ];
[PortRisk, PortReturn, PortWts] = portopt(ExpReturn, ExpCovariance, [], TargetReturn);
disp(' Efficient Target');
disp([PortReturn, TargetReturn]); Efficient Target
0.0500 0.0500
0.0600 0.0600
0.0700 0.0700
0.0800 0.0800
0.0900 0.0900To migrate a portopt syntax for target
returns within range of efficient portfolio returns to a Portfolio
object:
ExpReturn = [ 0.0054; 0.0531; 0.0779; 0.0934; 0.0130 ];
ExpCovariance = [ 0.0569, 0.0092, 0.0039, 0.0070, 0.0022;
0.0092, 0.0380, 0.0035, 0.0197, 0.0028;
0.0039, 0.0035, 0.0997, 0.0100, 0.0070;
0.0070, 0.0197, 0.0100, 0.0461, 0.0050;
0.0022, 0.0028, 0.0070, 0.0050, 0.0573 ];
NumPorts = 10;
TargetReturn = [ 0.05; 0.06; 0.07; 0.08; 0.09 ];
p = Portfolio;
p = setAssetMoments(p, ExpReturn, ExpCovariance);
p = setDefaultConstraints(p);
PortWts = estimateFrontierByReturn(p, TargetReturn);
[PortRisk, PortReturn] = estimatePortMoments(p, PortWts);
disp(' Efficient Target');
disp([PortReturn, TargetReturn]); Efficient Target
0.0500 0.0500
0.0600 0.0600
0.0700 0.0700
0.0800 0.0800
0.0900 0.0900Migrate portopt for Target Return Outside Range of Efficient Portfolio Returns
This example shows how to migrate portopt target
returns outside of range of efficient portfolio returns to a Portfolio
object.
When the target return is outside of the range of efficient
portfolio returns, portopt generates an error.
The Portfolio object handles this effectively by selecting portfolios
at the ends of the efficient frontier.
ExpReturn = [ 0.0054; 0.0531; 0.0779; 0.0934; 0.0130 ];
ExpCovariance = [ 0.0569, 0.0092, 0.0039, 0.0070, 0.0022;
0.0092, 0.0380, 0.0035, 0.0197, 0.0028;
0.0039, 0.0035, 0.0997, 0.0100, 0.0070;
0.0070, 0.0197, 0.0100, 0.0461, 0.0050;
0.0022, 0.0028, 0.0070, 0.0050, 0.0573 ];
NumPorts = 10;
TargetReturn = [ 0.05; 0.06; 0.07; 0.08; 0.09; 0.10 ];
[PortRisk, PortReturn, PortWts] = portopt(ExpReturn, ExpCovariance, [], TargetReturn);
disp(' Efficient Target');
disp([PortReturn, TargetReturn]);> In portopt at 85 Error using portopt (line 297) One or more requested returns are greater than the maximum achievable return of 0.093400.
To migrate a portopt syntax for target
returns outside of the range of efficient portfolio returns to a Portfolio
object:
ExpReturn = [ 0.0054; 0.0531; 0.0779; 0.0934; 0.0130 ];
ExpCovariance = [ 0.0569, 0.0092, 0.0039, 0.0070, 0.0022;
0.0092, 0.0380, 0.0035, 0.0197, 0.0028;
0.0039, 0.0035, 0.0997, 0.0100, 0.0070;
0.0070, 0.0197, 0.0100, 0.0461, 0.0050;
0.0022, 0.0028, 0.0070, 0.0050, 0.0573 ];
NumPorts = 10;
TargetReturn = [ 0.05; 0.06; 0.07; 0.08; 0.09; 0.10 ];
p = Portfolio;
p = setAssetMoments(p, ExpReturn, ExpCovariance);
p = setDefaultConstraints(p);
PortWts = estimateFrontierByReturn(p, TargetReturn);
[PortRisk, PortReturn] = estimatePortMoments(p, PortWts);
disp(' Efficient Target');
disp([PortReturn, TargetReturn]);Warning: One or more target return values are outside the feasible range [
0.0427391, 0.0934 ].
Will return portfolios associated with endpoints of the range for these
values.
> In Portfolio/estimateFrontierByReturn (line 106)
Efficient Target
0.0500 0.0500
0.0600 0.0600
0.0700 0.0700
0.0800 0.0800
0.0900 0.0900
0.0934 0.1000Migrate portopt Using portcons Output for ConSet
This example shows how to migrate portopt when
the ConSet output from portcons is
used with portopt.
portopt accepts as input the outputs
from portcons, pcalims, pcglims,
and pcgcomp. This example focuses on portcons. portcons sets
up linear constraints for portopt in the form A*Port
<= b. In a matrix ConSet = [ A, b ] and
break into separate A and b arrays
with A = ConSet(:,1:end-1); and b = ConSet(:,end);.
In addition, to illustrate default problem with additional group constraints,
consider three groups. Assets 2, 3, and 4 can constitute up to 80%
of portfolio, Assets 1 and 2 can constitute up to 70% of portfolio,
and Assets 3, 4, and 5 can constitute up to 90% of portfolio.
ExpReturn = [ 0.0054; 0.0531; 0.0779; 0.0934; 0.0130 ]; ExpCovariance = [ 0.0569, 0.0092, 0.0039, 0.0070, 0.0022; 0.0092, 0.0380, 0.0035, 0.0197, 0.0028; 0.0039, 0.0035, 0.0997, 0.0100, 0.0070; 0.0070, 0.0197, 0.0100, 0.0461, 0.0050; 0.0022, 0.0028, 0.0070, 0.0050, 0.0573 ]; NumPorts = 10; Groups = [ 0 1 1 1 0; 1 1 0 0 0; 0 0 1 1 1 ]; GroupBounds = [ 0, 0.8; 0, 0.7; 0, 0.9 ]; LowerGroup = GroupBounds(:,1); UpperGroup = GroupBounds(:,2); ConSet = portcons('default', 5, 'grouplims', Groups, LowerGroup, UpperGroup); [PortRisk, PortReturn, PortWts] = portopt(ExpReturn, ExpCovariance, NumPorts, [], ConSet); disp([PortRisk, PortReturn]);
Error using portopt (line 83) In the current and future releases, portopt will no longer accept ConSet or varargin arguments. 'It will only solve the portfolio problem for long-only fully-invested portfolios. To solve more general problems, use the Portfolio object. See the release notes for details, including examples to make the conversion.
To migrate portopt to a Portfolio object
when the ConSet output from portcons is
used with portopt:
ExpReturn = [ 0.0054; 0.0531; 0.0779; 0.0934; 0.0130 ]; ExpCovariance = [ 0.0569, 0.0092, 0.0039, 0.0070, 0.0022; 0.0092, 0.0380, 0.0035, 0.0197, 0.0028; 0.0039, 0.0035, 0.0997, 0.0100, 0.0070; 0.0070, 0.0197, 0.0100, 0.0461, 0.0050; 0.0022, 0.0028, 0.0070, 0.0050, 0.0573 ]; NumPorts = 10; Groups = [ 0 1 1 1 0; 1 1 0 0 0; 0 0 1 1 1 ]; GroupBounds = [ 0, 0.8; 0, 0.7; 0, 0.9 ]; LowerGroup = GroupBounds(:,1); UpperGroup = GroupBounds(:,2); ConSet = portcons('default', 5, 'grouplims', Groups, LowerGroup, UpperGroup); A = ConSet(:,1:end-1); b = ConSet(:,end); p = Portfolio; p = setAssetMoments(p, ExpReturn, ExpCovariance); p = setInequality(p, A, b); % implement group constraints here PortWts = estimateFrontier(p, NumPorts); [PortRisk, PortReturn] = estimatePortMoments(p, PortWts); disp([PortRisk, PortReturn]);
0.1288 0.0427 0.1292 0.0465 0.1306 0.0503 0.1328 0.0540 0.1358 0.0578 0.1395 0.0615 0.1440 0.0653 0.1504 0.0690 0.1590 0.0728 0.1806 0.0766
The constraints are entered directly into the Portfolio object
with the setInequality or addInequality functions.
Integrate Output from portcons, pcalims, pcglims, and pcgcomp with a Portfolio Object
This example shows how to integrate output
from pcalims, pcalims, pcglims,
or pcgcomp with a Portfolio object implementation.
portcons, pcalims, pcglims,
and pcgcomp setup linear constraints for portopt in
the form A*Port <= b. Although some functions
permit two outputs, assume that the output is a single matrix ConSet.
Break into separate A and b arrays
with:
A = ConSet(:,1:end-1);b = ConSet(:,end);
In addition, to illustrate default problem with additional group constraints, consider three groups:
Assets 2, 3, and 4 can constitute up to 80% of portfolio.
Assets 1 and 2 can constitute up to 70% of portfolio.
Assets 3, 4, and 5 can constitute up to 90% of portfolio.
Groups = [ 0 1 1 1 0; 1 1 0 0 0; 0 0 1 1 1 ]; GroupBounds = [ 0, 0.8; 0, 0.7; 0, 0.9 ];
To integrate the ConSet output of portcons with
a Portfolio object implementation:
ExpReturn = [ 0.0054; 0.0531; 0.0779; 0.0934; 0.0130 ]; ExpCovariance = [ 0.0569, 0.0092, 0.0039, 0.0070, 0.0022; 0.0092, 0.0380, 0.0035, 0.0197, 0.0028; 0.0039, 0.0035, 0.0997, 0.0100, 0.0070; 0.0070, 0.0197, 0.0100, 0.0461, 0.0050; 0.0022, 0.0028, 0.0070, 0.0050, 0.0573 ]; NumPorts = 10; Groups = [ 0 1 1 1 0; 1 1 0 0 0; 0 0 1 1 1 ]; GroupBounds = [ 0, 0.8; 0, 0.7; 0, 0.9 ]; LowerGroup = GroupBounds(:,1); UpperGroup = GroupBounds(:,2); ConSet = portcons('default', 5, 'grouplims', Groups, LowerGroup, UpperGroup); A = ConSet(:,1:end-1); b = ConSet(:,end); p = Portfolio; p = setAssetMoments(p, ExpReturn, ExpCovariance); p = setDefaultConstraints(p); % implement default constraints here p = setInequality(p, A, b); % implement group constraints here PortWts = estimateFrontier(p, NumPorts); [PortRisk, PortReturn] = estimatePortMoments(p, PortWts); disp([PortRisk, PortReturn]);
0.1288 0.0427
0.1292 0.0465
0.1306 0.0503
0.1328 0.0540
0.1358 0.0578
0.1395 0.0615
0.1440 0.0653
0.1504 0.0690
0.1590 0.0728
0.1806 0.0766To integrate the output of pcalims and pcglims with
a Portfolio object implementation:
ExpReturn = [ 0.0054; 0.0531; 0.0779; 0.0934; 0.0130 ]; ExpCovariance = [ 0.0569, 0.0092, 0.0039, 0.0070, 0.0022; 0.0092, 0.0380, 0.0035, 0.0197, 0.0028; 0.0039, 0.0035, 0.0997, 0.0100, 0.0070; 0.0070, 0.0197, 0.0100, 0.0461, 0.0050; 0.0022, 0.0028, 0.0070, 0.0050, 0.0573 ]; NumPorts = 10; Groups = [ 0 1 1 1 0; 1 1 0 0 0; 0 0 1 1 1 ]; GroupBounds = [ 0, 0.8; 0, 0.7; 0, 0.9 ]; LowerGroup = GroupBounds(:,1); UpperGroup = GroupBounds(:,2); AssetMin = [ 0; 0; 0; 0; 0 ]; AssetMax = [ 0.8; 0.8; 0.8; 0.8; 0.8 ]; [Aa, ba] = pcalims(AssetMin, AssetMax); [Ag, bg] = pcglims(Groups, LowerGroup, UpperGroup); p = Portfolio; p = setAssetMoments(p, ExpReturn, ExpCovariance); p = setDefaultConstraints(p); % implement default constraints first p = addInequality(p, Aa, ba); % implement bound constraints here p = addInequality(p, Ag, bg); % implement group constraints here PortWts = estimateFrontier(p, NumPorts); [PortRisk, PortReturn] = estimatePortMoments(p, PortWts); disp([PortRisk, PortReturn]);
0.1288 0.0427 0.1292 0.0465 0.1306 0.0503 0.1328 0.0540 0.1358 0.0578 0.1395 0.0615 0.1440 0.0653 0.1504 0.0690 0.1590 0.0728 0.1806 0.0766
See Also
Portfolio | portopt | portcons | pcalims | pcglims | pcgcomp | estimatePortMoments | setInequality | setDefaultConstraints | addInequality | setAssetMoments | estimateFrontier | estimateFrontierByReturn