重新平衡投资组合形成奇异矩阵

问题描述 投票:0回答:1

我试图根据一年的数据创建一个最小方差的投资组合。然后我想每个月重新计算投资组合,从而重新计算协方差矩阵。我的数据集开始于1992年,结束于2017年)。

我做了下面的代码,当它不在循环中时,它可以工作。但是当放在循环中的时候,协方差矩阵的倒数是奇异的。我不明白为什么会出现这个问题,因为我在循环结束时重置了每个变量。

### Importing the necessary libraries ###
import pandas as pd
import numpy as np
from numpy.linalg import inv

### Importing the dataset ###
df = pd.read_csv("UK_Returns.csv", sep = ";")
df.set_index('Date', inplace = True)

### Define varibales ###
stocks = df.shape[1]
returns = []
vol = []
weights_p =[]

### for loop to compute portfolio and rebalance every 30 days ###
for i in range (0,288):
  a = i*30
  b = i*30 + 252
  portfolio = df[a:b]
  mean_ret = ((1+portfolio.mean())**252)-1
  var_cov = portfolio.cov()*252
  inv_var_cov = inv(var_cov)
  doit = 0
  weights = np.dot(np.ones((1,stocks)),inv_var_cov)/(np.dot(np.ones((1,stocks)),np.dot(inv_var_cov,np.ones((stocks,1)))))
  ret = np.dot(weights, mean_ret)
  std = np.sqrt(np.dot(weights, np.dot(var_cov, weights.T)))
  returns.append(ret)
  vol.append(std)
  weights_p.append(weights)
  weights = []
  var_cov = np.zeros((stocks,stocks))
  inv_var_cov = np.zeros((stocks,stocks))
  i+=1

有人有办法解决这个问题吗?

它产生的错误如下。

---------------------------------------------------------------------------
LinAlgError                               Traceback (most recent call last)
<ipython-input-17-979efdd1f5b2> in <module>()
     21   mean_ret = ((1+portfolio.mean())**252)-1
     22   var_cov = portfolio.cov()*252
---> 23   inv_var_cov = inv(var_cov)
     24   doit = 0
     25   weights = np.dot(np.ones((1,stocks)),inv_var_cov)/(np.dot(np.ones((1,stocks)),np.dot(inv_var_cov,np.ones((stocks,1)))))

<__array_function__ internals> in inv(*args, **kwargs)

1 frames
/usr/local/lib/python3.6/dist-packages/numpy/linalg/linalg.py in _raise_linalgerror_singular(err, flag)
     95 
     96 def _raise_linalgerror_singular(err, flag):
---> 97     raise LinAlgError("Singular matrix")
     98 
     99 def _raise_linalgerror_nonposdef(err, flag):

LinAlgError: Singular matrix

非常感谢你能给我提供的任何帮助!

数据共享在下面的谷歌驱动器。https:/drive.google.comfiled1-Bw7cowZKCNU4JgNCitmblHVw73ORFKRview?usp=sharing。

python numpy matrix portfolio singular
1个回答
3
投票

如果能确定是什么原因导致矩阵的奇异性,那就更好了,但是有一些方法可以解决奇异矩阵的问题。

试着用伪反来解决 np.linalg.pinv(). 它保证永远存在。针脚

另一种方法是完全避免计算逆矩阵,只需找到系统的最小二乘解即可。请看 lstsq

替换成 np.dot(X,inv_var_cov)

np.linalg.lstsq(var_conv, X, rcond=None)[0]

© www.soinside.com 2019 - 2024. All rights reserved.