我有以下代码来计算资产组合的有效前沿:
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;
的内容,但是没有比这更优雅的解决方案吗?
答案 0 :(得分:0)
关键是你的界限没有被忽略。
您使用浮点数进行计算,因此0
和4.17200995972422e-16
都足够接近0,让您的程序允许它们。
我的推荐确实是对你的结果进行舍入(或者只是用format short
显示更少的小数),但我会像这样进行舍入:
pwgt=round(pwgt*100000)/100000;
请注意,其他结果也可能在“上限”之上,但由于这些不重要而无法显示。
答案 1 :(得分:0)
我遇到了这样的问题,层压/工程属性代码,它在所有方面都存在错误。我通过获取我拥有的所有值来修复它,并系统地将它们从double转换为sym,突然我的1e-16值变为真正的零,我也可以eval(val)
仍然看作零!这可能有所帮助,但您可能必须进入正在运行的.m文件,并将这些数字转换为符号val = sym(val)
。
我无法确定,但我认为Matlab的功能可能会在接收到内部处理数据后将sym更改为double。