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 は、株式累積リターンの 2 次元配列 (つまり、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関数はありますか?

編集: 私の最初のソリューションが私のデータを転置したことがわかりlistましたndarrays. は、日付ごとに 1 つの要素である、最初の在庫の在庫値の を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 に答える