Repair an Indefinite Correlation Matrix
The function ‘repairs’ an indefinite correlation matrix by replacing its negative eigenvalues by zero.
repairMatrix(C, eps = 0)
C |
a correlation matrix |
eps |
a small number |
The function ‘repairs’ a correlation matrix: it replaces
negative eigenvalues with eps
and rescales the matrix such that
all elements on the main diagonal become unity again.
Returns a numeric matrix.
This function may help to cure a numerical problem, but it will rarely help to cure an empirical problem. (Garbage in, garbage out.)
See also the function nearPD
in the Matrix package.
Enrico Schumann
Gilli, M., Maringer, D. and Schumann, E. (2019) Numerical Methods and Optimization in Finance. 2nd edition. Elsevier. https://www.elsevier.com/books/numerical-methods-and-optimization-in-finance/gilli/978-0-12-815065-8
Rebonato, R. and Jaeckel, P. (1999) The most general methodology to create a valid correlation matrix for risk management and option pricing purposes.
Schumann, E. (2019) Financial Optimisation with R (NMOF Manual). http://enricoschumann.net/NMOF.htm#NMOFmanual
## example: build a portfolio of three assets C <- c(1,.9,.9,.9,1,.2,.9,.2,1) dim(C) <- c(3L, 3L) eigen(C, only.values = TRUE) vols <- c(.3, .3, .3) ## volatilities S <- C * outer(vols,vols) ## covariance matrix w <- c(-1, 1, 1) ## a portfolio w %*% S %*% w ## variance of portfolio is negative! sqrt(as.complex(w %*% S %*% w)) S <- repairMatrix(C) * outer(vols,vols) w %*% S %*% w ## more reasonable sqrt(w %*% S %*% w)
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.