2011-09-13 4 views
4

дисперсии портфеля рассчитывается как:Портфель Дисперсия портфель активов N в Python

port_var = W'_p * S * W_p 

для портфеля с N, где assest

W'_p = transpose of vector of weights of stocks in portfolios 
S = sample covariance matrix 
W_p = vector of weights of stocks in portfolios 

У меня есть следующие Numpy матрицы.

Array (вектор) весов акций в портфеле (есть 10 акций):

weights = np.array(
    [[ 0.09], 
     [ 0.05], 
     [ 0.15], 
     [ 0.10], 
     [ 0.15], 
     [ 0.15], 
     [ 0.08], 
     [ 0.08], 
     [ 0.1 ], 
     [ 0.05]]) 

ковариационная матрица доходностей:

covar = np.array([[ 0.00154474 0.00079555 0.00099691 0.00052596 0.0005363 0.00062005 
0.00064031 0.00037494 0.00018826 0.00132809], 
[ 0.00079555 0.00287429 0.00058536 0.00091774 0.00046885 0.00110434 
0.00137141 0.00046724 0.00030414 0.0016615 ], 
[ 0.00099691 0.00058536 0.00155757 0.00056336 0.00052395 0.00060104 
0.00057223 0.00021365 0.00017057 0.00130247], 
[ 0.00052596 0.00091774 0.00056336 0.00126312 0.00031941 0.00088137 
0.00024493 0.00025136 0.00011519 0.00135475], 
[ 0.0005363 0.00046885 0.00052395 0.00031941 0.00054093 0.00045649 
0.00042927 0.00021928 0.00016835 0.00093471], 
[ 0.00062005 0.00110434 0.00060104 0.00088137 0.00045649 0.00133081 
0.00060353 0.0003967 0.00024983 0.00168281], 
[ 0.00064031 0.00137141 0.00057223 0.00024493 0.00042927 0.00060353 
0.00468731 0.00059557 0.00020384 0.00078669], 
[ 0.00037494 0.00046724 0.00021365 0.00025136 0.00021928 0.0003967 
0.00059557 0.00082333 0.00017191 0.00066816], 
[ 0.00018826 0.00030414 0.00017057 0.00011519 0.00016835 0.00024983 
0.00020384 0.00017191 0.00036348 0.0004505 ], 
[ 0.00132809 0.0016615 0.00130247 0.00135475 0.00093471 0.00168281 
0.00078669 0.00066816 0.0004505 0.00530036]]) 

Когда я вычисляю

weights.T * covar * weights 

Результат - массив такого же размера, как и covar. Я новичок в теории портфеля, но я бы предположил, что дисперсия портфеля должна быть скаляром (одно значение).

Есть ли у кого-нибудь опыт в этом, что может помочь?

ответ

4
np.dot(weights.T,np.dot(covar,weights)) 
# array([[ 0.00064654]]) 

Для 2D Numpy массивов, np.dot эквивалентно умножению матриц.

Для 2D-массива np.dotted с 1D-массивом np.dot эквивалентно умножению матрицы-вектора.

Для 1D массивов np.dot эквивалентен внутреннему продукту.

Для массивов numpy * выполняет умножение по элементам (при необходимости broadcasting).


weights.T*np.matrix(covar)*weights 
#matrix([[ 0.00064654]]) 

В качестве альтернативы, если преобразовать covar в np.matrix, то * эквивалентно умножению матриц.

+1

Это прекрасная вещь. –

+0

@ strimp099 - Как примечание стороны, с более новыми версиями numpy (> = 1.5, я думаю?) 'Dot' также является методом ndarray. Другими словами, вы можете написать первый пример в примере unutbu как 'weights.T.dot (covar.dot (weight))'. Для некоторых вещей этот стиль немного чище, хотя и немного меньше назад. –

+0

Большое спасибо @Joe –

 Смежные вопросы

  • Нет связанных вопросов^_^