- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我认为这个问题可以使用 itertools 或 cartesian 来解决,但我是 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 只股票。谢谢。
最佳答案
类似这样的东西,虽然它不是很有效。
from decimal import Decimal
import itertools
# possible optimization: use integers rather than Decimal
weights = [Decimal("-0.4"), Decimal("-0.2"), Decimal(0), Decimal("0.2"), Decimal("0.4")]
def possible_weightings(n = 5, target = 0):
for all_bar_one in itertools.product(weights, repeat = n - 1):
final = target - sum(all_bar_one)
if final in weights:
yield all_bar_one + (final,)
我从评论中重复一遍,您不能对 n = 50
执行此操作。代码会产生正确的值,但宇宙中没有时间迭代所有可能的权重。
这段代码并不出色。它会做一些不必要的工作来检查情况,例如,除了前两个之外所有的总和已经大于 0.8,因此没有必要单独检查这两个中第一个的所有可能性。
所以,这几乎是 n = 5
的时间,但是 n
的一些值使这段代码变得非常慢,你可以用更好的方式走得更远代码。你仍然不会达到 50。我懒得写更好的代码,但基本上你可以用越来越小的值递归调用 possible_weightings
而不是 all_bar_one
n
和 target
的值等于给定的目标减去目前的总和。然后通过在 target
太大(正或负)仅使用 n
值无法达到的情况下尽早退出,修剪所有不需要的分支.
关于Python:获取投资组合的所有可能的权重组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38611467/
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我是一名优秀的程序员,十分优秀!