混合整数 CVaR 投资组合优化问题
此示例说明如何求解具有选定资产数量或条件(半连续)边界约束的 CVaR 投资组合优化问题。若要求解此问题,您可以使用 PortfolioCVaR
对象以及不同的混合整数非线性规划 (MINLP) 求解器。
CVaR 投资组合
加载 CAPMuniverse.mat
中的收益数据。然后,使用默认约束创建一个权重总和为 1
的纯多头投资组合 PortfolioCVaR
对象。对于此示例,您可以将权重 的可行域定义为
% Load data load CAPMuniverse.mat % Create portfolio with default constraints p = PortfolioCVaR(ProbabilityLevel=0.95); p = simulateNormalScenariosByData(p,Data(:,1:12),1000,missingdata=true); p = setDefaultConstraints(p);
通过设置条件(半连续)边界来包含此场景的二元变量。条件边界是指 或 这样的边界。在此示例中,所有资产的边界为 。
% Set conditional bounds condLB = 0.1; condUB = 0.5; p = setBounds(p,condLB,condUB,BoundType="conditional");
使用 estimateFrontier
估计有效边界上的一组投资组合。有效边界是一条曲线,该曲线显示帕累托最优投资组合实现的收益和风险之间的平衡。对于给定的收益水平,有效边界上的投资组合是指在保持期望收益的同时将风险降至最低的投资组合。与之相对,对于给定的风险水平,有效边界上的投资组合是指在保持预期风险水平的同时最大化收益的投资组合。
% Compute efficient frontier p = setSolverMINLP(p,'TrustRegionCP',DeltaLowerBound=condLB); pwgt = estimateFrontier(p)
pwgt = 12×10
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0.1000 0.1094 0.1000 0.1000 0 0 0 0 0 0
0 0 0 0.1000 0.1662 0.2634 0.3369 0.4051 0.4647 0.5000
0.1328 0.2387 0.3331 0.3263 0.3622 0.3543 0.3701 0.3854 0.4287 0.5000
0.1000 0 0 0 0 0 0 0 0 0
0.4132 0.3888 0.2755 0.2552 0.2288 0.1812 0.1110 0 0 0
0 0 0 0 0 0 0 0 0 0
0.2540 0.2631 0.2914 0.2185 0.2427 0.2011 0.1821 0.2095 0.1067 0
⋮
% Compute risk and returns of the portfolios on the efficient frontier
rsk = estimatePortRisk(p,pwgt)
rsk = 10×1
0.0368
0.0377
0.0398
0.0423
0.0453
0.0485
0.0520
0.0558
0.0598
0.0647
ret = estimatePortReturn(p,pwgt)
ret = 10×1
0.0009
0.0012
0.0014
0.0016
0.0019
0.0021
0.0023
0.0026
0.0028
0.0030
使用 plotFrontier
根据边界估计值绘制权重。生成的曲线呈分段凹形,凹区间之间可能有垂直跳跃(不连续性)。
% Plot efficient frontier
plotFrontier(p,pwgt)
更改 MINLP 求解器
在上一部分,您使用了 estimateFrontier
的默认求解器。但其实您可以使用 setSolverMINLP
支持的下面三种算法中的任意一种来求解混合整数投资组合问题:OuterApproximation
、ExtendedCP
和 TrustRegionCP
。此外,OuterApproximation
算法在求解 Portfolio
问题时还接受一个额外的名称-值参量 (ExtendedFormulation
),可以重新表述问题的二次函数形式,从而能够在扩展空间中进行处理,这通常会减少计算时间。包括 OuterApproximation
算法的扩展公式变体在内的所有算法,都会在数值精度范围内返回相同的值。可用的求解器包括:
OuterApproximation
- 默认算法,该算法非常稳健,通常比ExtenedCP
速度更快OuterApproximation
,其中ExtendedFormulation
设置为true
- 一种稳健的算法,通常比其他算法更快,但仅支持求解Portfolio
对象问题ExtendedCP
- 该求解器稳健性最佳,但通常速度最慢TrustRegionCP
- 该算法速度最快,但稳健性较差,可能提供次优解
有关混合整数投资组合问题求解器的详细信息,请参阅Choose MINLP Solvers for Portfolio Problems。
若要更改 MINLP 求解器,请使用 setSolverMINLP
。
% Select 'TrustRegionCP' as solver p_OA = setSolverMINLP(p,'OuterApproximation'); pwgt_OA = estimateFrontier(p_OA); rskOA = estimatePortRisk(p,pwgt_OA); retOA = estimatePortReturn(p,pwgt_OA); % Select 'ExtendedCP' as solver using 'midway' cuts as 'CutGeneration' p_ECP = setSolverMINLP(p,'ExtendedCP',CutGeneration="midway"); pwgt_ECP = estimateFrontier(p_ECP); rskECP = estimatePortRisk(p,pwgt_ECP); retECP = estimatePortReturn(p,pwgt_ECP);
比较使用不同的求解器得到的有效边界上的投资组合收益和风险。它们在数值精度内都是相同的,其中绝对误差为 。
retTable = table(retOA,ret,retECP,'VariableNames',{'OA','TR','ECP'})
retTable=10×3 table
OA TR ECP
__________ __________ __________
0.00092881 0.00092876 0.00092876
0.0011614 0.0011613 0.0011613
0.001394 0.0013939 0.0013939
0.0016265 0.0016265 0.0016265
0.0018591 0.0018591 0.0018591
0.0020917 0.0020917 0.0020917
0.0023243 0.0023243 0.0023243
0.0025569 0.0025569 0.0025569
0.0027894 0.0027894 0.0027894
0.003022 0.003022 0.003022
rskTable = table(rskOA,rsk,rskECP,'VariableNames',{'OA','TR','ECP'})
rskTable=10×3 table
OA TR ECP
________ ________ ________
0.036808 0.036808 0.036808
0.037658 0.037658 0.037658
0.039808 0.039808 0.039808
0.042256 0.042256 0.042256
0.04527 0.045269 0.045269
0.048489 0.048488 0.048488
0.051963 0.051963 0.051963
0.055783 0.055783 0.055783
0.059828 0.059828 0.059828
0.064705 0.064705 0.064705
% Compare risks from the different OuterApproximation formulations
norm(rskTable.OA-rskTable.TR,Inf) <= 1e-4
ans = logical
1
另请参阅
相关示例
- Troubleshooting CVaR Portfolio Optimization Results
- Creating the PortfolioCVaR Object
- Working with CVaR Portfolio Constraints Using Defaults
- Asset Returns and Scenarios Using PortfolioCVaR Object
- 估计 PortfolioCVaR 对象整个边界上的有效投资组合
- Estimate Efficient Frontiers for PortfolioCVaR Object
- Hedging Using CVaR Portfolio Optimization