Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

Portfolio

创建 Portfolio 对象以进行均值-方差投资组合优化和分析

说明

使用 Portfolio 函数创建一个 Portfolio 对象,用于均值-方差投资组合优化。

投资组合优化的主要工作流是创建一个 Portfolio 对象实例来完整指定一个投资组合优化问题,并使用支持的函数对 Portfolio 对象进行运算,以求取和分析有效投资组合。有关此工作流的详细信息,请参阅 Portfolio 对象工作流

您可通过几种方式使用 Portfolio 对象。要使用 Portfolio 对象创建投资组合优化问题,最简单的语法是:

p = Portfolio;
此语法可创建一个 Portfolio 对象 p,其中所有对象属性都为空。

Portfolio 对象也接受用一系列名称-值对组参数指定属性及其值。Portfolio 对象接受采用以下一般语法的输入作为属性:

	p = Portfolio('property1',value1,'property2',value2, ... );

如果已有 Portfolio 对象,则该语法允许且仅允许 Portfolio 对象的第一个参数为已有对象,后续名称-值对组参数则表示要添加或修改的属性。例如,假定已有 Portfolio 对象 p,一般语法为:

p = Portfolio(p,'property1',value1,'property2',value2, ... );

输入参数名称不区分大小写,但必须完整指定。此外,部分属性可采用简写参数名称指定(请参阅 简写属性名称)。Portfolio 对象会尝试从输入中检测问题的维度,一旦确定,则对后续输入进行各种标量或矩阵扩展运算,从而简化构建问题的整个过程。此外,Portfolio 对象是值对象,因此,假定有投资组合 p,则以下代码将创建一个不同于 p 的新对象 q

q = Portfolio(p, ...)

创建 Portfolio 对象后,您可以使用关联的对象函数来设置投资组合约束,分析有效边界并验证投资组合模型。

有关均值-方差优化理论基础的详细信息,请参阅 投资组合优化理论

创建对象

描述

示例

p = Portfolio 创建一个空的 Portfolio 对象,用于均值-方差投资组合优化和分析。然后,您可以使用支持的 "add" 和 "set" 函数将元素添加到 Portfolio 对象。有关详细信息,请参阅创建 Portfolio 对象

示例

p = Portfolio(Name,Value) 创建一个 Portfolio 对象(p)并使用名称-值对组设置属性。例如,p = Portfolio('AssetList',Assets(1:12))。您可以指定多个名称-值对组。

示例

p = Portfolio(p,Name,Value) 使用之前创建的 Portfolio 对象 p 创建一个 Portfolio 对象 (p),并使用名称-值对组设置属性。您可以指定多个名称-值对组。

输入参数

全部展开

之前构造的 Portfolio 对象,使用 Portfolio 指定。

属性

全部展开

设置 Portfolio 对象

池内资产名称或符号,指定为字符向量元胞数组或字符串数组。

数据类型: cell | string

初始投资组合,指定为向量。

数据类型: double

Portfolio 对象实例的名称,指定为字符向量或字符串。

数据类型: char | string

池内资产数量,指定为整数标量。

数据类型: double

Portfolio 对象约束

线性等式约束矩阵,指定为矩阵。有关详细信息,请参阅Linear Equality Constraints

数据类型: double

线性不等式约束矩阵,指定为矩阵。有关详细信息,请参阅Linear Inequality Constraints

数据类型: double

线性等式约束向量,指定为向量。有关详细信息,请参阅Linear Equality Constraints

数据类型: double

线性不等式约束向量,指定为向量。有关详细信息,请参阅Linear Inequality Constraints

数据类型: double

受 B 组权重限制的 A 组权重,指定为矩阵。有关详细信息,请参阅Group Constraints

数据类型: double

B 组权重,指定为矩阵。有关详细信息,请参阅Group Constraints

数据类型: double

组成员关系矩阵,指定为矩阵。有关详细信息,请参阅Group Ratio Constraints

数据类型: double

下界约束,指定为向量。有关详细信息,请参阅'Simple' Bound Constraints'Conditional' Bound Constraints

数据类型: double

下界预算约束,指定为标量。有关详细信息,请参阅Budget Constraints

数据类型: double

下界组约束,指定为向量。有关详细信息,请参阅Group Constraints

数据类型: double

