这个例子展示了如何使用投资组合
对象来在执行投资组合优化时直接处理半连续和基数约束。投资组合优化是指在一定的投资约束条件下,实现收益最大化或风险最小化的资产配置。的投资组合
类是基于Markowitz Mean-Variance Optimization框架设计和实现的。均值-方差优化框架处理的问题,其中回报是预期的投资组合回报,风险是投资组合回报的方差。使用投资组合
类,你可以最小化有效边界(EF)上的风险,最大化EF上的回报,最大化给定风险的回报,最小化给定回报的风险。你也可以用PortfolioCVaR
或PortfolioMAD
类,以指定半连续和基数约束。该优化问题集成了群约束、线性不等式约束、周转约束、跟踪误差约束等约束条件。这些约束被表述为非线性规划(NLP)问题,连续变量用资产权重表示
.
半连续约束和基数约束是另外两种常见的投资组合约束,它们通过添加二元变量在数学上得到表述 .
一个断断续续的约束限制资产的分配。例如,您可以使用此约束将已分配资产的已分配权重限制在5%到50%之间。通过使用这个约束,您可以避免非常小或大的位置,以最大限度地减少搅拌和运营成本。用数学公式表示这种类型的约束,一个二元变量
是必要的,
是0
或1
.的值0
表明资产我是不分配和值1
表明资产我分配。数学形式是
,在那里
是0
或1
.将这种类型的约束指定为“条件”
BoundType
在投资组合
类使用setBounds
函数。
一个基数约束限制最优配置中的资产数量,例如,对于一个包含100种资产的投资组合,您可以指定20到40种资产之间的最优投资组合配置。这种能力有助于限制位置的数量,从而降低操作成本。为了用数学公式表示这种类型的约束,二进制变量表示为
是必要的,
是0
或1
.的值0
表明资产我是不分配和值1
表明资产我分配。数学形式是
,在那里
是0
或1
.属性来指定这种类型的约束“MinNumAssets”
和“MaxNumAssets”
约束的投资组合
类使用setMinMaxNumAssets
函数。
有关半连续和基数约束的更多信息,请参见算法.
当半连续约束和基数约束用于投资组合优化时,会导致混合整数非线性规划问题(MINLP)。的投资组合
类允许您配置这两个约束,特别是使用setBounds
与“条件”
BoundType
,基数约束使用setMinMaxNumAssets
.的投资组合
类自动生成数学问题并验证指定的约束。的投资组合
类还提供了内置的MINLP求解器和灵活的求解器选项,您可以使用setSolverMINLP
函数。
这个例子演示了投资组合
对象具有半连续和基数约束,并使用BlueChipStockMoments
数据集,其中包含30个资产。
负载BlueChipStockMomentsnumAssets =元素个数(AssetList)
numAssets = 30
创建一个完全投资的投资组合,只有多头头寸:
.这些是由setDefaultConstraints
.
p =组合(“AssetList”AssetList,“AssetCovar”AssetCovar,“AssetMean”, AssetMean);p = setDefaultConstraints (p);
假设您希望避免非常小的头寸,以最大限度地减少流失和运营成本。通过设置约束,添加另一个约束,将分配的头寸限制为不小于5%
使用setBounds
与一个“条件”
BoundType
.
pWithMinWeight = setBounds(p, 0.05,“BoundType”,“条件”);
为两者绘制有效边界投资组合
对象。
重量= estimateFrontier (p);wgtWithMinWeight = estimateFrontier (pWithMinWeight);图(1);plotFrontier (p,重量);持有在;plotFrontier (pWithMinWeight wgtWithMinWeight);持有从;传奇(“基线组合”,“与minWeight约束”,“位置”,“最佳”);
从图中可以看出投资组合
物体有几乎相同的有效边界。然而,具有最小重量要求的那个更实用,因为它防止了接近零的位置。
检查带有默认约束的投资组合的最优权重,看看在每个最优配置中有多少资产低于5%的上限。
托勒=每股收益;sum(重量>托勒&重量< 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);标题(“资产配置”);传奇(“没有最小重量限制”,“具有最小重量限制”,“位置”,“最佳”);
只显示分配的资产。
idx = (pwgt>toler) | (pwgtWithMinWeight>toler);barh ([pwgt (idx) pwgtWithMinWeight (idx)]);网格在包含(投资的比例) yticks (1: sum (idx));yticklabels (p.AssetList (idx));标题(“资产配置”);传奇(“没有最小重量限制”,“具有最小重量限制”,“位置”,“最佳”);
使用setMinMaxNumAssets
设置分配的资产的最大数目投资组合
对象。假设你希望在最优投资组合中投资的资产不超过8种。用a投资组合
对象,使用setMinMaxNumAssets
.
pWithMaxNumAssets = setMinMaxNumAssets(p, [], 8);重量= estimateFrontier (p);wgtWithMaxNumAssets = estimateFrontier (pWithMaxNumAssets);plotFrontier (p,重量);持有在;plotFrontier (pWithMaxNumAssets wgtWithMaxNumAssets);持有从;传奇(“基线组合”,“与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约束”,“位置”,“最佳”);
总和(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
约束。有关详细信息,请参见下界定义为空或零的条件边界.
绘制有效边界,将此投资组合与只有默认约束的基线投资组合进行比较。
重量= estimateFrontier (p);wgt1 = estimateFrontier (p1);plotFrontier (p,重量);持有在;plotFrontier (p1, wgt1);持有从;传奇(“基线组合”,“与MaxNumAssets约束”,“位置”,“最佳”);
用这两种方法创建一个同等权重的投资组合setBounds
和setMinMaxNumAssets
功能。
numAssetsAllocated = 8;重量= 1 / numAssetsAllocated;p2 = setBounds(p,权重,权重,“BoundType”,“条件”);p2 = setMinMaxNumAssets(p2, numAssetsAllocated, numAssetsAllocated);
当任何一个,或任何组合“条件”
BoundType
,MinNumAssets
,或MaxNumAssets
时,将优化问题表述为混合整数非线性规划问题。的投资组合
类根据指定的约束自动构造MINLP问题。
当与一个投资组合
对象,您可以使用setSolverMINLP
函数。在本例中,不使用默认的MINLP求解器选项,而是自定义求解器选项以帮助解决收敛问题。使用一个大的数字(50
)“MaxIterationsInactiveCut”
与setSolverMINLP
,而不是默认值30.
“MaxIterationsInactiveCut”
.的值50
有效地发现了最优资产配置的有效边界。
p2 = setSolverMINLP (p2,“OuterApproximation”,“MaxIterationsInactiveCut”, 50);
绘制基线和等权重投资组合的有效边界。
重量= estimateFrontier (p);wgt2 = estimateFrontier (p2);plotFrontier (p,重量);持有在;plotFrontier (p2, wgt2);持有从;传奇(“基线组合”,“平等的加权组合”,“位置”,“最佳”);
使用estimateFrontierByRisk
为了优化特定的风险级别,在本例中.05
,以确定什么样的配置能使投资组合的回报最大化。
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));标题(“资产配置”);传奇(“基线组合”,“平等的加权组合”,“位置”,“最佳”);
“条件”
BoundType
,MinNumAssets
,MaxNumAssets
带有其他约束的约束可以为。定义其他约束投资组合
对象使用集
功能。a的其他约束条件投资组合
对象,如组,线性不等式,翻转,跟踪误差可以与“条件”
BoundType
,“MinNumAssets”
,“MaxNumAssets”
约束。例如,使用setTrackingError
.
Ii = [15,16,20,21,23,25,27,29,30];%用于跟踪投资组合的资产指数trackingPort (ii) = 1 /元素个数(ii);q = setTrackingError(p, 0.5, trackingPort);
然后使用setMinMaxNumAssets
添加限制以限制投资的最大资产数量。
q = setMinMaxNumAssets(q, [], 8);
在这些前面指定的约束之上,使用setBounds
添加约束以限制分配资产的权重。您可以在mixed中使用约束BoundType
值,“简单”
意味着
和“条件”
意味着
.
允许资产进入trackingPort
有BoundType
价值“条件”
在最优分配中。
磅= 0 (q。NumAssets,1);乌兰巴托= 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);
使用estimateFrontierByReturn
找出在给定收益的情况下使风险最小化的配置0.125
.
targetRetn = 0.0125;pwgt = estimateFrontierByReturn(q, targetRetn);
按权重显示资产分配情况。
idx = abs (pwgt) >每股收益;assetnames = q.AssetList ';资产= assetnames (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的}
投资组合
|setBounds
|setMinMaxNumAssets
|setSolverMINLP