├── .DS_Store ├── README.md ├── .gitignore ├── denoise.py ├── CovMatrix.py ├── 3_Distance_Metrics.ipynb ├── 5_financial_lables.ipynb └── 4_Optimal_Clustering.ipynb /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shuangology/Machine-Learning-for-Asset-Managers/HEAD/.DS_Store -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Machine-Learning-for-Asset-Managers 2 | Implementation of code snippets and exercises in the book Machine Learning for Asset Managers written by Prof. Marcos López de Prado. 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | .idea 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /denoise.py: -------------------------------------------------------------------------------- 1 | import numpy as np,pandas as pd 2 | import matplotlib.pyplot as plt 3 | 4 | #%% md 5 | 6 | ## The Marcenko-Pastur Theorem 7 | 8 | 9 | #%% md 10 | 11 | ### SNIPPET 2.1 12 | 13 | #%% 14 | 15 | 16 | #--------------------------------------------------- 17 | 18 | def mpPDF(var,q,pts): 19 | # Marcenko-Pastur pdf 20 | # q=T/N 21 | # when var= 1, C = T^-1 X'X is the correlation matrix associated with X 22 | # lambda+ =,lambda- = eMax, eMin 23 | eMin,eMax=var*(1-(1./q)**.5)**2,var*(1+(1./q)**.5)**2 24 | eVal=np.linspace(eMin,eMax,pts) 25 | pdf=q/(2*np.pi*var*eVal)*((eMax-eVal)*(eVal-eMin))**.5 26 | #pdf = pdf.ravel() 27 | pdf=pd.Series(pdf,index=eVal) 28 | return pdf 29 | 30 | 31 | #%% md 32 | 33 | ### SNIPPET 2.2 34 | 35 | #%% 36 | 37 | from sklearn.neighbors.kde import KernelDensity 38 | #--------------------------------------------------- 39 | def getPCA(matrix): 40 | # Get eVal,eVec from a Hermitian matrix 41 | eVal,eVec=np.linalg.eigh(matrix) 42 | indices=eVal.argsort()[::-1] # arguments for sorting eVal desc 43 | eVal,eVec=eVal[indices],eVec[:,indices] 44 | eVal=np.diagflat(eVal) 45 | return eVal,eVec 46 | #--------------------------------------------------- 47 | def fitKDE(obs,bWidth=.25,kernel='gaussian',x=None): 48 | # Fit kernel to a series of obs, and derive the prob of obs 49 | # x is the array of values on which the fit KDE will be evaluated 50 | if len(obs.shape)==1: 51 | obs=obs.reshape(-1,1) 52 | kde=KernelDensity(kernel=kernel,bandwidth=bWidth).fit(obs) 53 | if x is None: 54 | x=np.unique(obs).reshape(-1,1) 55 | if len(x.shape)==1: 56 | x=x.reshape(-1,1) 57 | logProb=kde.score_samples(x) # log(density) 58 | pdf=pd.Series(np.exp(logProb),index=x.flatten()) 59 | return pdf 60 | 61 | 62 | #%% 63 | 64 | #--------------------------------------------------- 65 | x=np.random.normal(size=(10000,1000)) 66 | eVal0,eVec0=getPCA(np.corrcoef(x,rowvar=False)) # each column is a variable 67 | pdf0=mpPDF(1.,q=x.shape[0]/float(x.shape[1]),pts=1000) 68 | pdf1=fitKDE(np.diag(eVal0),bWidth=.01) # empirical pdf 69 | ax = plt.figure().add_subplot(111) 70 | ax.plot(pdf0,label= 'Marcenko-Pastur') 71 | ax.plot(pdf1,linestyle = '--',label= 'Empirical:KDE') 72 | ax.set_xlabel(r'$\lambda$') 73 | ax.set_ylabel(r'prob[$\lambda$]') 74 | ax.legend() 75 | 76 | #%% md 77 | 78 | 79 | ## Random Matrix with Signal (not perfectly random) 80 | 81 | #%% 82 | 83 | #SNIPPET 2.3 ADD SIGNAL TO A RANDOM COVARIANCE MATRIX 84 | def getRndCov(nCols,nFacts): 85 | w=np.random.normal(size=(nCols,nFacts)) 86 | cov=np.dot(w,w.T) # random cov matrix, however not full rank 87 | cov+=np.diag(np.random.uniform(size=nCols)) # full rank cov 88 | return cov 89 | #--------------------------------------------------- 90 | def cov2corr(cov): 91 | # Derive the correlation matrix from a covariance matrix 92 | std=np.sqrt(np.diag(cov)) 93 | corr=cov/np.outer(std,std) 94 | corr[corr<-1],corr[corr>1]=-1,1 # numerical error 95 | return corr 96 | #--------------------------------------------------- 97 | alpha,nCols,nFact,q=.995,1000,100,10 98 | cov=np.cov(np.random.normal(size=(nCols*q,nCols)),rowvar=False) 99 | cov=alpha*cov+(1-alpha)*getRndCov(nCols,nFact) # noise+signal 100 | corr0=cov2corr(cov) 101 | eVal0,eVec0=getPCA(corr0) 102 | 103 | #%% 104 | 105 | #SNIPPET 2.4 FITTING THE MARCENKO–PASTUR PDF 106 | from scipy.optimize import minimize 107 | #--------------------------------------------------- 108 | def errPDFs(var,eVal,q,bWidth,pts=1000): 109 | # Fit error 110 | var = var[0] 111 | pdf0=mpPDF(var,q,pts) # theoretical pdf 112 | pdf1=fitKDE(eVal,bWidth,x=pdf0.index.values) # empirical pdf 113 | #import pdb; pdb.set_trace() 114 | sse=np.sum((pdf1-pdf0)**2) 115 | return sse 116 | #--------------------------------------------------- 117 | def findMaxEval(eVal,q,bWidth): 118 | # Find max random eVal by fitting Marcenko’s dist 119 | out=minimize(lambda *x: errPDFs(*x),.5,args=(eVal,q,bWidth),bounds=((1E-5,1-1E-5),)) 120 | if out['success']: 121 | var=out['x'][0] 122 | else: 123 | var=1 124 | eMax=var*(1+(1./q)**.5)**2 125 | return eMax,var 126 | #--------------------------------------------------- 127 | eMax0,var0=findMaxEval(np.diag(eVal0),q,bWidth=.01) 128 | nFacts0=eVal0.shape[0]-np.diag(eVal0)[::-1].searchsorted(eMax0) 129 | 130 | # nFacts0 gives the number of the eigenvalue is assumed to be important (cutoff level lambda+ adjusted for the presence of nonrandom eigenvectors) 131 | 132 | #%% 133 | 134 | #--------------------------------------------------- 135 | # Fitting the Marcenko–Pastur PDF on a noisy covariance matrix. 136 | # estimate the sigma for Marcenko-Pastur dist 137 | bWidth=0.01 138 | out=minimize(lambda *x: errPDFs(*x),.5,args=(np.diag(eVal0),q,bWidth),bounds=((1E-5,1-1E-5),)) 139 | if out['success']: 140 | var=out['x'][0] 141 | else: 142 | var=1 143 | 144 | pdf0=mpPDF(var,q,pts=1000) # Marcenko-Pastur dist 145 | pdf1=fitKDE(np.diag(eVal0),bWidth=.01) # empirical pdf 146 | ax = plt.figure().add_subplot(111) 147 | ax.plot(pdf0,label= 'Marcenko-Pastur dist') 148 | ax.bar(pdf1.index,pdf1.values,width = bWidth,label= 'Empirical dist',color = 'darkorange') 149 | ax.set_xlabel(r'$\lambda$') 150 | ax.set_ylabel(r'prob[$\lambda$]') 151 | ax.legend() 152 | 153 | #%% md 154 | 155 | ## 2.5 Denoising 156 | 157 | #%% md 158 | 159 | ### 2.5.1 Constant Residual Eigenvalue Method 160 | 161 | setting a constant eigenvalue for all random eigenvectors. 162 | 163 | #%% 164 | 165 | def denoisedCorr(eVal,eVec,nFacts): 166 | # Remove noise from corr by fixing random eigenvalues 167 | eVal_=np.diag(eVal).copy() 168 | eVal_[nFacts:]=eVal_[nFacts:].sum()/float(eVal_.shape[0]-nFacts) # average the rest 169 | eVal_=np.diag(eVal_) 170 | corr1=np.dot(eVec,eVal_).dot(eVec.T) 171 | corr1=cov2corr(corr1) 172 | return corr1 173 | #--------------------------------------------------- 174 | corr1=denoisedCorr(eVal0,eVec0,nFacts0) 175 | eVal1,eVec1=getPCA(corr1) 176 | 177 | #%% 178 | 179 | # A comparison of eigenvalues before and after applying the residual eigenvalue method. 180 | ax = plt.figure().add_subplot(111) 181 | ax.plot(np.diagonal(eVal0),label = 'Original eigen-function') 182 | ax.plot(np.diagonal(eVal1),label = 'Denoised eigen-function (Constant Residual)',linestyle = '--') 183 | ax.legend() 184 | ax.set_yscale('log') 185 | ax.set_xlabel('Eigenvalue number') 186 | ax.set_ylabel('Eigenvalue (log-scale)') 187 | 188 | #%% md 189 | 190 | ### 2.5.2 Targeted Shrinkage 191 | $\alpha$ regulates the amount fo shrinkage among the eigen vectors 192 | 193 | #%% 194 | 195 | #SNIPPET 2.6 DENOISING BY TARGETED SHRINKAGE 196 | def denoisedCorr2(eVal,eVec,nFacts,alpha=0): 197 | # Remove noise from corr through targeted shrinkage 198 | eValL,eVecL=eVal[:nFacts,:nFacts],eVec[:,:nFacts] 199 | eValR,eVecR=eVal[nFacts:,nFacts:],eVec[:,nFacts:] 200 | corr0=np.dot(eVecL,eValL).dot(eVecL.T) 201 | corr1=np.dot(eVecR,eValR).dot(eVecR.T) 202 | corr2=corr0+alpha*corr1+(1-alpha)*np.diag(np.diag(corr1)) 203 | return corr2 204 | #--------------------------------------------------- 205 | corr1=denoisedCorr2(eVal0,eVec0,nFacts0,alpha=.5) 206 | eVal1,eVec1=getPCA(corr1) 207 | 208 | #%% 209 | 210 | # A comparison of eigenvalues before and after applying the residual eigenvalue method. 211 | ax = plt.figure().add_subplot(111) 212 | ax.plot(np.diagonal(eVal0),label = 'Original eigen-function') 213 | ax.plot(np.diagonal(eVal1),label = 'Denoised eigen-function (targeted shrinkage)',linestyle = '--') 214 | ax.legend() 215 | ax.set_yscale('log') 216 | ax.set_xlabel('Eigenvalue number') 217 | ax.set_ylabel('Eigenvalue (log-scale)') 218 | 219 | #%% md 220 | 221 | # Experimental Results 222 | ## 2.7.1 Minimum Variance Portfolio 223 | 224 | #%% 225 | 226 | def corr2cov(corr,std): 227 | # Derive the covariance matrix from a correlation matrix 228 | corr[corr<-1],corr[corr>1]=-1,1 # numerical error 229 | cov = np.outer(std,std)*corr 230 | return cov 231 | 232 | #%% 233 | 234 | 235 | #SNIPPET 2.7 GENERATING A BLOCK-DIAGONAL COVARIANCE MATRIX AND A VECTOR OF MEANS 236 | def formBlockMatrix(nBlocks,bSize,bCorr): 237 | block=np.ones((bSize,bSize))*bCorr 238 | block[range(bSize),range(bSize)]=1 239 | corr=block_diag(*([block]*nBlocks)) 240 | return corr 241 | #--------------------------------------------------- 242 | def formTrueMatrix(nBlocks,bSize,bCorr): 243 | #In each block, the variances are drawn from a uniform distribution bounded between 5% and 20%; the vector of means is drawn from a Normal distribution with mean and standard deviation equal to the standard deviation from the covariance matrix 244 | corr0=formBlockMatrix(nBlocks,bSize,bCorr) 245 | corr0=pd.DataFrame(corr0) 246 | cols=corr0.columns.tolist() 247 | np.random.shuffle(cols) 248 | corr0=corr0[cols].loc[cols].copy(deep=True) 249 | std0=np.random.uniform(.05,.2,corr0.shape[0]) 250 | cov0=corr2cov(corr0,std0) 251 | mu0=np.random.normal(std0,std0,cov0.shape[0]).reshape(-1,1) 252 | return mu0,cov0 253 | #--------------------------------------------------- 254 | from scipy.linalg import block_diag 255 | from sklearn.covariance import LedoitWolf 256 | nBlocks,bSize,bCorr=10,50,.5 257 | np.random.seed(0) 258 | mu0,cov0=formTrueMatrix(nBlocks,bSize,bCorr) 259 | 260 | #%% 261 | 262 | #SNIPPET 2.8 GENERATING THE EMPIRICAL COVARIANCE MATRIX 263 | def simCovMu(mu0,cov0,nObs,shrink=False): 264 | x=np.random.multivariate_normal(mu0.flatten(),cov0,size=nObs) 265 | mu1=x.mean(axis=0).reshape(-1,1) 266 | if shrink: 267 | cov1=LedoitWolf().fit(x).covariance_ 268 | else: 269 | cov1=np.cov(x,rowvar=0) 270 | return mu1,cov1 271 | 272 | #%% 273 | 274 | # SNIPPET 2.9 DENOISING OF THE EMPIRICAL COVARIANCE MATRIX 275 | def deNoiseCov(cov0,q,bWidth): 276 | corr0=cov2corr(cov0) 277 | eVal0,eVec0=getPCA(corr0) 278 | eMax0,var0=findMaxEval(np.diag(eVal0),q,bWidth) 279 | nFacts0=eVal0.shape[0]-np.diag(eVal0)[::-1].searchsorted(eMax0) 280 | corr1=denoisedCorr(eVal0,eVec0,nFacts0) 281 | cov1=corr2cov(corr1,np.diag(cov0)**.5) 282 | return cov1 283 | 284 | #%% 285 | 286 | #SNIPPET 2.10 DENOISING OF THE EMPIRICAL COVARIANCE MATRIX 287 | def optPort(cov,mu=None): # optimal portfolio for minimum variance 288 | inv=np.linalg.inv(cov) 289 | ones=np.ones(shape=(inv.shape[0],1)) 290 | if mu is None: 291 | mu=ones 292 | w=np.dot(inv,mu) 293 | w/=np.dot(ones.T,w) 294 | return w -------------------------------------------------------------------------------- /CovMatrix.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding: utf-8 3 | 4 | # # Chapter 2 Denoising and Detoning 5 | # 6 | # reduce the noise and enhance the signal included in an empirical covariance matrix. 7 | 8 | # In[1]: 9 | 10 | 11 | import numpy as np,pandas as pd 12 | import matplotlib.pyplot as plt 13 | from tqdm import tqdm 14 | 15 | # ## The Marcenko-Pastur Theorem 16 | # 17 | 18 | # ### SNIPPET 2.1 19 | 20 | # In[2]: 21 | 22 | 23 | 24 | #--------------------------------------------------- 25 | 26 | def mpPDF(var,q,pts): 27 | # Marcenko-Pastur pdf 28 | # q=T/N 29 | # when var= 1, C = T^-1 X'X is the correlation matrix associated with X 30 | # lambda+ =,lambda- = eMax, eMin 31 | eMin,eMax=var*(1-(1./q)**.5)**2,var*(1+(1./q)**.5)**2 32 | eVal=np.linspace(eMin,eMax,pts) 33 | pdf=q/(2*np.pi*var*eVal)*((eMax-eVal)*(eVal-eMin))**.5 34 | #pdf = pdf.ravel() 35 | pdf=pd.Series(pdf,index=eVal) 36 | return pdf 37 | 38 | 39 | # ### SNIPPET 2.2 40 | 41 | # In[3]: 42 | 43 | 44 | from sklearn.neighbors.kde import KernelDensity 45 | #--------------------------------------------------- 46 | def getPCA(matrix): 47 | # Get eVal,eVec from a Hermitian matrix 48 | eVal,eVec=np.linalg.eigh(matrix) 49 | indices=eVal.argsort()[::-1] # arguments for sorting eVal desc 50 | eVal,eVec=eVal[indices],eVec[:,indices] 51 | eVal=np.diagflat(eVal) 52 | return eVal,eVec 53 | #--------------------------------------------------- 54 | def fitKDE(obs,bWidth=.25,kernel='gaussian',x=None): 55 | # Fit kernel to a series of obs, and derive the prob of obs 56 | # x is the array of values on which the fit KDE will be evaluated 57 | if len(obs.shape)==1: 58 | obs=obs.reshape(-1,1) 59 | kde=KernelDensity(kernel=kernel,bandwidth=bWidth).fit(obs) 60 | if x is None: 61 | x=np.unique(obs).reshape(-1,1) 62 | if len(x.shape)==1: 63 | x=x.reshape(-1,1) 64 | logProb=kde.score_samples(x) # log(density) 65 | pdf=pd.Series(np.exp(logProb),index=x.flatten()) 66 | return pdf 67 | 68 | 69 | 70 | 71 | # 72 | # ## Random Matrix with Signal (not perfectly random) 73 | 74 | # In[5]: 75 | 76 | 77 | #SNIPPET 2.3 ADD SIGNAL TO A RANDOM COVARIANCE MATRIX 78 | def getRndCov(nCols,nFacts): 79 | w=np.random.normal(size=(nCols,nFacts)) 80 | cov=np.dot(w,w.T) # random cov matrix, however not full rank 81 | cov+=np.diag(np.random.uniform(size=nCols)) # full rank cov 82 | return cov 83 | #--------------------------------------------------- 84 | def cov2corr(cov): 85 | # Derive the correlation matrix from a covariance matrix 86 | std=np.sqrt(np.diag(cov)) 87 | corr=cov/np.outer(std,std) 88 | corr[corr<-1],corr[corr>1]=-1,1 # numerical error 89 | return corr 90 | 91 | 92 | 93 | #SNIPPET 2.4 FITTING THE MARCENKO–PASTUR PDF 94 | from scipy.optimize import minimize 95 | #--------------------------------------------------- 96 | def errPDFs(var,eVal,q,bWidth,pts=1000): 97 | # Fit error 98 | var = var[0] 99 | pdf0=mpPDF(var,q,pts) # theoretical pdf 100 | pdf1=fitKDE(eVal,bWidth,x=pdf0.index.values) # empirical pdf 101 | #import pdb; pdb.set_trace() 102 | sse=np.sum((pdf1-pdf0)**2) 103 | return sse 104 | #--------------------------------------------------- 105 | def findMaxEval(eVal,q,bWidth): 106 | # Find max random eVal by fitting Marcenko’s dist 107 | out=minimize(lambda *x: errPDFs(*x),.5,args=(eVal,q,bWidth),bounds=((1E-5,1-1E-5),)) 108 | if out['success']: 109 | var=out['x'][0] 110 | else: 111 | var=1 112 | eMax=var*(1+(1./q)**.5)**2 113 | return eMax,var 114 | 115 | # ax = plt.figure().add_subplot(111) 116 | # ax.plot(pdf0,label= 'Marcenko-Pastur') 117 | # ax.plot(pdf1,linestyle = '--',label= 'Empirical:KDE') 118 | # ax.set_xlabel(r'$\lambda$') 119 | # ax.set_ylabel(r'prob[$\lambda$]') 120 | # ax.legend() 121 | 122 | 123 | #--------------------------------------------------- 124 | 125 | #--------------------------------------------------- 126 | 127 | 128 | # nFacts0 gives the number of the eigenvalue is assumed to be important (cutoff level lambda+ adjusted for the presence of nonrandom eigenvectors) 129 | 130 | 131 | # In[7]: 132 | 133 | 134 | #--------------------------------------------------- 135 | # Fitting the Marcenko–Pastur PDF on a noisy covariance matrix. 136 | # estimate the sigma for Marcenko-Pastur dist 137 | # bWidth=0.01 138 | # out=minimize(lambda *x: errPDFs(*x),.5,args=(np.diag(eVal0),q,bWidth),bounds=((1E-5,1-1E-5),)) 139 | # if out['success']: 140 | # var=out['x'][0] 141 | # else: 142 | # var=1 143 | # 144 | # pdf0=mpPDF(var,q,pts=1000) # Marcenko-Pastur dist 145 | # pdf1=fitKDE(np.diag(eVal0),bWidth=.01) # empirical pdf 146 | # ax = plt.figure().add_subplot(111) 147 | # ax.plot(pdf0,label= 'Marcenko-Pastur dist') 148 | # ax.bar(pdf1.index,pdf1.values,width = bWidth,label= 'Empirical dist',color = 'darkorange') 149 | # ax.set_xlabel(r'$\lambda$') 150 | # ax.set_ylabel(r'prob[$\lambda$]') 151 | # ax.legend() 152 | 153 | 154 | # ## 2.5 Denoising 155 | 156 | # ### 2.5.1 Constant Residual Eigenvalue Method 157 | # 158 | # setting a constant eigenvalue for all random eigenvectors. 159 | 160 | # In[8]: 161 | 162 | 163 | def denoisedCorr(eVal,eVec,nFacts): 164 | # Remove noise from corr by fixing random eigenvalues 165 | eVal_=np.diag(eVal).copy() 166 | eVal_[nFacts:]=eVal_[nFacts:].sum()/float(eVal_.shape[0]-nFacts) # average the rest 167 | eVal_=np.diag(eVal_) 168 | corr1=np.dot(eVec,eVal_).dot(eVec.T) 169 | corr1=cov2corr(corr1) 170 | return corr1 171 | #--------------------------------------------------- 172 | 173 | 174 | 175 | # In[9]: 176 | 177 | 178 | # # A comparison of eigenvalues before and after applying the residual eigenvalue method. 179 | # ax = plt.figure().add_subplot(111) 180 | # ax.plot(np.diagonal(eVal0),label = 'Original eigen-function') 181 | # ax.plot(np.diagonal(eVal1),label = 'Denoised eigen-function (Constant Residual)',linestyle = '--') 182 | # ax.legend() 183 | # ax.set_yscale('log') 184 | # ax.set_xlabel('Eigenvalue number') 185 | # ax.set_ylabel('Eigenvalue (log-scale)') 186 | 187 | 188 | # ### 2.5.2 Targeted Shrinkage 189 | # $\alpha$ regulates the amount fo shrinkage among the eigen vectors 190 | 191 | # In[10]: 192 | 193 | 194 | #SNIPPET 2.6 DENOISING BY TARGETED SHRINKAGE 195 | def denoisedCorr2(eVal,eVec,nFacts,alpha=0.0): 196 | # Remove noise from corr through targeted shrinkage 197 | eValL,eVecL=eVal[:nFacts,:nFacts],eVec[:,:nFacts] 198 | eValR,eVecR=eVal[nFacts:,nFacts:],eVec[:,nFacts:] 199 | corr0=np.dot(eVecL,eValL).dot(eVecL.T) 200 | corr1=np.dot(eVecR,eValR).dot(eVecR.T) 201 | corr2=corr0+alpha*corr1+(1-alpha)*np.diag(np.diag(corr1)) 202 | return corr2 203 | #--------------------------------------------------- 204 | 205 | 206 | 207 | # In[11]: 208 | 209 | 210 | # # A comparison of eigenvalues before and after applying the residual eigenvalue method. 211 | # ax = plt.figure().add_subplot(111) 212 | # ax.plot(np.diagonal(eVal0),label = 'Original eigen-function') 213 | # ax.plot(np.diagonal(eVal1),label = 'Denoised eigen-function (targeted shrinkage)',linestyle = '--') 214 | # ax.legend() 215 | # ax.set_yscale('log') 216 | # ax.set_xlabel('Eigenvalue number') 217 | # ax.set_ylabel('Eigenvalue (log-scale)') 218 | 219 | 220 | # # Experimental Results 221 | # ## 2.7.1 Minimum Variance Portfolio 222 | 223 | # In[12]: 224 | 225 | 226 | def corr2cov(corr,std): 227 | # Derive the covariance matrix from a correlation matrix 228 | corr[corr<-1],corr[corr>1]=-1,1 # numerical error 229 | cov = np.outer(std,std)*corr 230 | return cov 231 | 232 | 233 | # In[13]: 234 | 235 | 236 | 237 | #SNIPPET 2.7 GENERATING A BLOCK-DIAGONAL COVARIANCE MATRIX AND A VECTOR OF MEANS 238 | def formBlockMatrix(nBlocks,bSize,bCorr): 239 | block=np.ones((bSize,bSize))*bCorr 240 | block[range(bSize),range(bSize)]=1 241 | corr=block_diag(*([block]*nBlocks)) 242 | return corr 243 | #--------------------------------------------------- 244 | def formTrueMatrix(nBlocks,bSize,bCorr): 245 | #In each block, the variances are drawn from a uniform distribution bounded between 5% and 20%; the vector of means is drawn from a Normal distribution with mean and standard deviation equal to the standard deviation from the covariance matrix 246 | corr0=formBlockMatrix(nBlocks,bSize,bCorr) 247 | corr0=pd.DataFrame(corr0) 248 | cols=corr0.columns.tolist() 249 | np.random.shuffle(cols) 250 | corr0=corr0[cols].loc[cols].copy(deep=True) 251 | std0=np.random.uniform(.05,.2,corr0.shape[0]) 252 | cov0=corr2cov(corr0,std0) 253 | mu0=np.random.normal(std0,std0,cov0.shape[0]).reshape(-1,1) 254 | return mu0,cov0 255 | #--------------------------------------------------- 256 | from scipy.linalg import block_diag 257 | from sklearn.covariance import LedoitWolf 258 | nBlocks,bSize,bCorr=10,50,.5 259 | np.random.seed(0) 260 | mu0,cov0=formTrueMatrix(nBlocks,bSize,bCorr) 261 | 262 | 263 | # In[14]: 264 | 265 | 266 | #SNIPPET 2.8 GENERATING THE EMPIRICAL COVARIANCE MATRIX 267 | def simCovMu(mu0,cov0,nObs,shrink=False): 268 | x=np.random.multivariate_normal(mu0.flatten(),cov0,size=nObs) 269 | mu1=x.mean(axis=0).reshape(-1,1) 270 | if shrink: 271 | cov1=LedoitWolf().fit(x).covariance_ 272 | else: 273 | cov1=np.cov(x,rowvar=0) 274 | return mu1,cov1 275 | 276 | 277 | # In[15]: 278 | 279 | 280 | # SNIPPET 2.9 DENOISING OF THE EMPIRICAL COVARIANCE MATRIX 281 | def deNoiseCov(cov0,q,bWidth): 282 | corr0=cov2corr(cov0) 283 | eVal0,eVec0=getPCA(corr0) 284 | eMax0,var0=findMaxEval(np.diag(eVal0),q,bWidth) 285 | nFacts0=eVal0.shape[0]-np.diag(eVal0)[::-1].searchsorted(eMax0) 286 | corr1=denoisedCorr(eVal0,eVec0,nFacts0) 287 | cov1=corr2cov(corr1,np.diag(cov0)**.5) 288 | return cov1 289 | 290 | 291 | # In[16]: 292 | 293 | 294 | #SNIPPET 2.10 DENOISING OF THE EMPIRICAL COVARIANCE MATRIX 295 | def optPort(cov,mu=None): # optimal portfolio for minimum variance 296 | inv=np.linalg.inv(cov) 297 | ones=np.ones(shape=(inv.shape[0],1)) 298 | if mu is None: 299 | mu=ones 300 | w=np.dot(inv,mu) 301 | w/=np.dot(ones.T,w) 302 | return w 303 | # #--------------------------------------------------- 304 | # nObs,nTrials,bWidth,shrink,minVarPortf=1000,100,.01,False,True 305 | # w1= w1_s=pd.DataFrame(columns=range(cov0.shape[0]), 306 | # index=range(nTrials),dtype=float) 307 | # w1_d=w1.copy(deep=True) 308 | # w1_s_d = w1_s.copy(deep = True) 309 | # np.random.seed(0) 310 | # for i in tqdm(range(nTrials)): 311 | # mu1,cov1=simCovMu(mu0,cov0,nObs,shrink=True) 312 | # if minVarPortf: 313 | # mu1=None 314 | # cov1_d=deNoiseCov(cov1,nObs*1./cov1.shape[1],bWidth) 315 | # w1_s.loc[i]=optPort(cov1,mu1).flatten() 316 | # w1_s_d.loc[i]=optPort(cov1_d,mu1).flatten() 317 | # 318 | # 319 | # for i in tqdm(range(nTrials)): 320 | # mu1,cov1=simCovMu(mu0,cov0,nObs,shrink=False) 321 | # if minVarPortf: 322 | # mu1=None 323 | # cov1_d=deNoiseCov(cov1,nObs*1./cov1.shape[1],bWidth) 324 | # w1.loc[i]=optPort(cov1,mu1).flatten() 325 | # w1_d.loc[i]=optPort(cov1_d,mu1).flatten() 326 | 327 | 328 | # In[18]: 329 | 330 | 331 | # #SNIPPET 2.11 ROOT-MEAN-SQUARE ERRORS 332 | # w0=optPort(cov0,None if minVarPortf else mu0) 333 | # w0=np.repeat(w0.T,w1.shape[0],axis=0) 334 | # rmsd=np.mean((w1-w0).values.flatten()**2)**.5 # RMSE not shrunk not denoised 335 | # rmsd_d=np.mean((w1_d-w0).values.flatten()**2)**.5 # RMSE not shrunk denoised 336 | # rmsd_s=np.mean((w1_s-w0).values.flatten()**2)**.5 # RMSE shrunk not denoised 337 | # rmsd_s_d=np.mean((w1_s_d-w0).values.flatten()**2)**.5 # RMSE shrunk denoised 338 | # 339 | # res_tab = pd.DataFrame(columns = ['Note denoised','Denoised'],index = ['Not shrunk','Shrunk'],data = np.array([[rmsd,rmsd_d],[rmsd_s,rmsd_s_d]])) 340 | # 341 | 342 | # #-------------------------------------------------------- 343 | 344 | alpha, nCols, nFact, q = .995, 1000, 100, 10 345 | def init_para(): 346 | 347 | cov=np.cov(np.random.normal(size=(nCols*q,nCols)),rowvar=False) 348 | cov=alpha*cov+(1-alpha)*getRndCov(nCols,nFact) # noise+signal 349 | corr0=cov2corr(cov) 350 | eVal0,eVec0=getPCA(corr0) 351 | return corr0,eVal0,eVec0 352 | 353 | def denoise_init(method = 1): 354 | corr0, eVal0, eVec0 = init_para() 355 | eMax0,var0=findMaxEval(np.diag(eVal0),q,bWidth=.01) 356 | nFacts0=eVal0.shape[0]-np.diag(eVal0)[::-1].searchsorted(eMax0) 357 | 358 | if method==1: 359 | corr1=denoisedCorr(eVal0,eVec0,nFacts0) 360 | eVal1,eVec1=getPCA(corr1) 361 | else: 362 | corr1=denoisedCorr2(eVal0,eVec0,nFacts0,alpha=.5) 363 | eVal1,eVec1=getPCA(corr1) 364 | return corr0,eVal1,eVec1 365 | 366 | 367 | 368 | 369 | 370 | -------------------------------------------------------------------------------- /3_Distance_Metrics.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Chapter 3 Distance Metrics\n", 8 | "\n", 9 | "Look beyond correlations to understand codependency" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 1, 15 | "metadata": { 16 | "ExecuteTime": { 17 | "end_time": "2020-08-27T21:32:53.539199Z", 18 | "start_time": "2020-08-27T21:32:52.544815Z" 19 | } 20 | }, 21 | "outputs": [], 22 | "source": [ 23 | "import numpy as np,pandas as pd\n", 24 | "import matplotlib.pyplot as plt\n", 25 | "from tqdm.notebook import tqdm" 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": 4, 31 | "metadata": { 32 | "ExecuteTime": { 33 | "end_time": "2020-08-27T21:33:16.310384Z", 34 | "start_time": "2020-08-27T21:33:16.295300Z" 35 | } 36 | }, 37 | "outputs": [ 38 | { 39 | "name": "stdout", 40 | "output_type": "stream", 41 | "text": [ 42 | "****************\n", 43 | "\n", 44 | "hX marginal entropy: 4.074017112668638\n", 45 | "hY marginal entropy: 4.0747093273590576\n", 46 | "iXY mutual info score: 3.5435562540396055\n", 47 | "iXYn normalized mutual information: 0.8697941505990483\n", 48 | "hX_Y cross entropy between x and y : 0.5304608586290325\n", 49 | "hY_X cross entropy between y and x : 0.5311530733194516\n" 50 | ] 51 | } 52 | ], 53 | "source": [ 54 | "#SNIPPET 3.1 MARGINAL, JOINT, CONDITIONAL ENTROPIES, AND MUTUAL INFORMATION\n", 55 | "import numpy as np,scipy.stats as ss\n", 56 | "from sklearn.metrics import mutual_info_score\n", 57 | "\n", 58 | "x = np.random.random(100)\n", 59 | "y = np.random.random(100)\n", 60 | "bins = 100\n", 61 | "cXY=np.histogram2d(x,y,bins)[0] # The bi-dimensional histogram of samples x and y. Values in x are histogrammed along the first dimension and values in y are histogrammed along the second dimension.\n", 62 | "hX=ss.entropy(np.histogram(x,bins)[0]) # marginal \n", 63 | "hY=ss.entropy(np.histogram(y,bins)[0]) # marginal \n", 64 | "iXY=mutual_info_score(None,None,contingency=cXY) \n", 65 | "iXYn=iXY/min(hX,hY) # normalized mutual information \n", 66 | "hXY=hX+hY-iXY # joint\n", 67 | "hX_Y=hXY-hY # conditional\n", 68 | "hY_X=hXY-hX # conditional\n", 69 | "\n", 70 | "print('**'*8+'\\n')\n", 71 | "print('hX marginal entropy: {}'.format(hX))\n", 72 | "print('hY marginal entropy: {}'.format(hY))\n", 73 | "print('iXY mutual info score: {}'.format(iXY))\n", 74 | "print('iXYn normalized mutual information: {}'.format(iXYn))\n", 75 | "print('hX_Y cross entropy between x and y : {}'.format(hX_Y))\n", 76 | "print('hY_X cross entropy between y and x : {}'.format(hY_X))" 77 | ] 78 | }, 79 | { 80 | "cell_type": "code", 81 | "execution_count": 5, 82 | "metadata": { 83 | "ExecuteTime": { 84 | "end_time": "2020-08-27T21:33:19.716512Z", 85 | "start_time": "2020-08-27T21:33:19.703179Z" 86 | } 87 | }, 88 | "outputs": [], 89 | "source": [ 90 | "#SNIPPET 3.2 MUTUAL INFORMATION, VARIATION OF INFORMATION, AND NORMALIZED VARIATION OF INFORMATION\n", 91 | "def varInfo(x,y,bins,norm=False):\n", 92 | " # variation of information\n", 93 | " cXY=np.histogram2d(x,y,bins)[0] \n", 94 | " iXY=mutual_info_score(None,None,contingency=cXY) \n", 95 | " hX=ss.entropy(np.histogram(x,bins)[0]) # marginal \n", 96 | " hY=ss.entropy(np.histogram(y,bins)[0]) # marginal \n", 97 | " vXY=hX+hY-2*iXY # variation of information\n", 98 | " if norm:\n", 99 | " hXY=hX+hY-iXY # joint\n", 100 | " vXY/=hXY # normalized variation of information\n", 101 | " return vXY" 102 | ] 103 | }, 104 | { 105 | "cell_type": "code", 106 | "execution_count": 6, 107 | "metadata": { 108 | "ExecuteTime": { 109 | "end_time": "2020-08-27T21:33:20.703804Z", 110 | "start_time": "2020-08-27T21:33:20.689116Z" 111 | } 112 | }, 113 | "outputs": [], 114 | "source": [ 115 | "#SNIPPET 3.3 VARIATION OF INFORMATION ON DISCRETIZED CONTINUOUS RANDOM VARIABLES\n", 116 | "def numBins(nObs,corr=None):\n", 117 | "# Optimal number of bins for discretization \n", 118 | " if corr is None: # univariate case\n", 119 | " z=(8+324*nObs+12*(36*nObs+729*nObs**2)**.5)**(1/3.)\n", 120 | " b=round(z/6.+2./(3*z)+1./3) \n", 121 | " else: # bivariate case\n", 122 | " if (1.-corr**2)==0:\n", 123 | " corr = np.sign(corr)*(np.abs(corr)-1e-5) \n", 124 | " b=round(2**-.5*(1+(1+24*nObs/(1.-corr**2))**.5)**.5) \n", 125 | " return int(b)\n", 126 | "#--------------------------------------------------- \n", 127 | "def varInfo_optBIn(x,y,norm=False): # Discretized and with optimal bin value\n", 128 | " # variation of information\n", 129 | " bXY=numBins(x.shape[0],corr=np.corrcoef(x,y)[0,1]) \n", 130 | " cXY=np.histogram2d(x,y,bXY)[0] \n", 131 | " iXY=mutual_info_score(None,None,contingency=cXY) \n", 132 | " hX=ss.entropy(np.histogram(x,bXY)[0]) # marginal \n", 133 | " hY=ss.entropy(np.histogram(y,bXY)[0]) # marginal \n", 134 | " vXY=hX+hY-2*iXY # variation of information\n", 135 | " if norm:\n", 136 | " hXY=hX+hY-iXY # joint\n", 137 | " vXY/=hXY # normalized variation of information\n", 138 | " return vXY" 139 | ] 140 | }, 141 | { 142 | "cell_type": "code", 143 | "execution_count": 7, 144 | "metadata": { 145 | "ExecuteTime": { 146 | "end_time": "2020-08-27T21:33:21.627253Z", 147 | "start_time": "2020-08-27T21:33:21.586237Z" 148 | } 149 | }, 150 | "outputs": [], 151 | "source": [ 152 | "#SNIPPET 3.4 CORRELATION AND NORMALIZED MUTUAL INFORMATION OF TWO INDEPENDENT GAUSSIAN RANDOM VARIABLES\n", 153 | "def mutualInfo(x,y,norm=False):\n", 154 | " # mutual information\n", 155 | " bXY=numBins(x.shape[0],corr=np.corrcoef(x,y)[0,1]) \n", 156 | " cXY=np.histogram2d(x,y,bXY)[0] \n", 157 | " iXY=mutual_info_score(None,None,contingency=cXY) \n", 158 | " if norm:\n", 159 | " hX=ss.entropy(np.histogram(x,bXY)[0]) # marginal \n", 160 | " hY=ss.entropy(np.histogram(y,bXY)[0]) # marginal \n", 161 | " iXY/=min(hX,hY) # normalized mutual information\n", 162 | " return iXY \n", 163 | "#--------------------------------------------------- \n", 164 | "size,seed=5000,0\n", 165 | "np.random.seed(seed)\n", 166 | "x=np.random.normal(size=size)\n", 167 | "e=np.random.normal(size=size)\n", 168 | "y=0*x+e\n", 169 | "nmi=mutualInfo(x,y,True)\n", 170 | "corr=np.corrcoef(x,y)[0,1]" 171 | ] 172 | }, 173 | { 174 | "cell_type": "code", 175 | "execution_count": 18, 176 | "metadata": { 177 | "ExecuteTime": { 178 | "end_time": "2020-08-27T21:43:19.429289Z", 179 | "start_time": "2020-08-27T21:42:13.142102Z" 180 | } 181 | }, 182 | "outputs": [ 183 | { 184 | "data": { 185 | "application/vnd.jupyter.widget-view+json": { 186 | "model_id": "24994fcfd4b748ce8822bbec1a47195d", 187 | "version_major": 2, 188 | "version_minor": 0 189 | }, 190 | "text/plain": [ 191 | "HBox(children=(FloatProgress(value=0.0, max=5.0), HTML(value='')))" 192 | ] 193 | }, 194 | "metadata": {}, 195 | "output_type": "display_data" 196 | }, 197 | { 198 | "ename": "KeyboardInterrupt", 199 | "evalue": "", 200 | "output_type": "error", 201 | "traceback": [ 202 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 203 | "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", 204 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0mhX_Y\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhXY\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mhY\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;31m# conditional\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0mviXY\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mvarInfo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbins\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 23\u001b[0;31m \u001b[0mvi_t_XY\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mvarInfo_optBIn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 24\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0mfig\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 205 | "\u001b[0;32m\u001b[0m in \u001b[0;36mvarInfo_optBIn\u001b[0;34m(x, y, norm)\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;31m# variation of information\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0mbXY\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnumBins\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mcorr\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcorrcoef\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 16\u001b[0;31m \u001b[0mcXY\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhistogram2d\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mbXY\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 17\u001b[0m \u001b[0miXY\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmutual_info_score\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mcontingency\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcXY\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0mhX\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mss\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mentropy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhistogram\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mbXY\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# marginal\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 206 | "\u001b[0;32m<__array_function__ internals>\u001b[0m in \u001b[0;36mhistogram2d\u001b[0;34m(*args, **kwargs)\u001b[0m\n", 207 | "\u001b[0;32m/anaconda3/lib/python3.7/site-packages/numpy/lib/twodim_base.py\u001b[0m in \u001b[0;36mhistogram2d\u001b[0;34m(x, y, bins, range, normed, weights, density)\u001b[0m\n\u001b[1;32m 711\u001b[0m \u001b[0mxedges\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0myedges\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0masarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbins\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 712\u001b[0m \u001b[0mbins\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mxedges\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0myedges\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 713\u001b[0;31m \u001b[0mhist\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0medges\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhistogramdd\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbins\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnormed\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mweights\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdensity\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 714\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mhist\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0medges\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0medges\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 715\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", 208 | "\u001b[0;32m<__array_function__ internals>\u001b[0m in \u001b[0;36mhistogramdd\u001b[0;34m(*args, **kwargs)\u001b[0m\n", 209 | "\u001b[0;32m/anaconda3/lib/python3.7/site-packages/numpy/lib/histograms.py\u001b[0m in \u001b[0;36mhistogramdd\u001b[0;34m(sample, bins, range, normed, weights, density)\u001b[0m\n\u001b[1;32m 1098\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1099\u001b[0m \u001b[0;31m# This preserves the (bad) behavior observed in gh-7845, for now.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1100\u001b[0;31m \u001b[0mhist\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhist\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfloat\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcasting\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'safe'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1101\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1102\u001b[0m \u001b[0;31m# Remove outliers (indices 0 and -1 for each dimension).\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", 210 | "\u001b[0;31mKeyboardInterrupt\u001b[0m: " 211 | ] 212 | } 213 | ], 214 | "source": [ 215 | "# Exercise 3.13.1\n", 216 | "\n", 217 | "\n", 218 | "bins = 10\n", 219 | "\n", 220 | "rho_list = [-1, -0.5, 0, 0.5, 1]\n", 221 | "hX = hY = hXY = hX_Y = iXY = viXY = vi_t_XY = np.zeros(len(rho_list))\n", 222 | "for i in tqdm(range(len(rho_list))):\n", 223 | " rho = rho_list[i]\n", 224 | " mu, sigma = 0, 1\n", 225 | " rr = np.random.normal(mu, sigma, size=(2, 1000))\n", 226 | " x,y_ = rr[0,:],rr[1,:]\n", 227 | " y = rho * x+np.sqrt(1-rho**2)*y_\n", 228 | "\n", 229 | " # The bi-dimensional histogram of samples x and y. Values in x are histogrammed along the first dimension and values in y are histogrammed along the second dimension.\n", 230 | " cXY = np.histogram2d(x, y, bins)[0]\n", 231 | " hX[i] = ss.entropy(np.histogram(x, bins)[0]) # marginal\n", 232 | " hY[i] = ss.entropy(np.histogram(y, bins)[0]) # marginal\n", 233 | " iXY[i] = mutual_info_score(None, None, contingency=cXY)\n", 234 | " hXY[i] = hX[i]+hY[i]-iXY[i] # joint\n", 235 | " hX_Y[i] = hXY[i]-hY[i] # conditional\n", 236 | " viXY[i] = varInfo(x, y, bins)\n", 237 | " vi_t_XY[i] = varInfo_optBIn(x, y)\n", 238 | "\n", 239 | "fig = plt.figure()\n", 240 | "ax = fig.add_subplot(111)\n", 241 | "ax.plot(rho_list, hX, label='H[X]')\n", 242 | "ax.plot(rho_list, hY, label='H[Y]')\n", 243 | "# ax.plot(rho_list, hXY, label='H[X,Y]')\n", 244 | "# ax.plot(rho_list, hX_Y, label='H[X|Y]')\n", 245 | "# ax.plot(rho_list, iXY, label='I[X,Y]')\n", 246 | "# ax.plot(rho_list, viXY, label='VI[X,Y]')\n", 247 | "# ax.plot(rho_list, vi_t_XY, label=r'$\\tilde{VI}$[X,Y]')\n", 248 | "ax.legend()" 249 | ] 250 | }, 251 | { 252 | "cell_type": "code", 253 | "execution_count": 17, 254 | "metadata": { 255 | "ExecuteTime": { 256 | "end_time": "2020-08-27T21:42:04.009916Z", 257 | "start_time": "2020-08-27T21:42:03.994430Z" 258 | } 259 | }, 260 | "outputs": [ 261 | { 262 | "data": { 263 | "text/plain": [ 264 | "array([[1., 0., 0., ..., 0., 0., 0.],\n", 265 | " [0., 1., 0., ..., 0., 0., 0.],\n", 266 | " [0., 0., 0., ..., 0., 0., 0.],\n", 267 | " ...,\n", 268 | " [0., 0., 0., ..., 0., 0., 0.],\n", 269 | " [0., 0., 0., ..., 0., 0., 0.],\n", 270 | " [0., 0., 0., ..., 0., 0., 1.]])" 271 | ] 272 | }, 273 | "execution_count": 17, 274 | "metadata": {}, 275 | "output_type": "execute_result" 276 | } 277 | ], 278 | "source": [ 279 | "cXY = np.histogram2d(x, y, bins)[0]\n", 280 | "cXY" 281 | ] 282 | }, 283 | { 284 | "cell_type": "code", 285 | "execution_count": 20, 286 | "metadata": { 287 | "ExecuteTime": { 288 | "end_time": "2020-08-27T21:30:50.493228Z", 289 | "start_time": "2020-08-27T21:30:50.479832Z" 290 | } 291 | }, 292 | "outputs": [ 293 | { 294 | "data": { 295 | "text/plain": [ 296 | "(1000,)" 297 | ] 298 | }, 299 | "execution_count": 20, 300 | "metadata": {}, 301 | "output_type": "execute_result" 302 | } 303 | ], 304 | "source": [ 305 | "rr = np.random.normal(mu, sigma, size=(2, 1000))\n", 306 | "rr[0,:].shape" 307 | ] 308 | }, 309 | { 310 | "cell_type": "code", 311 | "execution_count": null, 312 | "metadata": {}, 313 | "outputs": [], 314 | "source": [] 315 | } 316 | ], 317 | "metadata": { 318 | "kernelspec": { 319 | "display_name": "Python 3", 320 | "language": "python", 321 | "name": "python3" 322 | }, 323 | "language_info": { 324 | "codemirror_mode": { 325 | "name": "ipython", 326 | "version": 3 327 | }, 328 | "file_extension": ".py", 329 | "mimetype": "text/x-python", 330 | "name": "python", 331 | "nbconvert_exporter": "python", 332 | "pygments_lexer": "ipython3", 333 | "version": "3.7.1" 334 | }, 335 | "latex_envs": { 336 | "LaTeX_envs_menu_present": true, 337 | "autoclose": false, 338 | "autocomplete": true, 339 | "bibliofile": "biblio.bib", 340 | "cite_by": "apalike", 341 | "current_citInitial": 1, 342 | "eqLabelWithNumbers": true, 343 | "eqNumInitial": 1, 344 | "hotkeys": { 345 | "equation": "Ctrl-E", 346 | "itemize": "Ctrl-I" 347 | }, 348 | "labels_anchors": false, 349 | "latex_user_defs": false, 350 | "report_style_numbering": false, 351 | "user_envs_cfg": false 352 | }, 353 | "toc": { 354 | "base_numbering": 1, 355 | "nav_menu": {}, 356 | "number_sections": true, 357 | "sideBar": true, 358 | "skip_h1_title": false, 359 | "title_cell": "Table of Contents", 360 | "title_sidebar": "Contents", 361 | "toc_cell": false, 362 | "toc_position": {}, 363 | "toc_section_display": true, 364 | "toc_window_display": false 365 | } 366 | }, 367 | "nbformat": 4, 368 | "nbformat_minor": 2 369 | } 370 | -------------------------------------------------------------------------------- /5_financial_lables.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 10, 6 | "metadata": { 7 | "ExecuteTime": { 8 | "end_time": "2020-09-10T16:09:55.457567Z", 9 | "start_time": "2020-09-10T16:09:55.452187Z" 10 | } 11 | }, 12 | "outputs": [], 13 | "source": [ 14 | "#SNIPPET 5.1 T-VALUE OF A LINEAR TREND \n", 15 | "import statsmodels.api as sm1\n", 16 | "import numpy as np\n", 17 | "import pandas as pd\n", 18 | "#--------------------------------------------------- \n", 19 | "def tValLinR(close):\n", 20 | " # tValue of the beta coefficient of the trend on time index from a linear trend (it shows the significance of )\n", 21 | " x=np.ones((close.shape[0],2)) \n", 22 | " x[:,1]=np.arange(close.shape[0]) \n", 23 | " ols=sm1.OLS(close,x).fit()\n", 24 | " return ols.tvalues[1]" 25 | ] 26 | }, 27 | { 28 | "cell_type": "code", 29 | "execution_count": 7, 30 | "metadata": { 31 | "ExecuteTime": { 32 | "end_time": "2020-09-10T16:09:02.604212Z", 33 | "start_time": "2020-09-10T16:09:02.595360Z" 34 | } 35 | }, 36 | "outputs": [], 37 | "source": [ 38 | "#SNIPPET 5.2 IMPLEMENTATION OF THE TREND-SCANNING METHOD\n", 39 | "def getBinsFromTrend(molecule,close,span):\n", 40 | " '''\n", 41 | " Derive labels from the sign of t-value of linear trend\n", 42 | " Output includes:\n", 43 | " - t1: End time for the identified trend\n", 44 | " - tVal: t-value associated with the estimated trend coefficient \n", 45 | " - bin: Sign of the trend\n", 46 | " ''' \n", 47 | " out=pd.DataFrame(index=molecule,columns=['t1','tVal','bin']) \n", 48 | " hrzns=range(*span)\n", 49 | " for dt0 in molecule:\n", 50 | " df0=pd.Series() \n", 51 | " iloc0=close.index.get_loc(dt0)\n", 52 | " if iloc0+max(hrzns)>close.shape[0]:continue\n", 53 | " for hrzn in hrzns: \n", 54 | " dt1=close.index[iloc0+hrzn-1] \n", 55 | " df1=close.loc[dt0:dt1] \n", 56 | " df0.loc[dt1]=tValLinR(df1.values)\n", 57 | " dt1=df0.replace([-np.inf,np.inf,np.nan],0).abs().idxmax() \n", 58 | " out.loc[dt0,['t1','tVal','bin']]=df0.index[-1],df0[dt1],np.sign(df0[dt1]) # prevent leakage\n", 59 | " out['t1']=pd.to_datetime(out['t1']) \n", 60 | " out['bin']=pd.to_numeric(out['bin'],downcast='signed') \n", 61 | " return out.dropna(subset=['bin'])" 62 | ] 63 | }, 64 | { 65 | "cell_type": "code", 66 | "execution_count": 25, 67 | "metadata": { 68 | "ExecuteTime": { 69 | "end_time": "2020-09-10T16:19:36.703676Z", 70 | "start_time": "2020-09-10T16:19:35.856896Z" 71 | } 72 | }, 73 | "outputs": [ 74 | { 75 | "data": { 76 | "text/plain": [ 77 | "" 78 | ] 79 | }, 80 | "execution_count": 25, 81 | "metadata": {}, 82 | "output_type": "execute_result" 83 | }, 84 | { 85 | "data": { 86 | "text/plain": [ 87 | "Text(0.5, 1.0, 'Simu without Sine trend')" 88 | ] 89 | }, 90 | "execution_count": 25, 91 | "metadata": {}, 92 | "output_type": "execute_result" 93 | }, 94 | { 95 | "data": { 96 | "image/png": "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\n", 97 | "text/plain": [ 98 | "
" 99 | ] 100 | }, 101 | "metadata": { 102 | "needs_background": "light" 103 | }, 104 | "output_type": "display_data" 105 | } 106 | ], 107 | "source": [ 108 | "#SNIPPET 5.3 TESTING THE TREND-SCANNING LABELING ALGORITHM\n", 109 | "import matplotlib.pyplot as plt\n", 110 | "df0=pd.Series(np.random.normal(0,.1,100)).cumsum() \n", 111 | "df1=getBinsFromTrend(df0.index,df0,[3,10,1])\n", 112 | "fig = plt.figure()\n", 113 | "ax = fig.add_subplot(111)\n", 114 | "ax.scatter(df1.index,df0.loc[df1.index].values,c=df1['bin'].values, cmap='viridis')\n", 115 | "ax.set_title('Simu without Sine trend')\n" 116 | ] 117 | }, 118 | { 119 | "cell_type": "code", 120 | "execution_count": 27, 121 | "metadata": { 122 | "ExecuteTime": { 123 | "end_time": "2020-09-10T16:19:47.720841Z", 124 | "start_time": "2020-09-10T16:19:46.878522Z" 125 | } 126 | }, 127 | "outputs": [ 128 | { 129 | "data": { 130 | "text/plain": [ 131 | "" 132 | ] 133 | }, 134 | "execution_count": 27, 135 | "metadata": {}, 136 | "output_type": "execute_result" 137 | }, 138 | { 139 | "data": { 140 | "text/plain": [ 141 | "Text(0.5, 1.0, 'Simu with Sine trend')" 142 | ] 143 | }, 144 | "execution_count": 27, 145 | "metadata": {}, 146 | "output_type": "execute_result" 147 | }, 148 | { 149 | "data": { 150 | "image/png": "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\n", 151 | "text/plain": [ 152 | "
" 153 | ] 154 | }, 155 | "metadata": { 156 | "needs_background": "light" 157 | }, 158 | "output_type": "display_data" 159 | } 160 | ], 161 | "source": [ 162 | "df0=pd.Series(np.random.normal(0,.1,100)).cumsum() \n", 163 | "df0+=np.sin(np.linspace(0,10,df0.shape[0])) \n", 164 | "df1=getBinsFromTrend(df0.index,df0,[3,10,1]) \n", 165 | "fig = plt.figure()\n", 166 | "ax = fig.add_subplot(111)\n", 167 | "ax.scatter(df1.index,df0.loc[df1.index].values,c=df1['tVal'].values, cmap='viridis')\n", 168 | "ax.set_title('Simu with Sine trend')\n", 169 | "# mpl.savefig('fig 5.1.png');\n", 170 | "# mpl.clf();\n", 171 | "# mpl.close() \n", 172 | "#mpl.scatter(df1.index,df0.loc[df1.index].values,cmap='viridis')" 173 | ] 174 | } 175 | ], 176 | "metadata": { 177 | "kernelspec": { 178 | "display_name": "Python 3", 179 | "language": "python", 180 | "name": "python3" 181 | }, 182 | "language_info": { 183 | "codemirror_mode": { 184 | "name": "ipython", 185 | "version": 3 186 | }, 187 | "file_extension": ".py", 188 | "mimetype": "text/x-python", 189 | "name": "python", 190 | "nbconvert_exporter": "python", 191 | "pygments_lexer": "ipython3", 192 | "version": "3.7.1" 193 | }, 194 | "latex_envs": { 195 | "LaTeX_envs_menu_present": true, 196 | "autoclose": false, 197 | "autocomplete": true, 198 | "bibliofile": "biblio.bib", 199 | "cite_by": "apalike", 200 | "current_citInitial": 1, 201 | "eqLabelWithNumbers": true, 202 | "eqNumInitial": 1, 203 | "hotkeys": { 204 | "equation": "Ctrl-E", 205 | "itemize": "Ctrl-I" 206 | }, 207 | "labels_anchors": false, 208 | "latex_user_defs": false, 209 | "report_style_numbering": false, 210 | "user_envs_cfg": false 211 | }, 212 | "toc": { 213 | "base_numbering": 1, 214 | "nav_menu": {}, 215 | "number_sections": true, 216 | "sideBar": true, 217 | "skip_h1_title": false, 218 | "title_cell": "Table of Contents", 219 | "title_sidebar": "Contents", 220 | "toc_cell": false, 221 | "toc_position": {}, 222 | "toc_section_display": true, 223 | "toc_window_display": false 224 | } 225 | }, 226 | "nbformat": 4, 227 | "nbformat_minor": 2 228 | } 229 | -------------------------------------------------------------------------------- /4_Optimal_Clustering.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "distinguish several types of clustering algorithms, including the following:\n", 8 | "\n", 9 | "1 Connectivity: This clustering is based on distance connectivity, like hier- archical clustering. For an example in finance, see López de Prado (2016).\n", 10 | "\n", 11 | "2 Centroids: These algorithms perform a vector quantization, like k-means. For an example in finance, see López de Prado and Lewis (2018).\n", 12 | "\n", 13 | "3 Distribution: Clusters are formed using statistical distributions, e.g., a mixture of Gaussians.\n", 14 | "\n", 15 | "4 Density: These algorithms search for connected dense regions in the data space. Examples include DBSCAN and OPTICS.\n", 16 | "\n", 17 | "5 Subspace: Clusters are modeled on two dimensions, features and observa- tions. An example is biclustering (also known as coclustering). For instance, they can help identify similarities in subsets of instruments and time periods simultaneously.\n", 18 | "\n" 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 5, 24 | "metadata": { 25 | "ExecuteTime": { 26 | "end_time": "2020-09-09T15:12:02.475159Z", 27 | "start_time": "2020-09-09T15:12:02.468896Z" 28 | } 29 | }, 30 | "outputs": [], 31 | "source": [ 32 | "import os\n", 33 | "import sys\n", 34 | "nb_path = os.path.split(os.getcwd())[0]\n", 35 | "if nb_path not in sys.path:\n", 36 | " sys.path.append(nb_path)" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 6, 42 | "metadata": { 43 | "ExecuteTime": { 44 | "end_time": "2020-09-09T15:15:56.924157Z", 45 | "start_time": "2020-09-09T15:15:55.283405Z" 46 | } 47 | }, 48 | "outputs": [ 49 | { 50 | "name": "stderr", 51 | "output_type": "stream", 52 | "text": [ 53 | "/anaconda3/lib/python3.7/site-packages/sklearn/utils/deprecation.py:144: FutureWarning: The sklearn.neighbors.kde module is deprecated in version 0.22 and will be removed in version 0.24. The corresponding classes / functions should instead be imported from sklearn.neighbors. Anything that cannot be imported from sklearn.neighbors is now part of the private API.\n", 54 | " warnings.warn(message, FutureWarning)\n" 55 | ] 56 | } 57 | ], 58 | "source": [ 59 | "import CovMatrix\n", 60 | "corr0,eVal0,eVec0 = CovMatrix.init_para()\n" 61 | ] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "execution_count": 88, 66 | "metadata": { 67 | "ExecuteTime": { 68 | "end_time": "2020-09-10T10:35:40.740566Z", 69 | "start_time": "2020-09-10T10:35:40.727381Z" 70 | } 71 | }, 72 | "outputs": [], 73 | "source": [ 74 | "#SNIPPET 4.1 BASE CLUSTERING\n", 75 | "import numpy as np,pandas as pd\n", 76 | "from sklearn.cluster import KMeans\n", 77 | "from sklearn.metrics import silhouette_samples \n", 78 | "#--------------------------------------------------- \n", 79 | "def clusterKMeansBase(corr0,maxNumClusters=10,n_init=10):\n", 80 | " x,silh=((1-corr0.fillna(0))/2.)**.5,pd.Series()# observations matrix \n", 81 | " for init in range(n_init):\n", 82 | " for i in range(2,maxNumClusters+1): \n", 83 | " kmeans_=KMeans(n_clusters=i,n_jobs=1,n_init=1) \n", 84 | " kmeans_=kmeans_.fit(x) \n", 85 | " silh_=silhouette_samples(x,kmeans_.labels_) \n", 86 | " stat=(silh_.mean()/silh_.std(),silh.mean()/silh.std())\n", 87 | " if np.isnan(stat[1]) or stat[0]>stat[1]: \n", 88 | " silh,kmeans=silh_,kmeans_\n", 89 | " newIdx=np.argsort(kmeans.labels_) \n", 90 | " corr1=corr0.iloc[newIdx] # reorder rows\n", 91 | "\n", 92 | " corr1=corr1.iloc[:,newIdx] # reorder columns \n", 93 | " clstrs={i:corr0.columns[np.where(kmeans.labels_==i)[0]].tolist() \\\n", 94 | " for i in np.unique(kmeans.labels_) } # cluster members \n", 95 | " silh=pd.Series(silh,index=x.index)\n", 96 | " return corr1,clstrs,silh" 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": 89, 102 | "metadata": { 103 | "ExecuteTime": { 104 | "end_time": "2020-09-10T10:36:10.396076Z", 105 | "start_time": "2020-09-10T10:35:56.398771Z" 106 | } 107 | }, 108 | "outputs": [], 109 | "source": [ 110 | "corr1,clstrs,silh = clusterKMeansBase(pd.DataFrame(corr0))" 111 | ] 112 | }, 113 | { 114 | "cell_type": "code", 115 | "execution_count": 90, 116 | "metadata": { 117 | "ExecuteTime": { 118 | "end_time": "2020-09-10T10:36:15.285575Z", 119 | "start_time": "2020-09-10T10:36:15.271596Z" 120 | } 121 | }, 122 | "outputs": [], 123 | "source": [ 124 | "#a new (reduced) observations matrix out of the elements that compose the K1 clusters, and rerun the base clustering algorithm on that reduced correlation matrix. Doing so will return a, possibly new, clustering for those elements in K1. To check its efficacy, we compare the average cluster quality before and after reclustering those elements in K1. If the average cluster quality improves, we return the accepted clustering from the base clustering concate- nated with the new clustering for the redone nodes.\n", 125 | "\n", 126 | "#SNIPPET 4.2 TOP-LEVEL OF CLUSTERING\n", 127 | "from sklearn.metrics import silhouette_samples \n", 128 | "#--------------------------------------------------- \n", 129 | "def makeNewOutputs(corr0,clstrs,clstrs2):\n", 130 | " clstrsNew={}\n", 131 | " for i in clstrs.keys():\n", 132 | " clstrsNew[len(clstrsNew.keys())]=list(clstrs[i]) \n", 133 | " for i in clstrs2.keys():\n", 134 | " clstrsNew[len(clstrsNew.keys())]=list(clstrs2[i]) \n", 135 | " newIdx=[j for i in clstrsNew for j in clstrsNew[i]] \n", 136 | " corrNew=corr0.loc[newIdx,newIdx] \n", 137 | " x=((1-corr0.fillna(0))/2.)**.5 \n", 138 | " kmeans_labels=np.zeros(len(x.columns))\n", 139 | " for i in clstrsNew.keys(): \n", 140 | " idxs=[x.index.get_loc(k) for k in clstrsNew[i]] \n", 141 | " kmeans_labels[idxs]=i\n", 142 | " silhNew=pd.Series(silhouette_samples(x,kmeans_labels),index=x.index)\n", 143 | " return corrNew,clstrsNew,silhNew \n", 144 | "\n", 145 | "#--------------------------------------------------- \n", 146 | "def clusterKMeansTop(corr0,maxNumClusters=None,n_init=3): # for real stock data, n_init start from 10 ; for simulated data, n_init=3 would speed up the process\n", 147 | " if maxNumClusters==None:\n", 148 | " maxNumClusters=corr0.shape[1]-1 \n", 149 | " corr1,clstrs,silh=clusterKMeansBase(corr0,maxNumClusters= \\\n", 150 | " min(maxNumClusters,corr0.shape[1]-1),n_init=n_init) \n", 151 | " clusterTstats={i:np.mean(silh[clstrs[i]])/ \\\n", 152 | " np.std(silh[clstrs[i]]) for i in clstrs.keys()}\n", 153 | " tStatMean=sum(clusterTstats.values())/len(clusterTstats) \n", 154 | " redoClusters=[i for i in clusterTstats.keys() if \\\n", 155 | " clusterTstats[i]" 249 | ] 250 | }, 251 | "execution_count": 84, 252 | "metadata": {}, 253 | "output_type": "execute_result" 254 | }, 255 | { 256 | "data": { 257 | "image/png": "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\n", 258 | "text/plain": [ 259 | "
" 260 | ] 261 | }, 262 | "metadata": { 263 | "needs_background": "light" 264 | }, 265 | "output_type": "display_data" 266 | } 267 | ], 268 | "source": [ 269 | "# simulated a cov matraix with blocks\n", 270 | "import seaborn as sns\n", 271 | "corr_blk_simu = randomBlockCorr(100,10)\n", 272 | "sns.heatmap(corr_blk_simu)" 273 | ] 274 | }, 275 | { 276 | "cell_type": "code", 277 | "execution_count": 92, 278 | "metadata": { 279 | "ExecuteTime": { 280 | "end_time": "2020-09-10T10:36:45.718412Z", 281 | "start_time": "2020-09-10T10:36:39.518374Z" 282 | } 283 | }, 284 | "outputs": [ 285 | { 286 | "data": { 287 | "text/plain": [ 288 | "" 289 | ] 290 | }, 291 | "execution_count": 92, 292 | "metadata": {}, 293 | "output_type": "execute_result" 294 | }, 295 | { 296 | "data": { 297 | "image/png": "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\n", 298 | "text/plain": [ 299 | "
" 300 | ] 301 | }, 302 | "metadata": { 303 | "needs_background": "light" 304 | }, 305 | "output_type": "display_data" 306 | } 307 | ], 308 | "source": [ 309 | "# clustered using clusterKMeansTop\n", 310 | "sns.heatmap(clusterKMeansTop(corr_blk_simu)[0])" 311 | ] 312 | } 313 | ], 314 | "metadata": { 315 | "kernelspec": { 316 | "display_name": "Python 3", 317 | "language": "python", 318 | "name": "python3" 319 | }, 320 | "language_info": { 321 | "codemirror_mode": { 322 | "name": "ipython", 323 | "version": 3 324 | }, 325 | "file_extension": ".py", 326 | "mimetype": "text/x-python", 327 | "name": "python", 328 | "nbconvert_exporter": "python", 329 | "pygments_lexer": "ipython3", 330 | "version": "3.7.1" 331 | }, 332 | "latex_envs": { 333 | "LaTeX_envs_menu_present": true, 334 | "autoclose": false, 335 | "autocomplete": true, 336 | "bibliofile": "biblio.bib", 337 | "cite_by": "apalike", 338 | "current_citInitial": 1, 339 | "eqLabelWithNumbers": true, 340 | "eqNumInitial": 1, 341 | "hotkeys": { 342 | "equation": "Ctrl-E", 343 | "itemize": "Ctrl-I" 344 | }, 345 | "labels_anchors": false, 346 | "latex_user_defs": false, 347 | "report_style_numbering": false, 348 | "user_envs_cfg": false 349 | }, 350 | "toc": { 351 | "base_numbering": 1, 352 | "nav_menu": {}, 353 | "number_sections": true, 354 | "sideBar": true, 355 | "skip_h1_title": false, 356 | "title_cell": "Table of Contents", 357 | "title_sidebar": "Contents", 358 | "toc_cell": false, 359 | "toc_position": {}, 360 | "toc_section_display": true, 361 | "toc_window_display": false 362 | } 363 | }, 364 | "nbformat": 4, 365 | "nbformat_minor": 2 366 | } 367 | --------------------------------------------------------------------------------