2

我有一个 numpy 值数组,以及一个缩放因子列表,我想将数组中的每个值按每列向下缩放

values = [[ 0, 1, 2, 3 ],
          [ 1, 1, 4, 3 ],
          [ 2, 1, 6, 3 ],
          [ 3, 1, 8, 3 ]]
ls_alloc = [ 0.1, 0.4, 0.3, 0.2]

# convert values into numpy array
import numpy as np
na_values = np.array(values, dtype=float)

编辑:澄清:

na_valuescan 是股票累积收益的二维数组(即:归一化为第 1 天),其中每一行代表一个日期,每一列代表一只股票。数据作为每个日期的数组返回。

我现在想通过在投资组合中的分配来衡量每只股票的累积回报。因此,对于每个日期(即:每一行ndarray值,将相应的元素从元素应用ls_alloc到数组元素)

# scale each value by its allocation
na_components = [ ls_alloc[i] * na_values[:,i] for i in range(len(ls_alloc)) ]

这就是我想要的,但我不禁觉得一定有办法让numpy 自动为我做这件事?

也就是说,我觉得:

na_components = [ ls_alloc[i] * na_values[:,i] for i in range(len(ls_alloc)) ]
# display na_components
na_components
[array([ 0. ,  0.1,  0.2,  0.3]), \
 array([ 0.4,  0.4,  0.4,  0.4]), \
 array([ 0.6,  1.2,  1.8,  2.4]), \
 array([ 0.6,  0.6,  0.6,  0.6])]

应该能够表示为:

tmp = np.multiply(na_values, ls_alloc)
# display tmp
tmp
array([[ 0. ,  0.4,  0.6,  0.6],
       [ 0.1,  0.4,  1.2,  0.6],
       [ 0.2,  0.4,  1.8,  0.6],
       [ 0.3,  0.4,  2.4,  0.6]])

是否有一个 numpy 函数可以优雅而简洁地实现我想要的?

编辑: 我看到我的第一个解决方案已经转置了我的数据,因此我返回listndarrays. na_components[0]现在给出ndarray第一个股票的股票值,每个日期一个元素。

我执行的下一步na_components是通过对每个单独的组件求和来计算投资组合的总累积回报

na_pfo_cum_ret = np.sum(na_components, axis=0)

这适用于个股回报列表ndarrays

4

2 回答 2

5

这个顺序对我来说似乎有点奇怪,但是 IIUC,你需要做的就是转置乘以的na_values结果array(ls_alloc)

>>> v
array([[ 0.,  1.,  2.,  3.],
       [ 1.,  1.,  4.,  3.],
       [ 2.,  1.,  6.,  3.],
       [ 3.,  1.,  8.,  3.]])
>>> a
array([ 0.1,  0.4,  0.3,  0.2])
>>> (v*a).T
array([[ 0. ,  0.1,  0.2,  0.3],
       [ 0.4,  0.4,  0.4,  0.4],
       [ 0.6,  1.2,  1.8,  2.4],
       [ 0.6,  0.6,  0.6,  0.6]])
于 2013-07-13T02:47:58.560 回答
1

我并不完全清楚你想做什么,但答案可能在Broadcasting rules中。我想你想要:

values = np.array( [[ 0, 1, 2, 3 ],
                    [ 1, 1, 4, 3 ],
                    [ 2, 1, 6, 3 ],
                    [ 3, 1, 8, 3 ]] )
ls_alloc = np.array([ 0.1, 0.4, 0.3, 0.2])

或者:

na_components = values * ls_alloc

或者:

na_components = values * ls_alloc[:,np.newaxis]
于 2013-07-13T17:48:21.303 回答