Main Content

plotFrontier

绘制有效边界

说明

示例

[prsk,pret] = plotFrontier(obj) 针对 PortfolioPortfolioCVaRPortfolioMAD 对象使用默认的 10 个投资组合估计有效边界,并绘制相应的有效边界。有关使用这些不同对象时各自工作流的详细信息,请参阅 Portfolio 对象工作流PortfolioCVaR 对象工作流PortfolioMAD 对象工作流

示例

[prsk,pret] = plotFrontier(obj,NumPortfolios) 使用指定数量的投资组合 (NumPortfolios) 估计有效边界,并绘制相应的有效边界。

示例

[prsk,pret] = plotFrontier(obj,PortfolioWeights) 使用 PortfolioWeights 估计有效投资组合的风险和收益,并使用这些投资组合绘制有效边界。此语法假设您提供有效的有效投资组合权重作为输入。PortWeights 是一个 NumAssets×NumPortfolios 矩阵。

示例

[prsk,pret] = plotFrontier(obj,PortfolioRisks,PortfolioReturns) 使用给定的风险和收益绘制有效边界。此语法假设您为有效投资组合风险和收益提供了有效的输入。PortfolioRisksPortfolioReturns 是大小相同的向量。

注意

plotFrontier 可处理上述多种输入格式。请记住,对于给定包含 NumAssets 个资产的资产池和包含 NumPortfolios 个投资组合的有效边界,投资组合权重是 NumAsset×NumPortfolios 矩阵,投资组合风险和收益是 NumPortfolios×1 列向量。

示例

[prsk,pret] = plotFrontier(ax,obj,___) 在目标坐标区 (ax) 中显示有效边界。在上述任一语法中,都可以将坐标区指定为可选的第一个输入参量。

示例

[prsk,pret] = plotFrontier(obj,___,Name=Value) 使用名称-值参量 Parent 指定用来显示有效边界的坐标区。

示例

[prsk,pret,h] = plotFrontier(___) 绘制有效边界,并额外返回一个图形对象或图形对象的数组 (h)。在创建有效边界后,可以使用 h 来修改有效边界的属性。

示例

全部折叠

给定一个投资组合 p,绘制有效边界。

load CAPMuniverse

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

给定一个投资组合 p,绘制有效边界并用 Parent 名称-值参量指定一个 axes 对象。

% Define the Portfolio object.
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);
p = setDefaultConstraints(p);

使用 Parent 名称-值参量在左侧 y 轴上绘制 Portfolio 对象的 20 个有效投资组合。

fig = figure;
ax = newplot(fig);
yyaxis(ax,'left')
[~,~,h1] = plotFrontier(p,20,Parent=ax);

使用 Parent 名称-值参量在右侧 y 轴上绘制关联的 PortfolioCVaR 对象的 20 个有效投资组合。

% Create PortfolioCVaR object
AssetScenarios = mvnrnd(m,C,1000);
pCVaR = PortfolioCVaR(Scenarios=AssetScenarios,ProbabilityLevel=0.95);
pCVaR = setDefaultConstraints(pCVaR);

% Plot
yyaxis(ax,'right')
[~,~,h2] = plotFrontier(pCVaR,20,Parent=ax);
h2.Color = 'r';
h2.LineStyle = ':';
xlabel(ax,'Portfolio Returns Risk')
legend('Standard Deviation','CVaR')

给定一个投资组合 p,绘制有效边界并使用可选的第一个输入参量指定 axes 对象。

% Define the Portfolio object.
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);
p = p.setDefaultConstraints;

% Add an initial portfolio to a copy of the Portfolio object.
pInit = p;
pInit.InitPort = 1/4*ones(4,1);

使用不同的坐标区绘制两个 Portfolio 对象的有效边界。

figure
ax1 = axes('Position',[0.1 0.1 0.7 0.7]);
ax2 = axes('Position',[0.65 0.65 0.28 0.28]);

ax2 中为没有初始投资组合的 Portfolio 对象 (p) 绘制有效边界。

