Дисперсия портфеля из N активов в Python - PullRequest
4 голосов
/ 14 сентября 2011

Дисперсия портфеля рассчитывается как:

port_var = W'_p * S * W_p

для портфеля с N сборкой, где

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

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

Массив (вектор) весов акций в портфеле (имеется 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

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

У кого-нибудь есть опыт, который может помочь?

1 Ответ

4 голосов
/ 14 сентября 2011
np.dot(weights.T,np.dot(covar,weights))
# array([[ 0.00064654]])

Для двумерных числовых массивов np.dot эквивалентно умножению матрицы.

Для двумерного массива np., отмеченного одномерным массивом, np.dot эквивалентно умножению матрицы на вектор.

Для одномерных массивов np.dot эквивалентно внутреннему произведению.

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


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

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

...