0

我有以下代码计算资产组合的有效边界:

lb=Bounds(:,1);
ub=Bounds(:,2);

P = Portfolio('AssetList', AssetList,'LowerBound', lb, 'UpperBound', ub, 'Budget', 1);
P = P.estimateAssetMoments(AssetReturns)
[Passetmean, Passetcovar] = P.getAssetMoments

pwgt = P.estimateFrontier(20);
[prsk, pret] = P.estimatePortMoments(pwgt);

除了它在某种程度上忽略了约束(结果如下)之外,它工作得很好。如何将约束设置为硬约束——即防止它忽略零的上限?例如,当我将上限和下限设置为零(即我不希望将特定资产包含在投资组合中)时,我仍然会在计算出的该资产的投资组合权重中得到值,尽管非常小,结果为优化投资组合的一部分。下限 (lb)、上限 (ub) 和投资组合权重之一 (pwgt) 如下所列:

lb                  ub                     pwgt(:,1)
0                   0                   1.06685493772574e-16
0                   0                   4.17200995972422e-16
0                   0                   0
0                   0                   2.76688394418301e-16
0                   0                   3.39138439553466e-16
0.192222222222222   0.252222222222222   0.192222222222222
0.0811111111111111  0.141111111111111   0.105624956477606
0.0912121212121212  0.151212121212121   0.0912121212121212
0.0912121212121212  0.151212121212121   0.0912121212121212
0.0306060606060606  0.0906060606060606  0.0306060606060606
0.0306060606060606  0.0906060606060606  0.0306060606060606
0.121515151515152   0.181515151515152   0.181515151515152
0.0508080808080808  0.110808080808081   0.110808080808081
0.00367003367003366 0.0636700336700337  0.0388531580005063
0.00367003367003366 0.0636700336700337  0.0636700336700338
0.00367003367003366 0.0636700336700337  0.0636700336700337
0                   0                   0
0                   0                   0
0                   0                   1.29236898960272e-16

我可以使用类似的东西:pwgt=floor(pwgt*1000)/1000;,但没有比这更优雅的解决方案了吗?

4

2 回答 2

0

我在层压板/工程属性代码中遇到了这样的问题,它在所有东西上传播错误。我通过获取我拥有的所有值来修复它,并系统地将它们从 double 转换为 sym,突然我的 1e-16 值变成了真正的零,我也可以eval(val)并且仍然看到零!这可能会有所帮助,但您可能必须进入您正在运行的 .m 文件,并将数字转换为 sym with val = sym(val)

我无法确定,但我认为 Matlab 函数一旦接收到用于自己的内部处理的数据,可能会将 sym 更改为加倍。

于 2015-04-23T20:09:56.560 回答
0

关键是您的界限没有被忽略。

您正在使用浮点数进行计算,因此0两者4.17200995972422e-16都足够接近 0 以让您的程序允许它们。

我的建议确实是对您的结果进行四舍五入(或者简单地用 显示更少的小数format short),但是我会像这样进行四舍五入:

pwgt=round(pwgt*100000)/100000;

请注意,其他结果也可能“高于”上限,但是由于不重要,这不会变得可见。

于 2013-10-09T12:23:16.920 回答