Most of the examples of using PCA of asset returns to construct an eigen portfolio seem to tend to focus on equities, which tend to all be positively correlated. As such I usually see normalised (such that they sum to 1) asset weights along the lines of:

weights = eigenvector[0, :] / sum(eigenvector[0, :])

Where eigenvector zero is associated with the eigenvalue of the largest variance.

Occasionally negative values will appear in that PC0 (for example if there is a negatively correlated asset introduced), which will be explained as a weight towards a short sale. But I am confused about how these weights should be correctly normalised in the presence of negative value(s).

Following the same procedure as above, the weights will of course sum to one, but the net and gross exposures now will of course be different. Is this just accepted?

Follow up question, should weights here actually be the loadings (eigenvector * sq.root(eigenvalues))?


1 Answer 1


I'm not entirely sure what you are carrying out the PCA on, are you using a correlation matrix or covariance matrix? As for the negative eigenvalue issue, the sign associated with an eigenvalue is not important as eigenvectors are only unique up to a constant. If you have a square matrix, $X$, an Eigenvalue $\lambda_i$ and eigenvector $v_i$ for $X$ satisfy, \begin{equation} Xv_i = \lambda_i v_i \end{equation} If you flip the sign of $\lambda_i$ to $-\lambda_i$ then it implies that we have $-v_i$ as an eigenvector of $X$ and the above equation is still valid. These eigenvalues represent the variance explained by the corresponding Eigenvector in relation to the original axis.

For your question on weights, I'm not fully sure what you are weighting. You could allocate a 'weight' to each Eigenvector as $\frac{\sum_{j=1}^{k}\lambda_j}{\sum_{i=1}^{p}\lambda_i}$ which would represent the the proportion of variance explained by including the first k components. You may then use this to drop or retain components that contribute little to the overall variance of the portfolio.

If by weights you are instead interested in how to map your original data (an equities returns portfolio??) onto the new axis (principal components). Then for this you would use the loadings matrix. For a given column in the loadings matrix you have an eigenvector. Each element in the vector represents a 'weight' corresponding to one of your original variables which maps that variable onto the new axis (principal component) for this eigenvector. It then follows that by multiplying your original data matrix by the loadings matrix, you arrive at the score matrix (your original data mapped to the new axis of principal components). I believe the loadings matrix is the matrix of weights that you are looking for. Please add a comment if I've gone in the wrong direction here.

  • 1
    $\begingroup$ Thanks for the reply! In response to your questions, I'm carrying PCA out on a covariance matrix of n asset's returns - and the crux of my question is really negative elements within the eigenvectors (not negative eigenvalues) this produces. I'm trying to weight these n assets in a portfolio, so along the lines of the second part of your answer I believe. Thank you! $\endgroup$
    – rwb
    Jun 21, 2021 at 22:47
  • $\begingroup$ Ah yes I see. In that case, I believe you would want to use the $L^2$ norm to normalise each Eigen vector. This means that your Eigenvectors become unit vectors (magnitude 1) but retain their original directions, this is the standard method of 'normalising' a vector. Here, negative values are treated the same as positive values. The $L^2$ norm for a vector $v = (v_1, ... , v_n)$ is defined as $\sqrt{\sum_{i=1}^{n} v_i^2}$. $\endgroup$ Jun 21, 2021 at 23:15
  • $\begingroup$ Yes my eigenvectors are already normalised to unit length (using NumPy, does this by default), but some of the individual elements are negative. So -i / L^2 is (and would still be even if they weren't already unit length) negative $\endgroup$
    – rwb
    Jun 22, 2021 at 10:43
  • $\begingroup$ Ok, I'm not sure what the issue is then. You shouldn't be changing the sign of individual Eigenvector elements, otherwise it would no longer have the same direction. If you want the elements to sum to one then just divide the eigenvector by the sum of it's elements. There's no reason for why a weight cannot be negative. $\endgroup$ Jun 22, 2021 at 13:32
  • $\begingroup$ If I assume I understand you correctly, you want your gross market exposure $\sum_{i=1}^N |w_i|$ to be equal to $1$, so in this case you would consider weights $\lambda_i/(\sum_{i=1}^N |\lambda_i|)$. $\endgroup$ Jun 22, 2021 at 15:01

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.