estimateFrontier
估计有效边界上指定数量的最优投资组合
说明
[
基于 pwgt
,pbuy
,psell
] = estimateFrontier(obj
)Portfolio
、PortfolioCVaR
或 PortfolioMAD
对象估计有效边界上指定数量的最优投资组合。有关使用这些不同对象时各自工作流的详细信息,请参阅 Portfolio 对象工作流、PortfolioCVaR 对象工作流和 PortfolioMAD 对象工作流。
示例
创建 Portfolio
对象并确定有效投资组合
创建有效投资组合:
load CAPMuniverse p = Portfolio('AssetList',Assets(1:12)); p = estimateAssetMoments(p, Data(:,1:12),'missingdata',true); p = setDefaultConstraints(p); plotFrontier(p);
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
创建具有 BoundType
和 MaxNumAssets
约束的 Portfolio
对象并确定有效投资组合
根据 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
创建 PortfolioCVaR 对象并确定有效投资组合
创建有效投资组合:
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);
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
创建 PortfolioMAD
对象并确定有效投资组合
创建有效投资组合:
load CAPMuniverse p = PortfolioMAD('AssetList',Assets(1:12)); p = simulateNormalScenariosByData(p, Data(:,1:12), 20000 ,'missingdata',true); p = setDefaultConstraints(p); plotFrontier(p);
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
获得 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; 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
获得 Portfolio 对象在有效边界上的投资组合买入交易和卖出交易
从初始投资组合开始,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
获得 PortfolioCVaR 对象的默认有效投资组合数量
获得整个有效边界范围上的默认有效投资组合数量。
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
() 重置了随机数生成器以得到文档中的结果。在模拟场景时重置随机数生成器这一步并不是必需的。
获得 PortfolioCVaR 对象在有效边界上的投资组合买入交易和卖出交易
从初始投资组合开始,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
() 重置了随机数生成器以得到文档中的结果。在模拟场景时重置随机数生成器这一步并不是必需的。
获得 PortfolioMAD 对象的默认有效投资组合数量
获得整个有效边界范围上的默认有效投资组合数量。
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
() 重置了随机数生成器以得到文档中的结果。在模拟场景时重置随机数生成器这一步并不是必需的。
获得 PortfolioMAD 对象在有效边界上的投资组合买入交易和卖出交易
从初始投资组合开始,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
() 重置了随机数生成器以得到文档中的结果。在模拟场景时重置随机数生成器这一步并不是必需的。
输入参数
obj
— 投资组合的对象
对象
投资组合对象,使用 Portfolio
、PortfolioCVaR
或 PortfolioMAD
对象指定。有关创建 Portfolio 对象的详细信息,请参阅
数据类型: object
NumPorts
— 要在有效边界上获得的点数
来自隐藏属性 defaultNumPorts
的值(默认值为 10
) (默认) | 标量整数
要在有效边界上获得的点数,指定为标量整数。
注意
如果没有为 NumPorts
指定任何值,则从隐藏属性 defaultNumPorts
获得默认值(默认值为 10
)。如果 NumPorts
= 1
,则此函数返回隐藏属性 defaultFrontierLimit
指定的投资组合(当前默认值为 'min'
)。
数据类型: double
输出参量
pwgt
— 有效边界上指定数量的最优投资组合,按从最小到最大的投资组合收益均匀分布
矩阵
有效边界上指定数量的最优投资组合,按从最小到最大的投资组合收益等间距分布,以 NumAssets
×NumPorts
的矩阵形式返回。 为 Portfolio
、PortfolioCVaR
或 PortfolioMAD
输入对象 (obj
) 返回 pwgt
。
pbuy
— 为建立有效边界上的最优投资组合,相对于初始投资组合需要进行的买入交易
矩阵
为建立有效边界上的最优投资组合,相对于初始投资组合需要进行的买入交易,以 NumAssets
×NumPorts
矩阵形式返回。
注意
如果没有在 obj.InitPort
中指定初始投资组合,则假定该值为 0
,以便 pbuy = max(0, pwgt)
且 psell = max(0, -pwgt)
。
对于 Portfolio
、PortfolioCVaR
或 PortfolioMAD
输入对象 (obj
),返回 pbuy
。
psell
— 为建立有效边界上的最优投资组合,相对于初始投资组合需要进行的卖出交易
矩阵
为建立有效边界上的最优投资组合,相对于初始投资组合需要进行的卖出交易,以 NumAssets
×NumPorts
矩阵形式返回。
注意
如果没有在 obj.InitPort
中指定初始投资组合,则假定该值为 0
,以便 pbuy = max(0, pwgt)
且 psell = max(0, -pwgt)
。
为 Portfolio
、PortfolioCVaR
或 PortfolioMAD
输入对象 (obj
) 返回 psell
。
提示
您还可以使用圆点表示法来估计整个有效边界上指定数量的最优投资组合。
[pwgt, pbuy, psell] = obj.estimateFrontier(NumPorts);
向
Portfolio
、PortfolioCVaR
或PortfolioMAD
对象引入交易成本和周转约束后,投资组合优化目标会包含一个绝对值项。有关 Financial Toolbox™ 如何通过算法处理这类情况的详细信息,请参阅参考。
参考
[1] Cornuejols, G., and R. Tutuncu. Optimization Methods in Finance. Cambridge University Press, 2007.
版本历史记录
在 R2011a 中推出
另请参阅
estimateFrontierByReturn
| estimateFrontierByRisk
| estimateFrontierLimits
| setBounds
| setMinMaxNumAssets
主题
- 估计 Portfolio 对象整个有效边界上的有效投资组合
- Estimate Efficient Frontiers for Portfolio Object
- 估计 PortfolioCVaR 对象整个边界上的有效投资组合
- Estimate Efficient Frontiers for PortfolioCVaR Object
- 估计 PortfolioMAD 对象整个边界上的有效投资组合
- Estimate Efficient Frontiers for PortfolioMAD Object
- Portfolio Optimization Examples Using Financial Toolbox
- Bond Portfolio Optimization Using Portfolio Object
- 投资组合优化理论
- Choose MINLP Solvers for Portfolio Problems
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)