我想做一个看似简单的操作,也许我只是被阻止了,但是执行此计算的最快方法是什么?
mret = 0
for i in range(1, len(monthly_rets)):
mret += monthly_rets[i:].prod()
monthly_rets是一个长度为2-540的np.array(即它的长度可以在2到540之间变化,它不一定是np.array)每月因子回报(对于题)。必须有一些聪明的技巧,我可以使用它来避免使用for-loop并加快一点速度?
答案 0 :(得分:4)
您可以使用np.cumprod
和np.sum
的组合。像这样的东西应该工作(至少对于numpy数组):
mret = monthly_rets[:0:-1].cumprod().sum()
np.cumprod
计算数组的累积乘积,这意味着如果您有一个数组a
,其中包含三个元素a[0]
,a[1]
和a[2]
{{ 1}}将为您提供数组a.cumprod()
。现在你想拥有类似的东西。这是通过使用切片[a[0], a[0]*a[1], a[0]*a[1]*a[2]]
完成的,切片将向后遍历数组,以倒数第二个元素结束,这样[:0:-1]
将为您提供a[:0:-1].cumprod()
。 [a[2], a[1]*a[2]]
然后将总结所有元素以便为您提供结果。 (感谢@ B.M。指出正确的切片。)
顺便说一句,我使用sum()
的{{1}}检查了540个随机数(对应于您最大的数组)的数组的性能优势。我加速了2.3ms /10μs= 230。即使计算ipython
警告(可能不正确)的缓存效果,您最终也会有至少40的加速。