Skip to content

scipy.stats.kde: LinAlgError: singular matrix #15

Description

Thanks a lot for coding and sharing this awesome library!
When I use min_cvar() in value_at_risk.py, a LinAlgError raised:

> LinAlgError                               Traceback (most recent call last)
<ipython-input-36-b8e9d23c399e> in <module>()
----> 1 a.opt_min_cvar()

<ipython-input-29-cc78a27bceb6> in opt_min_cvar(self, s, beta, random_state)
    159             x0=self.initial_weights,
    160             niter=1000,
--> 161             paired=False,
    162         )
    163         return result

C:\ProgramData\Anaconda3\lib\site-packages\noisyopt\main.py in minimizeSPSA(func, x0, args, bounds, niter, paired, a, c, disp, callback)
    323             xplus = project(x + ck*delta)
    324             xminus = project(x - ck*delta)
--> 325             grad = (funcf(xplus, **fkwargs) - funcf(xminus, **fkwargs)) / (xplus-xminus)
    326         x = project(x - ak*grad)
    327         # print 100 status updates if disp=True

C:\ProgramData\Anaconda3\lib\site-packages\noisyopt\main.py in funcf(x, **kwargs)
    306         # freeze function arguments
    307         def funcf(x, **kwargs):
--> 308             return func(x, *args, **kwargs)
    309 
    310     N = len(x0)

<ipython-input-29-cc78a27bceb6> in _obj_cvar(self, wgts, ret_mat, s, beta, random_state)
    129         # Sample from the historical distribution
    130         print(pf_rets)
--> 131         dist = scipy.stats.gaussian_kde(pf_rets)
    132         sample = dist.resample(s)
    133         # Calculate the value at risk

C:\ProgramData\Anaconda3\lib\site-packages\scipy\stats\kde.py in __init__(self, dataset, bw_method)
    170 
    171         self.d, self.n = self.dataset.shape
--> 172         self.set_bandwidth(bw_method=bw_method)
    173 
    174     def evaluate(self, points):

C:\ProgramData\Anaconda3\lib\site-packages\scipy\stats\kde.py in set_bandwidth(self, bw_method)
    497             raise ValueError(msg)
    498 
--> 499         self._compute_covariance()
    500 
    501     def _compute_covariance(self):

C:\ProgramData\Anaconda3\lib\site-packages\scipy\stats\kde.py in _compute_covariance(self)
    508             self._data_covariance = atleast_2d(np.cov(self.dataset, rowvar=1,
    509                                                bias=False))
--> 510             self._data_inv_cov = linalg.inv(self._data_covariance)
    511 
    512         self.covariance = self._data_covariance * self.factor**2

C:\ProgramData\Anaconda3\lib\site-packages\scipy\linalg\basic.py in inv(a, overwrite_a, check_finite)
    973         inv_a, info = getri(lu, piv, lwork=lwork, overwrite_lu=1)
    974     if info > 0:
--> 975         raise LinAlgError("singular matrix")
    976     if info < 0:
    977         raise ValueError('illegal value in %d-th argument of internal '

LinAlgError: singular matrix

The input data is the monthly simple returns of 3 stocks (APPLE, MICROSOFT AND GOOGLE) from Jan 2015 to Dec 2018 :

|AAPL.O|MSFT.O|GOOGL.O
2005-01-31|0.194099|-0.016467|0.014679
2005-02-28|-0.416645|-0.042618|-0.039004
2005-03-31|-0.071110|-0.039348|-0.039789
2005-04-29|-0.134629|0.046752|0.218769
2005-05-31|0.102579|0.019763|0.260318
2005-06-30|-0.074172|-0.037209|0.060879
2005-07-29|0.158653|0.030998|-0.021724
...
2018-06-29|-0.009418|-0.002327|0.026536
2018-07-31|0.027983|0.075753|0.086814
2018-08-31|0.196227|0.058918|0.003732
2018-09-28|-0.008303|0.018161|-0.020068
2018-10-31|-0.030478|-0.066101|-0.096514
2018-11-30|-0.184045|0.038199|0.017486
2018-12-31|-0.116698|-0.084047|-0.058298

It seems one of iterations by noisyopt.minimizeSPSA is all zero matrix. Then scipy.stats.kde gives LinAlgError: singular matrix.

I would appreciate help in solving this problem.
Thanks!

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions