主要内容

基于半连续和基数约束的投资组合优化

这个例子展示了如何使用投资组合对象在执行投资组合优化时直接处理半连续约束和基数约束。投资组合优化是指在一组投资约束条件下,将收益最大化或风险最小化的资产配置。的投资组合类是基于马科维茨均值-方差优化框架设计和实现的。均值-方差优化框架处理的问题是,收益是预期的投资组合收益,风险是投资组合收益的方差。使用投资组合类,您可以最小化有效边界(EF)上的风险,最大化EF上的收益,最大化给定风险的收益,最小化给定收益的风险。你也可以使用PortfolioCVaRPortfolioMAD类来指定半连续约束和基数约束。这样的优化问题集成了约束,如组,线性不等式,周转率和跟踪误差约束。这些约束被表述为非线性规划(NLP)问题,其中连续变量表示为资产权重 x

半连续约束和基数约束是组合约束的另外两种常见类别,它们是通过添加二进制变量在数学上表述的 v

  • 一个断断续续的约束限制资产的分配。例如,您可以使用此约束将已分配资产的分配权重限制在5%到50%之间。通过使用这个约束,你可以避免非常小或很大的头寸,以最大限度地减少波动和运营成本。为了在数学上表达这种类型的约束,一个二进制变量 v 是需要的,其中 v 01.的值0表示该资产是不是分配和值1表示该资产分配。数学形式是 v x 乌兰巴托 v ,在那里 v 01.指定此类型的约束为“条件”BoundType投资组合类使用setBounds函数。

  • 一个基数约束例如,对于一个包含100个资产的投资组合,您可以指定在20到40个资产之间的最优投资组合分配。这种能力有助于限制职位数量,从而降低运营成本。为了在数学上表达这种类型的约束,二进制变量表示为 v 都需要,在哪里 v 01.的值0表示该资产是不是分配和值1表示该资产分配。数学形式是 MinNumAssets 1 NumAssets v MaxNumAssets ,在那里 v 01.属性指定此类型的约束“MinNumAssets”而且“MaxNumAssets”限制条件投资组合类使用setMinMaxNumAssets函数。

有关半连续约束和基数约束的更多信息,请参见算法

当使用半连续约束和基数约束进行投资组合优化时,会导致混合整数非线性规划问题。的投资组合类允许您配置这两个约束,特别是使用的半连续约束setBounds“条件”BoundType,和基数约束使用setMinMaxNumAssets.的投资组合类自动制定数学问题并验证指定的约束。的投资组合类还提供了内置的MINLP求解器和灵活的求解器选项,您可以使用setSolverMINLP函数。

此示例演示了投资组合对象具有半连续和基数约束,并使用BlueChipStockMoments数据集,它有30个资产。

负载BlueChipStockMomentsnumAssets = numel(资产列表)
numAssets = 30

限制每个已分配资产的最小权重

创建一个完全投资的投资组合,只有多头头寸: x 0 而且 总和 x 1 .这些被配置为setDefaultConstraints

p =投资组合(“AssetList”AssetList,“AssetCovar”AssetCovar,“AssetMean”, AssetMean);p = setDefaultConstraints(p);

假设您希望避免非常小的头寸,以尽量减少人员变动和运营成本。通过设置约束,添加另一个约束,将分配的位置限制为不小于5% x 0 x 0 05 使用setBounds与一个“条件”BoundType

pWithMinWeight = setBounds(p, 0.05,“BoundType”“条件”);

画出两者的有效边界投资组合对象。

wgt = estimateFrontier(p);wgtWithMinWeight = estimateFrontier(pWithMinWeight);图(1);plotFrontier (p,重量);持有;plotFrontier (pWithMinWeight wgtWithMinWeight);持有;传奇(“基线组合”“与minWeight约束”“位置”“最佳”);

图中包含一个轴对象。标题为E f f i i E nt的axis对象包含2个类型为line的对象。这些对象表示基线投资组合,具有minWeight约束。

图中显示,两者投资组合物体具有几乎相同的有效边界。然而,最小重量要求更实用,因为它可以防止接近零的位置。

检查具有默认约束的投资组合的最优权重,以查看每个最优配置有多少资产低于5%的限制。

Toler = eps;总和(wgt>toler & wgt<0.05)
ans =1×105 7 5 4 2 3 4 2 0 0