GroupAGroupB 之间的最低配置比例,指定为向量。有关详细信息,请参阅Group Ratio Constraints

数据类型: double

跟踪误差约束的上界,指定为标量。有关详细信息,请参阅Tracking Error Constraints

数据类型: double

用于跟踪误差约束的跟踪投资组合,指定为向量。

数据类型: double

上界约束,指定为向量。有关详细信息,请参阅'Simple' Bound Constraints'Conditional' Bound Constraints

数据类型: double

上界预算约束,指定为标量。有关详细信息,请参阅Budget Constraints

数据类型: double

上界组约束,指定为向量。有关详细信息,请参阅Group Constraints

数据类型: double

GroupAGroupB 之间的最高配置比例,指定为向量。有关详细信息,请参阅Group Ratio Constraints

数据类型: double

每个资产权重的边界类型,指定为标量字符向量或字符串,或者字符向量元胞数组或字符串数组。有关详细信息,请参阅 setBounds

数据类型: char | cell | string

在投资组合中配置的最小资产数,指定为标量数值。有关详细信息,请参阅 setMinMaxNumAssetsCardinality Constraints

数据类型: double

在投资组合中配置的最大资产数,指定为标量数值。有关详细信息,请参阅 setMinMaxNumAssetsCardinality Constraints

数据类型: double

出售的换手率约束,指定为标量。有关详细信息,请参阅Average Turnover ConstraintsOne-Way Turnover Constraints

数据类型: double

购买的换手率约束,指定为标量。有关详细信息,请参阅Average Turnover ConstraintsOne-Way Turnover Constraints

数据类型: double

换手率约束,指定为标量。有关详细信息,请参阅Average Turnover ConstraintsOne-Way Turnover Constraints

数据类型: double

Portfolio 对象建模

资产收益的协方差,指定为方阵。如果 AssetCovar 不是对称半正定矩阵,则使用 nearcorr 为相关矩阵创建半正定矩阵。

数据类型: double

资产收益的均值,指定为向量。

数据类型: double

比例购买成本,指定为向量。有关详细信息,请参阅净投资组合收益

数据类型: double

无风险率,指定为标量。

数据类型: double

比例出售成本,指定为向量。有关详细信息,请参阅净投资组合收益

数据类型: double

对象函数

setAssetListSet up list of identifiers for assets
setInitPortSet up initial or current portfolio
setDefaultConstraints使用总和为 1 的非负权重设置投资组合约束
getAssetMoments从 Portfolio 对象获取资产收益的均值和协方差
setAssetMoments Set moments (mean and covariance) of asset returns for Portfolio object
estimateAssetMomentsEstimate mean and covariance of asset returns from data
setCostsSet up proportional transaction costs for portfolio
addEqualityAdd linear equality constraints for portfolio weights to existing constraints
addGroupRatioAdd group ratio constraints for portfolio weights to existing group ratio constraints
addGroupsAdd group constraints for portfolio weights to existing group constraints
addInequalityAdd linear inequality constraints for portfolio weights to existing constraints
getBoundsObtain bounds for portfolio weights from portfolio object
getBudgetObtain budget constraint bounds from portfolio object
getCostsObtain buy and sell transaction costs from portfolio object
getEqualityObtain equality constraint arrays from portfolio object
getGroupRatioObtain group ratio constraint arrays from portfolio object
getGroupsObtain group constraint arrays from portfolio object
getInequalityObtain inequality constraint arrays from portfolio object
getOneWayTurnoverObtain one-way turnover constraints from portfolio object
setGroupsSet up group constraints for portfolio weights
setInequalitySet up linear inequality constraints for portfolio weights
setBoundsSet up bounds for portfolio weights for portfolio
setBudgetSet up budget constraints for portfolio
setCostsSet up proportional transaction costs for portfolio
setEqualitySet up linear equality constraints for portfolio weights
setGroupRatioSet up group ratio constraints for portfolio weights
setInitPortSet up initial or current portfolio
setOneWayTurnoverSet up one-way portfolio turnover constraints
setTurnoverSet up maximum portfolio turnover constraint
setTrackingPortSet up benchmark portfolio for tracking error constraint
setTrackingErrorSet up maximum portfolio tracking error constraint
setMinMaxNumAssetsSet cardinality constraints on the number of assets invested in a portfolio
checkFeasibilityCheck feasibility of input portfolios against portfolio object
estimateBoundsEstimate global lower and upper bounds for set of portfolios
estimateFrontierEstimate specified number of optimal portfolios on the efficient frontier
estimateFrontierByReturnEstimate optimal portfolios with targeted portfolio returns
estimateFrontierByRiskEstimate optimal portfolios with targeted portfolio risks
estimateFrontierLimitsEstimate optimal portfolios at endpoints of efficient frontier
plotFrontierPlot efficient frontier
estimateMaxSharpeRatio 估计有效投资组合以最大化 Portfolio 对象的夏普比率
estimatePortMoments 估计 Portfolio 对象的投资组合收益矩
estimatePortReturnEstimate mean of portfolio returns
estimatePortRiskEstimate portfolio risk according to risk proxy associated with corresponding object
estimateCustomObjectivePortfolio Estimate optimal portfolio for user-defined objective function for Portfolio object
setSolverChoose main solver and specify associated solver options for portfolio optimization
setSolverMINLPChoose mixed integer nonlinear programming (MINLP) solver for portfolio optimization

