【问题标题】:portfolio optimization sorting efficient solutions C#投资组合优化排序高效解决方案 C#
【发布时间】:2013-08-22 20:16:15
【问题描述】:

我有以下问题要解决:

设 H 是一组投资组合。对于H 中的每个投资组合i,让(ri,vi) 成为此解决方案的(return,risk) 值。

对于H 中的每个i,如果H 中存在jji 不同),则rj>=rivj<=vi 然后从@987654 中删除@9876543333@ @。因为ij 支配(它有更好的回报,风险更低)。

最后H 将是一组不受支配的有效解决方案。

我尝试使用 linq 解决上述问题:

 H.RemoveAll(x => H.Any(y => x.CalculateReturn() <= y.CalculateReturn() && x.CalculateRisk() >= y.CalculateRisk() && x != y));

但是我想知道是否存在更有效的方法,因为如果H.Count() 是一万数量级,那么移除占主导地位的投资组合需要很多时间。

提前感谢您的帮助!

克里斯托斯

【问题讨论】:

  • 我在 j 和 vi 之间迷路了。你能发布一些没有缩写的代码来显示你的问题吗?
  • H 是 Portfolio 类的列表。每个投资组合由资产组成,每个资产都有一个权重 w,它是 [0,1] 中的一个数字。所有的权重总和为1。使用投资组合类的两种方法,我们可以估计它的风险和收益。所以每个投资组合都有一对(回报,风险)。我要解决的问题是找到一个投资组合列表中的所有投资组合,这些投资组合不被支配。为了理解支配投资组合的概念,我们需要引入上述缩写。
  • 如果您需要对上述内容进行进一步解释,请告诉我。再次感谢米伦。
  • 如果 H 是 Portfolio 对象的列表,则将其命名为 portfolios。其他名称也一样。

标签: linq list removeall


【解决方案1】:

首先,您应该缓存风险/奖励。我无法判断您是否符合您的代码示例,但如果您不是,则需要先转换列表。

完成此操作后,根据风险对列表进行排序是有意义的。那么,当你增加风险时,你所要做的就是检查你的回报是否严格高于你迄今为止看到的最佳回报。如果不是,您可以将其删除。这应该会显着提高性能。

不幸的是,目前我觉得自己还不够聪明,无法想出一种使用纯 LINQ 的方法,但这段代码应该可以工作:

(免责声明:我尚未编译/测试)

var orderedH = (
  from h in H
  let reward = h.CalculatedReward()
  let risk = h.CalculatedRisk()
  orderby risk ascending
  select new {
    Original = h,
    Risk = risk,
    Reward = reward
}).ToList();

var maxReward = Double.NegativeInfinity;
for (int i = 0; i < orderedH.Count; i++)
{
  if (orderedH[i].Reward <= maxReward) {
    orderedH.RemoveAt(i--);
  }
  else {
    maxReward = orderedH[i].Reward;
  }
}

var filteredPortfolio = orderedH.Select(h => h.Original);

【讨论】:

  • 安德鲁感谢您的帮助!它按预期工作。您的算法的复杂性是 O(orderedH.Count()),与列表的大小成线性关系。不幸的是,使用 linq 的复杂性与列表的大小成二次方。再次感谢!
  • @Christos:它可能更像 O(H ln H),因为你必须先对其进行排序......但它仍然比 O(H^2) 好!
  • 安德鲁,你说得对!不幸的是,当我看到算法时,我的热情让我错了。感谢您的通知!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
相关资源
最近更新 更多