答案 0 :(得分:2)
在您的极端测试示例中,您可以获得无数的解决方案; Mma挑出了其中一个。如果你想让它选择一个使(未识别的)权重大致相等的解决方案,那么你应该告诉它你关心那个方面:例如,你可以添加一个惩罚来偏离平等。试试这个:
lambda = .00001;
NMinimize[{p.m5.p -
lambda*PDF[DirichletDistribution[Table[2, {5}]], Most[p]],
Tr@p == 1 && And @@ Thread[p >= 0]}, p]
我使用Dirichlet分布,平均值为1/5。调整参数包括λ和Dirichlet分布中的参数“2”(其控制平均值附近的浓度)。根据实际问题,您将不得不使用这些调整参数。对于不那么极端的例子,你可以试试
lambda = .0001;
NMinimize[{p.m.p -
lambda*PDF[DirichletDistribution[Table[2, {5}]], Most[p]],
Tr@p == 1 && And @@ Thread[p >= 0]}, p]
- 标记
答案 1 :(得分:2)
我会提出一个简单而有点缺陷的方法。对于每个资产总和其协方差。然后将其百分比与该总和与协方差总和的比率相反。
在代码中,使用您的原始示例,我们将执行以下操作。
cormat = {{1.0, 0.635562, 0.698852,
0.404792, -0.32746}, {0.635562, 1.0, 0.410075,
0.314375, -0.0636438}, {0.698852, 0.410075, 1.0,
0.374416, -0.260137}, {0.404792, 0.314375, 0.374416, 1.0,
0.293135}, {-0.32746, -0.0636438, -0.260137, 0.293135, 1.0}};
n = Length[cormat];
xvars = Array[x, n];
corrs = Map[Total, cormat];
cortot = Total[Total[cormat]];
unnormalized =
xvars /. First[Solve[xvars == cortot/corrs, xvars]]
Out [26] = {4.129760099114916,4.337254104111004,4.479986290069387,\ 4.173066277624756,15.51647047130198}
normalized = unnormalized/Total[unnormalized]
Out [27] = {0.1265379371734397,0.1328956583819156,0.1372690447157368,\ 0.1278648603757522,0.4754324993531559}
我怀疑这些值对于这个例子来说是一个合理的结果。
有两个缺陷。一个是这不能解释资产的相对强弱。我不认为这是一个问题,因为我怀疑你已经加权了,即1美元的资产1值1美元的资产2值得......
- 编辑 -
这最后不太可能。您需要同时考虑资产价格和估计的回报。不知道你想在我展示的代码中如何处理这个问题。也许权重协方差略有不同,以便“更好”的资产(在收益与价格方面)给出更好的协方差数字?
- 结束编辑 -
更大的问题是,当存在较大的负相关时,这将不会很好。如何处理这取决于你想要的行为是什么。例如,如果一对资产负相关,您是否发现它们优于零相关?如果不是,那么一个简单的解决办法就是将负数转化为正相关的一部分(或者如果负相关被认为不比不相关的资产更好或更差,则将它们变为零)。
如果,正如我怀疑的那样,一对具有负相关性使得它们相对更合适地拥有位置(使你更加经济衰退),那么我们必须调整上面的代码,这样我们就不会在相关时炸毁这些值总数达到或超过-1。我认为合理的启发式方法是,如果它们的总和在-0.5,0范围内,则将负数单独排成一行,否则将它们归一化为-0.5。
显然所有这些都是启发式的,并且可以调整参数,例如可以使用逆幂关系而不是逆。除了我的建议之外,还能以某种方式处理否定。可以加一点茶叶......
注意我不在这里,所以任何滥用术语都是无意的。也许是出于我的深度。
Daniel Lichtblau Wolfram Research