示例

全部折叠

您可以创建一个不带输入参数的 Portfolio 对象 p,并使用 disp 显示该对象。

p = Portfolio;
disp(p);
  Portfolio with properties:

          BuyCost: []
         SellCost: []
     RiskFreeRate: []
        AssetMean: []
       AssetCovar: []
    TrackingError: []
     TrackingPort: []
         Turnover: []
      BuyTurnover: []
     SellTurnover: []
             Name: []
        NumAssets: []
        AssetList: []
         InitPort: []
      AInequality: []
      bInequality: []
        AEquality: []
        bEquality: []
       LowerBound: []
       UpperBound: []
      LowerBudget: []
      UpperBudget: []
      GroupMatrix: []
       LowerGroup: []
       UpperGroup: []
           GroupA: []
           GroupB: []
       LowerRatio: []
       UpperRatio: []
     MinNumAssets: []
     MaxNumAssets: []
        BoundType: []

借助此方法,您可以使用 Portfolio 函数创建投资组合优化问题。然后,您可以使用相关的 set 函数来设置和修改 Portfolio 对象中的一系列属性。

您可以用变量 mC 指定资产收益的均值和协方差,直接使用 Portfolio 对象来创建“标准”投资组合优化问题。

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 ];

p = Portfolio('assetmean', m, 'assetcovar', C, ...
'lowerbudget', 1, 'upperbudget', 1, 'lowerbound', 0)
p = 
  Portfolio with properties:

          BuyCost: []
         SellCost: []
     RiskFreeRate: []
        AssetMean: [4x1 double]
       AssetCovar: [4x4 double]
    TrackingError: []
     TrackingPort: []
         Turnover: []
      BuyTurnover: []
     SellTurnover: []
             Name: []
        NumAssets: 4
        AssetList: []
         InitPort: []
      AInequality: []
      bInequality: []
        AEquality: []
        bEquality: []
       LowerBound: [4x1 double]
       UpperBound: []
      LowerBudget: 1
      UpperBudget: 1
      GroupMatrix: []
       LowerGroup: []
       UpperGroup: []
           GroupA: []
           GroupB: []
       LowerRatio: []
       UpperRatio: []
     MinNumAssets: []
     MaxNumAssets: []
        BoundType: []

请注意,LowerBound 属性值进行标量扩展,因为 AssetMeanAssetCovar 提供问题的维度。

您也可以用变量 mC 指定资产收益的均值和协方差(这也表明参数名称不区分大小写),采用多步设置来创建同样的“标准”投资组合优化问题。

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 ];

p = Portfolio;
p = Portfolio(p, 'assetmean', m, 'assetcovar', C);
p = Portfolio(p, 'lowerbudget', 1, 'upperbudget', 1);
p = Portfolio(p, 'lowerbound', 0);
 
plotFrontier(p);

Figure contains an axes object. The axes object with title E f f i c i e n t blank F r o n t i e r contains an object of type line.

这种方法之所以有效,是因为对 Portfolio 的调用是按此特定顺序进行的。在本例中,初始化 AssetMeanAssetCovar 的那次调用确定了问题的维度。如果您最后执行这次调用,则必须显式设置 LowerBound 属性的维度,如下所示:

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 ];

