主要内容

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

这个例子展示了如何使用一个投资组合对象直接处理半连续和基数约束在执行项目组合优化。投资组合优化找到了资产配置回报最大化或最小化风险,受到一系列的投资限制。的投资组合类金融工具箱™是设计和实现基于马科维茨的均值-方差优化框架。均值-方差框架优化处理问题回报的投资组合的预期回报率和风险投资组合收益的方差。使用投资组合类,您可以最小化风险有效边界(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。的投资组合类自动制定数学问题并验证指定的约束。的投资组合类也提供了内置解决适应和灵活解决选项供您使用的优化解算器性能setSolverMINLP函数。

这个示例演示了一个投资组合对象与半连续和基数约束和使用BlueChipStockMoments30资产的数据集,一个宇宙。

负载BlueChipStockMomentsnumAssets =元素个数(AssetList)
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”,“条件”);

情节的有效前沿投资组合对象。

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

图包含一个轴。轴与标题\ bfEfficient前沿包含2线类型的对象。这些对象代表基线组合,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);标题(“资产配置”);传奇(没有最小重量限制的,与最小重量限制的,“位置”,“最佳”);

图包含一个轴。轴与标题资产配置包含2对象类型的酒吧。这些对象代表没有最小重量限制,最小重量限制。

只显示分配资产。

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

图包含一个轴。轴与标题资产配置包含2对象类型的酒吧。这些对象代表没有最小重量限制,最小重量限制。

限制资产分配的最大数量

使用setMinMaxNumAssets设置的最大数量的分配资产投资组合对象。假设您希望不超过八个资产投资的最优投资组合。实现这一目的投资组合对象,使用setMinMaxNumAssets

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

图包含一个轴。轴与标题\ bfEfficient前沿包含2线类型的对象。这些对象代表基线组合,MaxNumAssets约束。

使用estimateFrontierByReturn找到分配最小化给定目标边界上的风险回报。

pwgtWithMaxNum = estimateFrontierByReturn (pWithMaxNumAssets targetRetn);

情节的构成投资组合对象为30资产的宇宙。

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

图包含一个轴。轴与标题资产配置包含2对象类型的酒吧。这些对象代表基线组合,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约束”,“位置”,“最佳”);

图包含一个轴。轴与标题\ bfEfficient前沿包含2线类型的对象。这些对象代表基线组合,MaxNumAssets约束。

资产配置的加权组合

创建一个加权组合使用setBoundssetMinMaxNumAssets功能。

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

当任何一个,或任何组合“条件”BoundType,MinNumAssets,或MaxNumAssets是活跃的,制定优化问题是一个混合整数非线性规划问题(适应)。的投资组合类自动构造适应问题根据指定的约束。

当处理一个投资组合对象,您可以选择三种解决者使用setSolverMINLP函数。在这个例子中,而不是使用默认的适应解算器选项,自定义解算器选项来帮助一个收敛的问题。使用大量(50)“MaxIterationsInactiveCut”setSolverMINLP,而不是默认值的30.MaxIterationsInactiveCut”。的值50适用在寻找最优资产配置的有效边界。

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

情节基线和等权投资组合的有效前沿。

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

图包含一个轴。轴与标题\ bfEfficient前沿包含2线类型的对象。这些对象代表基线组合,平等的加权组合。

使用estimateFrontierByRisk优化特定的风险水平,在这种情况下0。,来确定分配投资组合回报率最大化。

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

图包含一个轴。轴与标题资产配置包含2对象类型的酒吧。这些对象代表基线组合,平等的加权组合。

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

您可以定义其他约束投资组合对象使用功能。这些其他约束投资组合对象,如集团、线性不等式、营业额和跟踪误差可以一起使用“条件”BoundType,“MinNumAssets”,“MaxNumAssets”约束。例如,指定一个跟踪误差约束使用setTrackingError

二=(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添加一个约束限制的重量分配资产。您可以使用与混合约束BoundType值,“简单”意味着 x 乌兰巴托 “条件”意味着 x = 0 x 乌兰巴托

允许资产trackingPortBoundType价值“条件”在最优分配。

磅= 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,磅,乌兰巴托,“BoundType”,boundType);

情节有效边界:

plotFrontier (q);

图包含一个轴。轴与标题\ bfEfficient前沿包含一个类型的对象。

使用estimateFrontierByReturn找到分配最小化的风险对于一个给定的回报0.125

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

显示重量的分配资产。

idx = abs (pwgt) >每股收益;assetnames = q.AssetList ';资产= assetnames (idx);重量= pwgt (idx);resultAlloc =表(资产、重量)
resultAlloc =7×2表资产重量________ _________{‘公司’}0.1{‘嗯’}0.19503 0.1485{‘莫’}{“微软”}0.1 0.1 {PG的}{“京东商城”}0.2212 0.13527 {XOM的}

另请参阅

|||

相关的例子

更多关于

外部网站