使用estimateFrontierByReturn在这两种情况下,研究投资组合的组合,以获得边界上的目标回报。

targetRetn = 0.011;pwgt = estimateFrontierByReturn(p, targetRetn);pwgtWithMinWeight = estimateFrontierByReturn(pWithMinWeight, targetRetn);

画出两者的组成投资组合对象为宇宙的30个资产。

图(2);barh ([pwgt pwgtWithMinWeight]);网格包含(“投资比例”) yticks (1: p.NumAssets);yticklabels (p.AssetList);标题(“资产配置”);传奇(“无最小重量限制”“最小重量限制”“位置”“最佳”);

图中包含一个轴对象。标题为Asset Allocation的axes对象包含2个类型为bar的对象。这些对象表示无最小重量限制,有最小重量限制。

只显示已分配的资产。

idx = (pwgt>toler) | (pwgtWithMinWeight>toler);barh ([pwgt (idx) pwgtWithMinWeight (idx)]);网格包含(“投资比例”) yticks (1: sum (idx));yticklabels (p.AssetList (idx));标题(“资产配置”);传奇(“无最小重量限制”“最小重量限制”“位置”“最佳”);

图中包含一个轴对象。标题为Asset Allocation的axes对象包含2个类型为bar的对象。这些对象表示无最小重量限制,有最小重量限制。

限制分配资产的最大数量

使用setMinMaxNumAssets属性的最大已分配资产数投资组合对象。假设您希望在最优投资组合中投资不超过8种资产。用a来做投资组合对象,使用setMinMaxNumAssets

pWithMaxNumAssets = setMinMaxNumAssets(p, [], 8);wgt = estimateFrontier(p);wgtWithMaxNumAssets = estimateFrontier(pWithMaxNumAssets);plotFrontier (p,重量);持有;plotFrontier (pWithMaxNumAssets wgtWithMaxNumAssets);持有;传奇(“基线组合”“MaxNumAssets约束”“位置”“最佳”);

图中包含一个轴对象。标题为E f f i i E nt的axis对象包含2个类型为line的对象。这些对象表示基线投资组合,具有MaxNumAssets约束。

使用estimateFrontierByReturn在给定的目标收益下找到最小化边界风险的分配。

pwgtWithMaxNum = estimateFrontierByReturn(pWithMaxNumAssets, targetRetn);

画出两者的组成投资组合对象为宇宙的30个资产。

idx = (pwgt>toler) | (pwgtWithMaxNum>toler);barh ([pwgt (idx) pwgtWithMaxNum (idx)]);网格包含(“投资比例”) yticks (1: sum (idx));yticklabels (p.AssetList (idx));标题(“资产配置”);传奇(“基线组合”“MaxNumAssets约束”“位置”“最佳”);

图中包含一个轴对象。标题为Asset Allocation的axes对象包含2个类型为bar的对象。这些对象表示基线投资组合,具有MaxNumAssets约束。

总和(abs (pwgt) >托勒)
Ans = 11

计算已分配资产的总数,以验证最多只分配了8个资产。

总和(abs (pwgtWithMaxNum) >托勒)
Ans = 8

限制分配资产的最小和最大数量

假设在给定的资产范围内,您想为在投资组合中分配的资产数量设置下限和上限。使用setBounds指定允许分配的资产数量为5至10,分配的权重不低于5%。

p1 = setMinMaxNumAssets(p, 5, 10);p1 = setBounds(p1, 0.05,“BoundType”“条件”);

如果分配了资产,则有必要清楚地定义该资产的最小权重要求。这是用setBounds与一个“条件”BoundType.否则,优化器无法评估分配了哪些资产,也无法制定MinNumAssets约束。详情请参见定义为空或零的条件下界

绘制有效边界以将此投资组合与只有默认约束的基线投资组合进行比较。

wgt = estimateFrontier(p);wgt1 = estimateFrontier(p1);plotFrontier (p,重量);持有;plotFrontier (p1, wgt1);持有;传奇(“基线组合”“MaxNumAssets约束”“位置”“最佳”);

图中包含一个轴对象。标题为E f f i i E nt的axis对象包含2个类型为line的对象。这些对象表示基线投资组合,具有MaxNumAssets约束。

等权重投资组合的资产配置

用两者创建一个同等权重的投资组合setBounds而且setMinMaxNumAssets功能。