[~,~,h] = plotFrontier(ax2,p)
h = 
  Line (Efficient Frontier) with properties:

              Color: [0 0 1]
          LineStyle: '-'
          LineWidth: 2
             Marker: 'none'
         MarkerSize: 6
    MarkerFaceColor: 'none'
              XData: [0.0769 0.0831 0.0994 0.1217 0.1474 0.1750 0.2068 0.2487 0.2968 0.3500]
              YData: [0.0590 0.0725 0.0859 0.0994 0.1128 0.1262 0.1397 0.1531 0.1666 0.1800]

  Use GET to show all properties

ax1 中为有初始投资组合的 Portfolio 对象 (pInit) 绘制有效边界。

[~,~,hInit] = plotFrontier(ax1,pInit)
hInit = 
  2x1 graphics array:

  Scatter    (Initial Portfolio)
  Line       (Efficient Frontier)

修改绘图属性。

h.LineStyle = '--';
hInit(1).MarkerFaceColor = 'r';

根据 CAPMuniverse.mat 为 12 支股票创建一个 Portfolio 对象。

load CAPMuniverse
p0 = Portfolio('AssetList',Assets(1:12));
p0 = estimateAssetMoments(p0, Data(:,1:12),'missingdata',true);
p0 = setDefaultConstraints(p0);

使用 setMinMaxNumAssets 定义最多 3 项资产。

pWithMaxNumAssets = setMinMaxNumAssets(p0, [], 3);

使用 setBounds 定义下限、上限和为 'Conditional'BoundType

pWithConditionalBound = setBounds(p0, 0.1, 0.5,'BoundType', 'Conditional');

使用 plotFrontier 比较不同的投资组合对象。

figure;
plotFrontier(p0); hold on; 
plotFrontier(pWithMaxNumAssets); hold on; 
plotFrontier(pWithConditionalBound); hold off;
legend('p0', 'with Max 3 assets invested', ' with each asset weight 0 or [0.1, 0.5]', 'location', 'best');

定义目标收益并使用 estimateFrontierByReturn 比较三个投资组合对象。

targetRetn = 2.0e-3;
pwgt0 = estimateFrontierByReturn(p0, targetRetn);
pwgtWithMaxNumAssets = estimateFrontierByReturn(pWithMaxNumAssets, targetRetn);
pwgtConditionalBound = estimateFrontierByReturn(pWithConditionalBound, targetRetn);

下表显示三个投资组合对象之间指定目标收益的最终分配。您可以看到,在 pwgtConditionalBound 中回避了 'AAPL''HPQ' 中的小头寸,并且在 pwgtWithMaxNumAssets 中只投资了三项资产。

result = table(p0.AssetList',pwgt0,pwgtWithMaxNumAssets,pwgtConditionalBound)
result=12×4 table
      Var1       pwgt0      pwgtWithMaxNumAssets    pwgtConditionalBound
    ________    ________    ____________________    ____________________

    {'AAPL'}    0.076791                  0                   0.1       
    {'AMZN'}           0                  0                     0       
    {'CSCO'}           0                  0                     0       
    {'DELL'}           0                  0                     0       
    {'EBAY'}           0                  0                     0       
    {'GOOG'}     0.44841            0.47297               0.44255       
    {'HPQ' }    0.022406        -6.9389e-17                     0       
    {'IBM' }     0.31139            0.34763               0.31592       
    {'INTC'}           0                  0                     0       
    {'MSFT'}     0.14101             0.1794               0.14153       
    {'ORCL'}           0                  0                     0       
    {'YHOO'}           0                  0                     0       

给定一个 PortfolioCVaR 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 ];
m = m/12;
C = C/12;

AssetScenarios = mvnrnd(m, C, 20000);

p = PortfolioCVaR;
p = setScenarios(p, AssetScenarios);
p = setDefaultConstraints(p);
p = setProbabilityLevel(p, 0.95);

plotFrontier(p);

给定一个 PortfolioMAD 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 ];
m = m/12;
C = C/12;

AssetScenarios = mvnrnd(m, C, 20000);

