【发布时间】:2016-12-01 09:01:30
【问题描述】:
我认为这个问题可以使用 itertools 或笛卡尔来解决,但我对 Python 还很陌生,并且正在努力使用这些:
我有 5 只股票的投资组合,其中每只股票的权重为 -0.4、-0.2、0、0.2 或 0.4,权重加起来为 0。如何创建一个函数来生成每个股票的列表可能的权重组合。例如[-0.4, 0.2, 0, 0.2, 0]...等
理想情况下,该函数适用于 n 只股票,因为我最终希望对 50 只股票执行相同的过程。
编辑:澄清一下,我正在寻找长度为 n(在本例中为 5)的所有组合,总和为 0。值可以重复:例如:[0.2, 0.2, -0.4 , 0, 0], [ 0.4, 0, -0.2, -0.2, 0.4], [0,0,0,0.2,-0.2], [0, 0.4, -0.4, 0.2, -0.2] 等等。所以 [ 0,0,0,0,0] 将是一个可能的组合。有 5 种可能的权重和 5 只股票的事实是巧合(我应该避免的!),同样的问题可能是 5 种可能的权重和 3 只股票或 7 只股票。谢谢。
【问题讨论】:
-
您希望生成的每个列表的长度为 n 且总和为零吗?
-
从人们的回答来看,这个问题有一定的解释空间。您能否列出更多组合,以确保我们在开始编写代码之前正确理解这一点?
-
我怀疑您的计算机是否可以处理 50 只股票的相同过程,无论您如何生成它们。很明显,前 25 个值可以是任何值(只需将剩余的 25 设置为 -1 次每个值的总和为 0),这已经是
5**25要迭代的东西,大约是10**18。 -
@Steve Jessop 但是用生成器而不是列表构造不可能吗?
-
@PM2Ring:哎呀,好点,我数不清。
5**25是订单10**17,而不是 18。但10**18仍然是一个非常宽松的下限,因为考虑到前 25 个项目,平均有不止三种方法可以选择最后 25 个项目。
标签: python list itertools cartesian-product