Main Content

混合整数 CVaR 投资组合优化问题

此示例说明如何求解具有选定资产数量或条件(半连续)边界约束的 CVaR 投资组合优化问题。若要求解此问题,您可以使用 PortfolioCVaR 对象以及不同的混合整数非线性规划 (MINLP) 求解器。

CVaR 投资组合

加载 CAPMuniverse.mat 中的收益数据。然后,使用默认约束创建一个权重总和为 1 的纯多头投资组合 PortfolioCVaR 对象。对于此示例,您可以将权重 X 的可行域定义为

X={x|i=1nxi=1,xi0}.

% 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);

通过设置条件(半连续)边界来包含此场景的二元变量。条件边界是指 xi=0xii 这样的边界。在此示例中,所有资产的边界为 i=0.1

% 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 支持的下面三种算法中的任意一种来求解混合整数投资组合问题:OuterApproximationExtendedCPTrustRegionCP。此外,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);

比较使用不同的求解器得到的有效边界上的投资组合收益和风险。它们在数值精度内都是相同的,其中绝对误差为 10-4

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

另请参阅

相关示例

详细信息

外部网站