Creating the PortfolioCVaR Object
To create a fully specified CVaR portfolio optimization problem, instantiate the
                PortfolioCVaR object using PortfolioCVaR. For information on the workflow when using
                PortfolioCVaR objects, see PortfolioCVaR Object Workflow.
Syntax
Use PortfolioCVaR to create an instance
                of an object of the PortfolioCVaR class. You can use PortfolioCVaR object in several ways.
                To set up a portfolio optimization problem in a PortfolioCVaR
                object, the simplest syntax
                is:
p = PortfolioCVaR;
PortfolioCVaR object, p, such
                that all object properties are empty. The PortfolioCVaR object also accepts
                collections of argument name-value pair arguments for properties and their values.
                The PortfolioCVaR object accepts inputs
                for public properties with the general
                syntax:
	p = PortfolioCVaR('property1', value1, 'property2', value2, ... );If a PortfolioCVaR object already exists, the syntax permits
                the first (and only the first argument) of PortfolioCVaR to be an existing
                object with subsequent argument name-value pair arguments for properties to be added
                or modified. For example, given an existing PortfolioCVaR object
                in p, the general syntax
                is:
p = PortfolioCVaR(p, 'property1', value1, 'property2', value2, ... );
Input argument names are not case-sensitive, but must be completely specified. In
                addition, several properties can be specified with alternative argument names (see
                    Shortcuts for Property Names). The PortfolioCVaR object tries to detect
                problem dimensions from the inputs and, once set, subsequent inputs can undergo
                various scalar or matrix expansion operations that simplify the overall process to
                formulate a problem. In addition, a PortfolioCVaR object is a
                value object so that, given portfolio p, the following code
                creates two objects, p and q, that are
                distinct:
q = PortfolioCVaR(p, ...)
PortfolioCVaR Problem Sufficiency
A CVaR portfolio optimization problem is completely specified with the
                    PortfolioCVaR object if the following three conditions are
                met: 
- You must specify a collection of asset returns or prices known as scenarios such that all scenarios are finite asset returns or prices. These scenarios are meant to be samples from the underlying probability distribution of asset returns. This condition can be satisfied by the - setScenariosfunction or with several canned scenario simulation functions.
- The set of feasible portfolios must be a nonempty compact set, where a compact set is closed and bounded. You can satisfy this condition using an extensive collection of properties that define different types of constraints to form a set of feasible portfolios. Since such sets must be bounded, either explicit or implicit constraints can be imposed and several tools, such as the - estimateBoundsfunction, provide ways to ensure that your problem is properly formulated.
- You must specify a probability level to locate the level of tail loss above which the conditional value-at-risk is to be minimized. This condition can be satisfied by the - setProbabilityLevelfunction.- Although the general sufficient conditions for CVaR portfolio optimization go beyond the first three conditions, the - PortfolioCVaRobject handles all these additional conditions.
PortfolioCVaR Function Examples
If you create a PortfolioCVaR object, p,
                with no input arguments, you can display it using
                disp:
p = PortfolioCVaR; disp(p)
PortfolioCVaR with properties:
                       BuyCost: []
                      SellCost: []
                  RiskFreeRate: []
              ProbabilityLevel: []
                      Turnover: []
                   BuyTurnover: []
                  SellTurnover: []
                  NumScenarios: []
                          Name: []
                     NumAssets: []
                     AssetList: []
                      InitPort: []
                   AInequality: []
                   bInequality: []
                     AEquality: []
                     bEquality: []
                    LowerBound: []
                    UpperBound: []
                   LowerBudget: []
                   UpperBudget: []
                   GroupMatrix: []
                    LowerGroup: []
                    UpperGroup: []
                        GroupA: []
                        GroupB: []
                    LowerRatio: []
                    UpperRatio: []
                  MinNumAssets: []
                  MaxNumAssets: []
    ConditionalBudgetThreshold: []
        ConditionalUpperBudget: []
                     BoundType: []The approaches listed provide a way to set up a portfolio optimization problem
                with the PortfolioCVaR object. The custom set
                functions offer additional ways to set and modify collections of properties in the
                    PortfolioCVaR object.
Using the PortfolioCVaR Function for a Single-Step Setup
You can use the PortfolioCVaR object to directly
                    set up a “standard” portfolio optimization problem. Given
                    scenarios of asset returns in the variable AssetScenarios,
                    this problem is completely specified as
                    follows:
m = [ 0.05; 0.1; 0.12; 0.18 ];
C = [ 0.0064 0.00408 0.00192 0; 
    0.00408 0.0289 0.0204 0.0119;
    0.00192 0.0204 0.0576 0.0336;
    0 0.0119 0.0336 0.1225 ];
m = m/12;
C = C/12;
AssetScenarios = mvnrnd(m, C, 20000);
p = PortfolioCVaR('Scenarios', AssetScenarios, ...
'LowerBound', 0, 'LowerBudget', 1, 'UpperBudget', 1, ...
'ProbabilityLevel', 0.95)
p = 
  PortfolioCVaR with properties:
                       BuyCost: []
                      SellCost: []
                  RiskFreeRate: []
              ProbabilityLevel: 0.9500
                      Turnover: []
                   BuyTurnover: []
                  SellTurnover: []
                  NumScenarios: 20000
                          Name: []
                     NumAssets: 4
                     AssetList: []
                      InitPort: []
                   AInequality: []
                   bInequality: []
                     AEquality: []
                     bEquality: []
                    LowerBound: [4×1 double]
                    UpperBound: []
                   LowerBudget: 1
                   UpperBudget: 1
                   GroupMatrix: []
                    LowerGroup: []
                    UpperGroup: []
                        GroupA: []
                        GroupB: []
                    LowerRatio: []
                    UpperRatio: []
                  MinNumAssets: []
                  MaxNumAssets: []
    ConditionalBudgetThreshold: []
        ConditionalUpperBudget: []
                     BoundType: []