p = Portfolio;
p = Portfolio(p, 'LowerBound', zeros(size(m)));
p = Portfolio(p, 'LowerBudget', 1, 'UpperBudget', 1);
p = Portfolio(p, 'AssetMean', m, 'AssetCovar', C);
 
plotFrontier(p);

Figure contains an axes object. The axes object with title E f f i c i e n t blank F r o n t i e r contains an object of type line.

如果未指定 LowerBound 的大小,而是输入标量参数,则 Portfolio 对象假设您正在定义单资产问题,并在设置包含四个资产的资产矩的调用中产生错误。

使用 Portfolio 创建 Portfolio 对象 p 时,您可以使用简写属性名称。

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 ];

p = Portfolio('mean', m, 'covar', C, 'budget', 1, 'lb', 0)
p = 
  Portfolio with properties:

          BuyCost: []
         SellCost: []
     RiskFreeRate: []
        AssetMean: [4x1 double]
       AssetCovar: [4x4 double]
    TrackingError: []
     TrackingPort: []
         Turnover: []
      BuyTurnover: []
     SellTurnover: []
             Name: []
        NumAssets: 4
        AssetList: []
         InitPort: []
      AInequality: []
      bInequality: []
        AEquality: []
        bEquality: []
       LowerBound: [4x1 double]
       UpperBound: []
      LowerBudget: 1
      UpperBudget: 1
      GroupMatrix: []
       LowerGroup: []
       UpperGroup: []
           GroupA: []
           GroupB: []
       LowerRatio: []
       UpperRatio: []
     MinNumAssets: []
     MaxNumAssets: []
        BoundType: []

虽然不推荐,但您可以直接设置属性,然而系统不会对输入进行错误检查。

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 ];

p = Portfolio;
p.NumAssets = numel(m);
p.AssetMean = m;
p.AssetCovar = C;
p.LowerBudget = 1;
p.UpperBudget = 1;
p.LowerBound = zeros(size(m));
disp(p)
  Portfolio with properties:

          BuyCost: []
         SellCost: []
     RiskFreeRate: []
        AssetMean: [4x1 double]
       AssetCovar: [4x4 double]
    TrackingError: []
     TrackingPort: []
         Turnover: []
      BuyTurnover: []
     SellTurnover: []
             Name: []
        NumAssets: 4
        AssetList: []
         InitPort: []
      AInequality: []
      bInequality: []
        AEquality: []
        bEquality: []
       LowerBound: [4x1 double]
       UpperBound: []
      LowerBudget: 1
      UpperBudget: 1
      GroupMatrix: []
       LowerGroup: []
       UpperGroup: []
           GroupA: []
           GroupB: []
       LowerRatio: []
       UpperRatio: []
     MinNumAssets: []
     MaxNumAssets: []
        BoundType: []

创建有效投资组合:

load CAPMuniverse

p = Portfolio('AssetList',Assets(1:12));
p = estimateAssetMoments(p, Data(:,1:12),'missingdata',true);
p = setDefaultConstraints(p);
plotFrontier(p);

Figure contains an axes object. The axes object with title E f f i c i e n t blank F r o n t i e r contains an object of type line.

pwgt = estimateFrontier(p, 5);

pnames = cell(1,5);
for i = 1:5
	pnames{i} = sprintf('Port%d',i);
end

Blotter = dataset([{pwgt},pnames],'obsnames',p.AssetList);

disp(Blotter);
            Port1        Port2       Port3       Port4      Port5
    AAPL     0.017926    0.058247    0.097816    0.12955    0    
    AMZN            0           0           0          0    0    
    CSCO            0           0           0          0    0    
    DELL    0.0041906           0           0          0    0    
    EBAY            0           0           0          0    0    
    GOOG      0.16144     0.35678     0.55228    0.75116    1    
    HPQ      0.052566    0.032302    0.011186          0    0    
    IBM       0.46422     0.36045     0.25577    0.11928    0    
    INTC            0           0           0          0    0    
    MSFT      0.29966     0.19222    0.082949          0    0    
    ORCL            0           0           0          0    0    
    YHOO            0           0           0          0    0    

详细信息

全部展开

参考

[1] For a complete list of references for the Portfolio object, see Portfolio Optimization.

版本历史记录

在 R2011a 中推出