numassetsallocate = 8;重量= 1 / numAssetsAllocated;p2 = setBounds(p,重量,重量,重量,“BoundType”“条件”);p2 = setMinMaxNumAssets(p2, numassetsallocate, numassetsallocate);

当任意一个,或任意组合“条件”BoundTypeMinNumAssets,或MaxNumAssets是主动的,优化问题被表述为混合整数非线性规划(MINLP)问题。的投资组合类根据指定的约束自动构造MINLP问题。

当与投资组合对象时,您可以使用setSolverMINLP函数。在本例中,不使用默认的MINLP求解器选项,而是自定义求解器选项来帮助解决收敛问题。使用大量(50)“MaxIterationsInactiveCut”setSolverMINLP,而不是默认值30.MaxIterationsInactiveCut”.的值50在寻找最优资产配置的有效边界方面表现良好。

p2 = setSolverMINLP(p2,“OuterApproximation”“MaxIterationsInactiveCut”, 50);

绘制基线和等权重投资组合的有效边界。

wgt = estimateFrontier(p);wgt2 = estimateFrontier(p2);plotFrontier (p,重量);持有;plotFrontier (p2, wgt2);持有;传奇(“基线组合”“等权重投资组合”“位置”“最佳”);

图中包含一个轴对象。标题为E f f i i E nt的axis对象包含2个类型为line的对象。这些对象代表基线投资组合,平等加权投资组合。

使用estimateFrontierByRisk在这种情况下,是为了优化特定的风险水平0。,以确定哪种配置能使投资组合回报最大化。

targetRisk = 0.05;pwgt = estimateFrontierByRisk(p, targetRisk);pwgt2 = estimateFrontierByRisk(p2, targetRisk);Idx = (pwgt>toler) | (pwgt2>toler);barh ([pwgt (idx) pwgt2 (idx)]);网格包含(“投资比例”) yticks (1: sum (idx));yticklabels (p.AssetList (idx));标题(“资产配置”);传奇(“基线组合”“等权重投资组合”“位置”“最佳”);

图中包含一个轴对象。标题为Asset Allocation的axes对象包含2个类型为bar的对象。这些对象代表基线投资组合,平等加权投资组合。

使用“条件”BoundTypeMinNumAssets,MaxNumAssets约束与其他约束

可以为a定义其他约束投资组合对象使用功能。a的其他约束条件投资组合对象,如分组、线性不等式、周转率、跟踪误差等均可与“条件”BoundType“MinNumAssets”,“MaxNumAssets”约束。例如,使用指定跟踪误差约束setTrackingError

Ii = [15, 16, 20, 21, 23, 25, 27, 29, 30];%资产指数,包括在跟踪投资组合trackingPort(ii) = 1/numel(ii);q = setTrackingError(p, 0.5, trackingPort);

然后使用setMinMaxNumAssets添加约束以限制可投资资产的最大数量。

q = setMinMaxNumAssets(q, [], 8);

在这些先前指定的约束之上,使用setBounds添加约束以限制已分配资产的权重。你可以对mixed使用约束BoundType值,“简单”意味着 x 乌兰巴托 而且“条件”意味着 x 0 x 乌兰巴托

允许资产进入trackingPort要有BoundType价值“条件”在最优配置中。

Lb = 0 (q。NumAssets,1);Ub = 0 (q。NumAssets,1)*0.5; lb(ii) = 0.1; ub(ii) = 0.3; boundType = repmat(“简单”q.NumAssets 1);boundType (ii) =“条件”;q = setBounds(q, lb, ub,“BoundType”, boundType);

绘制有效边界:

plotFrontier (q);

图中包含一个轴对象。标题为E f f i i E nt空白f r on i E r的axis对象包含一个类型为line的对象。

使用estimateFrontierByReturn找出在给定收益下,风险最小的配置0.125

targetRetn = 0.0125;pwgt = estimateFrontierByReturn(q, targetRetn);

按权重显示资产的分配。

Idx = abs(pwgt)>eps;assetnames = q.AssetList';资产=资产名称(idx);重量= pwgt(idx);resultAlloc = table(资产,权重)
resultAlloc =7×2表资产重  ________ _______ {' JNJ} 0.1 0.19503{‘嗯’}{‘莫’}0.1485{“微软”}0.1 0.1 {PG的}{“京东商城”}0.2212 0.13527 {XOM的}

另请参阅

|||

相关的例子

更多关于

外部网站