LowerBound property value undergoes
                    scalar expansion since AssetScenarios provides the dimensions
                    of the problem.You can use dot notation with the function plotFrontier.
p.plotFrontier

Using the PortfolioCVaR Function with a Sequence of Steps
An alternative way to accomplish the same task of setting up a
                    “standard” CVaR portfolio optimization problem, given
                        AssetScenarios variable is:
m = [ 0.05; 0.1; 0.12; 0.18 ]; C = [ 0.0064 0.00408 0.00192 0; 0.00408 0.0289 0.0204 0.0119; 0.00192 0.0204 0.0576 0.0336; 0 0.0119 0.0336 0.1225 ]; m = m/12; C = C/12; AssetScenarios = mvnrnd(m, C, 20000); p = PortfolioCVaR; p = setScenarios(p, AssetScenarios); p = PortfolioCVaR(p, 'LowerBound', 0); p = PortfolioCVaR(p, 'LowerBudget', 1, 'UpperBudget', 1); p = setProbabilityLevel(p, 0.95); plotFrontier(p)

This way works because the calls to the are in this particular
                    order. In this case, the call to initialize AssetScenarios
                    provides the dimensions for the problem. If you were to do this step last, you
                    would have to explicitly dimension the LowerBound property as follows:
m = [ 0.05; 0.1; 0.12; 0.18 ]; C = [ 0.0064 0.00408 0.00192 0; 0.00408 0.0289 0.0204 0.0119; 0.00192 0.0204 0.0576 0.0336; 0 0.0119 0.0336 0.1225 ]; m = m/12; C = C/12; AssetScenarios = mvnrnd(m, C, 20000); p = PortfolioCVaR; p = PortfolioCVaR(p, 'LowerBound', zeros(size(m))); p = PortfolioCVaR(p, 'LowerBudget', 1, 'UpperBudget', 1); p = setProbabilityLevel(p, 0.95); p = setScenarios(p, AssetScenarios);
Note
If you did not specify the size of LowerBound but,
                            instead, input a scalar argument, the PortfolioCVaR object
                            assumes that you are defining a single-asset problem and produces an
                            error at the call to set asset scenarios with four assets. 
Shortcuts for Property Names
The PortfolioCVaR object has shorter
                    argument names that replace longer argument names associated with specific
                    properties of the PortfolioCVaR object. For example, rather
                    than enter 'ProbabilityLevel', the PortfolioCVaR object accepts the
                    case-insensitive name 'plevel' to set the
                        ProbabilityLevel property in a
                        PortfolioCVaR object. Every shorter argument name
                    corresponds with a single property in the PortfolioCVaR object. The one
                    exception is the alternative argument name 'budget', which
                    signifies both the LowerBudget and
                        UpperBudget properties. When 'budget'
                    is used, then the LowerBudget and
                        UpperBudget properties are set to the same value to form
                    an equality budget constraint. 
Shortcuts for Property Names
| Shortcut Argument Name | Equivalent Argument / Property Name | 
|---|---|
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
| 
 | 
 | 
For example, this call to the PortfolioCVaR object uses these
                    shortcuts for
                    properties:
m = [ 0.05; 0.1; 0.12; 0.18 ]; C = [ 0.0064 0.00408 0.00192 0; 0.00408 0.0289 0.0204 0.0119; 0.00192 0.0204 0.0576 0.0336; 0 0.0119 0.0336 0.1225 ]; m = m/12; C = C/12; AssetScenarios = mvnrnd(m, C, 20000); p = PortfolioCVaR('scenario', AssetScenarios, 'lb', 0, 'budget', 1, 'plevel', 0.95); plotFrontier(p)
Direct Setting of Portfolio Object Properties
Although not recommended, you can set properties directly using dot notation, however no error-checking is done on your inputs:
m = [ 0.05; 0.1; 0.12; 0.18 ];
C = [ 0.0064 0.00408 0.00192 0; 
    0.00408 0.0289 0.0204 0.0119;
    0.00192 0.0204 0.0576 0.0336;
    0 0.0119 0.0336 0.1225 ];
m = m/12;
C = C/12;
AssetScenarios = mvnrnd(m, C, 20000);
p = PortfolioCVaR;
p = setScenarios(p, AssetScenarios);
p.ProbabilityLevel = 0.95;
p.LowerBudget = 1;
p.UpperBudget = 1;
p.LowerBound = zeros(size(m));
plotFrontier(p)
Note
Scenarios cannot be assigned directly using dot notation to a
                                PortfolioCVaR object. Scenarios must always be
                            set through either the PortfolioCVaR object, the
                                setScenarios function,
                            or any of the scenario simulation functions.
See Also
PortfolioCVaR | estimateBounds
Topics
- Common Operations on the PortfolioCVaR Object
- Working with CVaR Portfolio Constraints Using Defaults
- Hedging Using CVaR Portfolio Optimization
- Compute Maximum Reward-to-Risk Ratio for CVaR Portfolio
- PortfolioCVaR Object
- Portfolio Optimization Theory
- PortfolioCVaR Object Workflow