Main Content

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

estimateFrontier

估计有效边界上指定数量的最优投资组合

说明

示例

[pwgt,pbuy,psell] = estimateFrontier(obj) 基于 PortfolioPortfolioCVaRPortfolioMAD 对象估计有效边界上指定数量的最优投资组合。有关使用这些不同对象时各自工作流的详细信息,请参阅 Portfolio 对象工作流PortfolioCVaR 对象工作流PortfolioMAD 对象工作流

示例

[pwgt,pbuy,psell] = estimateFrontier(obj,NumPorts) 还指定一个额外选项 NumPorts 来估计有效边界上指定数量的最优投资组合。

示例

全部折叠

创建有效投资组合:

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 Efficient Frontier, xlabel Standard Deviation of Portfolio Returns, ylabel Mean of Portfolio Returns 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    

根据 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 项资产。

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

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

p1 = setBounds(p1, 0.1, 0.5,'BoundType', 'Conditional');
pwgt = estimateFrontier(p1, 5);     

下表显示,优化后的配置只投资了最多 3 项资产,并避免了小于 0.1 的小头寸。

result = table(p0.AssetList', pwgt)
result=12×2 table
      Var1                             pwgt                        
    ________    ___________________________________________________

    {'AAPL'}          0          0          0    0.14232          0
    {'AMZN'}          0          0          0          0          0
    {'CSCO'}          0          0          0          0          0
    {'DELL'}          0          0          0          0          0
    {'EBAY'}          0          0          0          0        0.5
    {'GOOG'}    0.16891    0.29534    0.42177        0.5        0.5
    {'HPQ' }          0          0          0          0          0
    {'IBM' }    0.49968    0.43657    0.37326    0.35768          0
    {'INTC'}          0          0          0          0          0
    {'MSFT'}     0.3314     0.2681    0.20496          0          0
    {'ORCL'}          0          0          0          0          0
    {'YHOO'}          0          0          0          0          0

estimateFrontier 函数使用 MINLP 求解器来求解此问题。使用 setSolverMINLP 函数来配置 SolverType 和选项。

p1.solverTypeMINLP
ans = 
'OuterApproximation'
p1.solverOptionsMINLP
ans = struct with fields:
                           MaxIterations: 1000
                    AbsoluteGapTolerance: 1.0000e-07
                    RelativeGapTolerance: 1.0000e-05
                  NonlinearScalingFactor: 1000
                  ObjectiveScalingFactor: 1000
                                 Display: 'off'
                           CutGeneration: 'basic'
                MaxIterationsInactiveCut: 30
                      ActiveCutTolerance: 1.0000e-07
                    IntMainSolverOptions: [1x1 optim.options.Intlinprog]
    NumIterationsEarlyIntegerConvergence: 30
                     ExtendedFormulation: 0
                            NumInnerCuts: 10
                     NumInitialOuterCuts: 10

创建有效投资组合:

load CAPMuniverse

p = PortfolioCVaR('AssetList',Assets(1:12));
p = simulateNormalScenariosByData(p, Data(:,1:12), 20000 ,'missingdata',true);
p = setDefaultConstraints(p);
p = setProbabilityLevel(p, 0.95);

plotFrontier(p);

Figure contains an axes object. The axes object with title Efficient Frontier, xlabel Conditional Value-at-Risk of Portfolio, ylabel Mean of Portfolio Returns 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.01024     0.073698     0.11968    0.12961    0    
    AMZN           0            0           0          0    0    
    CSCO           0            0           0          0    0    
    DELL     0.02161            0           0          0    0    
    EBAY           0            0           0          0    0    
    GOOG     0.20311      0.38012     0.56206    0.75948    1    
    HPQ     0.042472    0.0092573           0          0    0    
    IBM      0.44453       0.3638     0.26262    0.11092    0    
    INTC           0            0           0          0    0    
    MSFT     0.27805      0.17313    0.055642          0    0    
    ORCL           0            0           0          0    0    
    YHOO           0            0           0          0    0    

创建有效投资组合:

load CAPMuniverse

p = PortfolioMAD('AssetList',Assets(1:12));
p = simulateNormalScenariosByData(p, Data(:,1:12), 20000 ,'missingdata',true);
p = setDefaultConstraints(p);

plotFrontier(p);

Figure contains an axes object. The axes object with title Efficient Frontier, xlabel Mean Absolute Deviation of Portfolio Returns, ylabel Mean of Portfolio Returns 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.030177    0.075105     0.11316    0.13349    0    
    AMZN           0           0           0          0    0    
    CSCO           0           0           0          0    0    
    DELL    0.010371           0           0          0    0    
    EBAY           0           0           0          0    0    
    GOOG     0.16086      0.3518     0.54447    0.74908    1    
    HPQ     0.056247    0.023952           0          0    0    
    IBM      0.45826     0.37958     0.29504    0.11743    0    
    INTC           0           0           0          0    0    
    MSFT     0.28409     0.16956    0.047322          0    0    
    ORCL           0           0           0          0    0    
    YHOO           0           0           0          0    0    

获得整个有效边界范围上的默认有效投资组合数量。

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 = setAssetMoments(p, m, C);
p = setDefaultConstraints(p);
pwgt = estimateFrontier(p);
disp(pwgt);
    0.8891    0.7215    0.5540    0.3865    0.2190    0.0515         0         0         0         0
    0.0369    0.1289    0.2209    0.3129    0.4049    0.4969    0.4049    0.2314    0.0579         0
    0.0404    0.0567    0.0730    0.0893    0.1056    0.1219    0.1320    0.1394    0.1468         0
    0.0336    0.0929    0.1521    0.2113    0.2705    0.3297    0.4630    0.6292    0.7953    1.0000

从初始投资组合开始,estimateFrontier 函数返回从您的初始投资组合到有效边界上每个有效投资组合的买入交易和卖出交易。给定 pwgt0 中的初始投资组合,您可以得到买入交易和卖出交易。

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 = setAssetMoments(p, m, C);
p = setDefaultConstraints(p);
pwgt0 = [ 0.3; 0.3; 0.2; 0.1 ];
p = setInitPort(p, pwgt0);
[pwgt, pbuy, psell] = estimateFrontier(p);

display(pwgt);
pwgt = 4×10

    0.8891    0.7215    0.5540    0.3865    0.2190    0.0515         0         0         0         0
    0.0369    0.1289    0.2209    0.3129    0.4049    0.4969    0.4049    0.2314    0.0579         0
    0.0404    0.0567    0.0730    0.0893    0.1056    0.1219    0.1320    0.1394    0.1468         0
    0.0336    0.0929    0.1521    0.2113    0.2705    0.3297    0.4630    0.6292    0.7953    1.0000

display(pbuy);
pbuy = 4×10

    0.5891    0.4215    0.2540    0.0865         0         0         0         0         0         0
         0         0         0    0.0129    0.1049    0.1969    0.1049         0         0         0
         0         0         0         0         0         0         0         0         0         0
         0         0    0.0521    0.1113    0.1705    0.2297    0.3630    0.5292    0.6953    0.9000

display(psell);
psell = 4×10

         0         0         0         0    0.0810    0.2485    0.3000    0.3000    0.3000    0.3000
    0.2631    0.1711    0.0791         0         0         0         0    0.0686    0.2421    0.3000
    0.1596    0.1433    0.1270    0.1107    0.0944    0.0781    0.0680    0.0606    0.0532    0.2000
    0.0664    0.0071         0         0         0         0         0         0         0         0

获得整个有效边界范围上的默认有效投资组合数量。

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;

rng(11);

AssetScenarios = mvnrnd(m, C, 20000);

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

pwgt = estimateFrontier(p);

disp(pwgt);
    0.8454    0.6847    0.5166    0.3541    0.1897    0.0315         0         0         0         0
    0.0606    0.1429    0.2281    0.3167    0.3989    0.4732    0.3531    0.1804         0         0
    0.0456    0.0638    0.0944    0.1079    0.1344    0.1583    0.1733    0.1919    0.2212         0
    0.0484    0.1085    0.1609    0.2213    0.2770    0.3370    0.4736    0.6277    0.7788    1.0000

函数 rng(seed) 重置了随机数生成器以得到文档中的结果。在模拟场景时重置随机数生成器这一步并不是必需的。

从初始投资组合开始,estimateFrontier 函数返回从您的初始投资组合到有效边界上每个有效投资组合的买入交易和卖出交易。给定 pwgt0 中的初始投资组合,您可以得到买入交易和卖出交易。

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;

rng(11);

AssetScenarios = mvnrnd(m, C, 20000);
p = PortfolioCVaR;
p = setScenarios(p, AssetScenarios);
p = setDefaultConstraints(p);
p = setProbabilityLevel(p, 0.95);

pwgt0 = [ 0.3; 0.3; 0.2; 0.1 ];
p = setInitPort(p, pwgt0);
[pwgt, pbuy, psell] = estimateFrontier(p);

display(pwgt);
pwgt = 4×10

    0.8454    0.6847    0.5166    0.3541    0.1897    0.0315         0         0         0         0
    0.0606    0.1429    0.2281    0.3167    0.3989    0.4732    0.3531    0.1804         0         0
    0.0456    0.0638    0.0944    0.1079    0.1344    0.1583    0.1733    0.1919    0.2212         0
    0.0484    0.1085    0.1609    0.2213    0.2770    0.3370    0.4736    0.6277    0.7788    1.0000

display(pbuy);
pbuy = 4×10

    0.5454    0.3847    0.2166    0.0541         0         0         0         0         0         0
         0         0         0    0.0167    0.0989    0.1732    0.0531         0         0         0
         0         0         0         0         0         0         0         0    0.0212         0
         0    0.0085    0.0609    0.1213    0.1770    0.2370    0.3736    0.5277    0.6788    0.9000

display(psell);
psell = 4×10

         0         0         0         0    0.1103    0.2685    0.3000    0.3000    0.3000    0.3000
    0.2394    0.1571    0.0719         0         0         0         0    0.1196    0.3000    0.3000
    0.1544    0.1362    0.1056    0.0921    0.0656    0.0417    0.0267    0.0081         0    0.2000
    0.0516         0         0         0         0         0         0         0         0         0

函数 rng(seed) 重置了随机数生成器以得到文档中的结果。在模拟场景时重置随机数生成器这一步并不是必需的。

获得整个有效边界范围上的默认有效投资组合数量。

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;

rng(11);

AssetScenarios = mvnrnd(m, C, 20000);

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

pwgt = estimateFrontier(p);

disp(pwgt);
    0.8823    0.7151    0.5490    0.3819    0.2175    0.0499         0         0         0         0
    0.0420    0.1290    0.2130    0.2971    0.3822    0.4667    0.3615    0.1752         0         0
    0.0394    0.0600    0.0822    0.1068    0.1238    0.1487    0.1780    0.2101    0.2267         0
    0.0363    0.0959    0.1557    0.2142    0.2765    0.3347    0.4605    0.6147    0.7733    1.0000

函数 rng(seed) 重置了随机数生成器以得到文档中的结果。在模拟场景时重置随机数生成器这一步并不是必需的。

从初始投资组合开始,estimateFrontier 函数返回从您的初始投资组合到有效边界上每个有效投资组合的买入交易和卖出交易。给定 pwgt0 中的初始投资组合,您可以得到买入交易和卖出交易。

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;

rng(11);

AssetScenarios = mvnrnd(m, C, 20000);
p = PortfolioMAD;
p = setScenarios(p, AssetScenarios);
p = setDefaultConstraints(p);

pwgt0 = [ 0.3; 0.3; 0.2; 0.1 ];
p = setInitPort(p, pwgt0);
[pwgt, pbuy, psell] = estimateFrontier(p);

display(pwgt);
pwgt = 4×10

    0.8823    0.7151    0.5490    0.3819    0.2175    0.0499         0         0         0         0
    0.0420    0.1290    0.2130    0.2971    0.3822    0.4667    0.3615    0.1752         0         0
    0.0394    0.0600    0.0822    0.1068    0.1238    0.1487    0.1780    0.2101    0.2267         0
    0.0363    0.0959    0.1557    0.2142    0.2765    0.3347    0.4605    0.6147    0.7733    1.0000

display(pbuy);
pbuy = 4×10

    0.5823    0.4151    0.2490    0.0819         0         0         0         0         0         0
         0         0         0         0    0.0822    0.1667    0.0615         0         0         0
         0         0         0         0         0         0         0    0.0101    0.0267         0
         0         0    0.0557    0.1142    0.1765    0.2347    0.3605    0.5147    0.6733    0.9000

display(psell);
psell = 4×10

         0         0         0         0    0.0825    0.2501    0.3000    0.3000    0.3000    0.3000
    0.2580    0.1710    0.0870    0.0029         0         0         0    0.1248    0.3000    0.3000
    0.1606    0.1400    0.1178    0.0932    0.0762    0.0513    0.0220         0         0    0.2000
    0.0637    0.0041         0         0         0         0         0         0         0         0

函数 rng(seed) 重置了随机数生成器以得到文档中的结果。在模拟场景时重置随机数生成器这一步并不是必需的。

输入参数

全部折叠

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

数据类型: object

要在有效边界上获得的点数,指定为标量整数。

注意

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

数据类型: double

输出参量

全部折叠

有效边界上指定数量的最优投资组合,按从最小到最大的投资组合收益等间距分布,以 NumAssets×NumPorts 的矩阵形式返回。 为 PortfolioPortfolioCVaRPortfolioMAD 输入对象 (obj) 返回 pwgt

为建立有效边界上的最优投资组合,相对于初始投资组合需要进行的买入交易,以 NumAssets×NumPorts 矩阵形式返回。

注意

如果没有在 obj.InitPort 中指定初始投资组合,则假定该值为 0,以便 pbuy = max(0, pwgt)psell = max(0, -pwgt)

对于 PortfolioPortfolioCVaRPortfolioMAD 输入对象 (obj),返回 pbuy

为建立有效边界上的最优投资组合,相对于初始投资组合需要进行的卖出交易,以 NumAssets×NumPorts 矩阵形式返回。

注意

如果没有在 obj.InitPort 中指定初始投资组合,则假定该值为 0,以便 pbuy = max(0, pwgt)psell = max(0, -pwgt)

PortfolioPortfolioCVaRPortfolioMAD 输入对象 (obj) 返回 psell

提示

  • 您还可以使用圆点表示法来估计整个有效边界上指定数量的最优投资组合。

     	[pwgt, pbuy, psell] = obj.estimateFrontier(NumPorts);

  • PortfolioPortfolioCVaRPortfolioMAD 对象引入交易成本和周转约束后,投资组合优化目标会包含一个绝对值项。有关 Financial Toolbox™ 如何通过算法处理这类情况的详细信息,请参阅参考

参考

[1] Cornuejols, G., and R. Tutuncu. Optimization Methods in Finance. Cambridge University Press, 2007.

版本历史记录

在 R2011a 中推出