When it comes to generate random
numbers most of the people see this exercise as a black box. In order to add
some colour to this. There are several approaches to generate correlated random
numbers, of which two are mainly used, namely Cholesky decomposition and
spectral (eigenvalue) decomposition. These types of decomposition are used in copula estimates.
Cholesky decomposition takes the
correlation (or covariance) matrix along with randomly generated numbers and
correlates them. Cholesky decomposition has two, let’s call it, versions: lower
and upper triangular. The Cholesky decomposition can be done in Python via
Numpy and SciPy linear algebra (linalg)
libraries:
(1) np.linalg.cholesky(A) # using numply linear algebra
library and
(2) scipy.linalg.cholesky(A, lower=True) # using SciPy
linear algebra library with lower=True indicating we want lower triangular, if
we want upper triangular: lower=False.
I prefer to use the lower
triangular matrix. I also prefer working with array instead of matrix.
Put into practice and using Python, the things
look like this (we work with 3 variables):
import numpy as np
from scipy.linalg import cholesky
from scipy.stats import norm
A=np.array([[1,0.1558, 0.2227], [0.1558,1,0.5118],
[0.2227,0.5118,1]]) # set the correlation matrix
B= norm.rvs(size=(3, 10000)) # 10,000 simulations
to generate 3 random normally distributed variables
Cholesky = cholesky(A, lower=True) # Cholesky
decomposition - lower triangular matrix
result= np.dot(Cholesky, B) # generates correlated
variables
correlation=np.corrcoef(result)
#check the correlation of the simulated variables
By the way, checking if the
initial matrix is positive definite is also quite easy on Python:
from scipy.linalg import eigh
eigh(A) # the first array is eigenvalues and the
second is eigenvectors
In our example, the correlation matrix is positive definite, meaning that all its eigenvalues are positive. The eigenvalues of the above correlation matrix are: 0.4832, 0.8903, 1.6265. Cholesky decomposition can also be used in the opposite case - to uncorrelate variables that are correlated.
No comments:
Post a Comment