p = PortfolioMAD;
p = setScenarios(p, AssetScenarios);
p = setDefaultConstraints(p);

plotFrontier(p);

输入参数

全部折叠

自 R2024a 起

(可选)显示有效边界图的坐标区对象,指定为您使用 axes 创建的 Axes 对象。可选参量 ax 可以位于任何输入参量组合之前。有效边界图显示在可选参量 ax 指定的坐标区上。如果您没有指定坐标区,则 MATLAB® 将在当前坐标区中绘图,如果不存在坐标区对象,它会新建一个。有关将 Axes 对象与 plotFrontier 结合使用的示例,请参阅使用 Axes 可选输入作为第一个输入显示有效边界图

数据类型: object

投资组合优化对象,使用 PortfolioPortfolioCVaRPortfolioMAD 对象指定。有关创建 Portfolio 对象的详细信息,请参阅

数据类型: object

(可选)在有效边界上绘制的投资组合的数目,指定为标量整数。

注意

如果没有为 NumPortfolios 指定任何值,则从隐藏属性 defaultNumPorts 获得默认值(默认值为 10)。如果 NumPortfolios = 1,则此函数返回隐藏属性 defaultFrontierLimit 指定的投资组合(当前默认值为 'min')。

数据类型: double

(可选)每个投资组合的投资组合收益标准差,指定为 NumPortfolios×1 列向量。

注意

PortfolioRisksPortfolioReturns 必须是大小相同的向量。风险和收益必须是与有效边界上的投资组合关联的有效值。

如果把投资组合的风险和收益用作输入,请确保风险在调用序列中排在前面。此外,如果投资组合风险和收益未按升序排序,则此方法将对它们进行排序。输出时,返回排序后的矩。

数据类型: double

(可选)每个投资组合的投资组合收益均值,指定为 NumPortfolios×1 列向量。

注意

PortfolioRisksPortfolioReturns 必须是大小相同的向量。风险和收益必须是与有效边界上的投资组合关联的有效值。

如果把投资组合的风险和收益用作输入,请确保风险在调用序列中排在前面。此外,如果投资组合风险和收益未按升序排序,则此方法将对它们进行排序。输出时,返回排序后的矩。

数据类型: double

(可选)有效边界上的最优投资组合,指定为 NumAssets×NumPortfolios 矩阵。

注意

PortfolioWeights 假定您提供有效边界上的有效投资组合。

数据类型: double

名称-值参数

示例: [prsk,pret]=plotFrontier(p,Parent=ax)

Name1=Value1,...,NameN=ValueN 形式指定必需参量对组,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须显示在其他参量的后面,但参量对的顺序不重要。

自 R2024a 起

显示有效边界图的坐标区对象,指定为 Axes 对象。有效边界图显示在 Parent 名称-值参量指定的坐标区上。如果您没有指定坐标区,则 MATLAB 将在当前坐标区中绘图,如果不存在坐标区对象,它会新建一个。有关将 Axes 对象与 plotFrontier 结合使用的示例,请参阅使用 Axes 对象显示 Portfolio 和 PortfolioCVaR 对象的有效边界图

数据类型: object

输出参量

全部折叠

估计的有效投资组合风险,以 PortfolioPortfolioCVaRPortfolioMAD 输入对象 (obj) 的 NumPortfolios×1 向量的形式返回。

估计的有效投资组合收益,以 PortfolioPortfolioCVaRPortfolioMAD 输入对象 (obj) 的 NumPortfolios×1 向量的形式返回。

自 R2024a 起

有效边界图的图窗句柄,以图形(线图或散点图)对象的数组形式返回。可以使用 h 中的元素访问和修改有效边界图的属性。

注意

  • 如果投资组合对象在 Name 属性中具有名称,该名称将显示为绘图的标题。否则,该绘图将被标记为“有效边界”。

  • 如果投资组合对象在 InitPort 属性中具有初始投资组合,初始投资组合会被绘图并标记。

提示

您还可以使用圆点表示法来绘制有效边界。

[prsk, pret] = obj.plotFrontier;

版本历史记录

在 R2011a 中推出

全部展开