def denoise_OL(S, do_plot=True): np.argwhere(np.isnan(S)) # cor.shape = (1000,1000). If rowvar=1 - row represents a var, with observations in the columns. cor = np.corrcoef(S, rowvar=0) eVal0, eVec0 = mp.getPCA(cor) print(np.argwhere(np.isnan(np.diag(eVal0)))) # code snippet 2.4 q = float(S.shape[0]) / S.shape[1] #T/N eMax0, var0 = mp.findMaxEval(np.diag(eVal0), q, bWidth=.01) nFacts0 = eVal0.shape[0] - np.diag(eVal0)[::-1].searchsorted(eMax0) if do_plot: fig = plt.figure() ax = fig.add_subplot(111) ax.hist(np.diag(eVal0), density=True, bins=100) #, normed = True) #normed = True, pdf0 = mp.mpPDF(var0, q=S.shape[0] / float(S.shape[1]), pts=N) pdf1 = mp.fitKDE(np.diag(eVal0), bWidth=.005) #empirical pdf #plt.plot(pdf1.keys(), pdf1, color='g') #no point in drawing this plt.plot(pdf0.keys(), pdf0, color='r') plt.show() # code snippet 2.5 - denoising by constant residual eigenvalue corr1 = mp.denoisedCorr(eVal0, eVec0, nFacts0) eVal1, eVec1 = mp.getPCA(corr1) return eVal0, eVec0, eVal1, eVec1, corr1, var0
def deNoiseCov(cov0, q, bWidth): corr0 = mp.cov2corr(cov0) eVal0, eVec0 = mp.getPCA(corr0) eMax0, var0 = mp.findMaxEval(np.diag(eVal0), q, bWidth) nFacts0 = eVal0.shape[0]-np.diag(eVal0)[::-1].searchsorted(eMax0) corr1 = mp.denoisedCorr(eVal0, eVec0, nFacts0) #denoising by constant residual eigenvalue method cov1 = corr2cov(corr1, np.diag(cov0)**.5) return cov1
# use matrix of returns to calc correlation S, instrument_returns = calculate_returns(S_value) _, instrument_returns = calculate_returns(S_value, percentageAsProduct=True) #S = S_value #print performance ascending print(np.asarray(portfolio_name)[np.argsort(instrument_returns)]) #calculate_correlation(S) eVal0, eVec0, denoised_eVal, denoised_eVec, denoised_corr, var0 = denoise_OL( S) detoned_corr = mp.detoned_corr(denoised_corr, denoised_eVal, denoised_eVec, market_component=1) detoned_eVal, detoned_eVec = mp.getPCA(detoned_corr) denoised_eigenvalue = np.diag(denoised_eVal) eigenvalue_prior = np.diag(eVal0) plt.plot(range(0, len(denoised_eigenvalue)), np.log(denoised_eigenvalue), color='r', label="Denoised eigen-function") plt.plot(range(0, len(eigenvalue_prior)), np.log(eigenvalue_prior), color='g', label="Original eigen-function") plt.xlabel("Eigenvalue number") plt.ylabel("Eigenvalue (log-scale)") plt.legend(loc="upper right") plt.show()