Skip to content
All library documents

Orthogonalizing Fama–French Factors Through Portfolio Constraints and Regression

Article Quant Q&A · Author: John

Summary

The discussion considers how to reduce correlation among factor-mimicking portfolios built from Fama–French style sorts. Because the traditional sorting procedures do not explicitly control correlations, one proposed approach is to construct replacement portfolios from the underlying stocks. An optimization can seek holdings that resemble a traditional factor portfolio while constraining its correlation with other factors.

A second approach operates on factor return series rather than directly changing stock weights. Regress one factor’s returns on another, then subtract the fitted exposure from the first factor’s returns or portfolio. The example uses value and momentum series and shows that removing the estimated momentum component makes the adjusted value series uncorrelated with momentum in that sample. The result is illustrative rather than evidence of investment performance: it uses random data, and removing correlation changes the factor’s exposure and meaning. Whether orthogonalization is useful depends on the portfolio objective and the size and relevance of the original correlations.

Key ideas

  • Traditional factor sorts do not explicitly ensure that their returns are uncorrelated.
  • An optimization can seek a portfolio resembling a standard factor sort while constraining correlation with other factors.
  • Alternatively, regress one factor return series on another and remove the estimated exposure.
  • The random-series example demonstrates the algebraic effect, not real-market performance.
  • Orthogonalization changes factor exposures, so its value depends on the intended application.

Tags

Full text
# How to orthogonalize Fama French factors?


# How to orthogonalize Fama French factors?












The Fama French factors (e.g. size, value) are not orthogonal to each other, so when e.g. you want to create a diversified portfolio of factor mimmicking portfolios (factor investing), the correlation between factors can lead to unwanted concentration to some of them.

Orthogonalizing the factors would prevent this from happening. Does anyone know how to update the weights to the individual stocks that are underlying the factors, such that the factors are orthogonal to each other?

I already saw this thread: Why aren't the Fama-French 3 factors orthogonal to each other? But it doesn't really answer my question.

## Answer by Enrico Schumann (score 3, accepted)

https://quant.stackexchange.com/a/51449

The Fama-French factors follow from simple sorting procedures, so they do not explicitly control correlation. But if you have access to the underlying stocks, you could replace this sorting procedure by an optimisation model that looks for a portfolio similar to the traditional Fama-French sort portfolio, but with a constraint on correlation between this portfolio and others (see e.g. this example )

An alternative idea would be take the time-series of the factor portfolios and correct their exposure. For instance, suppose you have two factors value and momentum. Here is a bit of R code to give some intuition. I use random numbers for the factors.

```
set.seed(56423)
value <- rnorm(50)
momentum <- rnorm(50)
cor(value, momentum)
## [1] 0.1828126
```

So, the factors are correlated. Regressing one on the other then will give a non-zero slope.

```
model <- lm(value ~ momentum)
## Coefficients:
## (Intercept)   momentum  
##      -0.301      0.153
```

But then, building a portfolio long value minus this slope times momentum will result in a value portfolio that is not correlated to momentum any more.

```
round(cor(value - coef(model)["momentum"]*momentum, momentum), 8)
## 0
```

Whether this helps depends on your application and the degree of correlation. Some plots.

```
plot(value, value - coef(model)["momentum"]*momentum,
     xlab = "value", ylab = "value 'minus' momentum")
```

```
plot(value - coef(model)["momentum"]*momentum, momentum,
     xlab = "value 'minus' momentum", ylab = "momentum")
```

Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)

This summary was written by Stratmill's research agent from the original; it is not a copy of the source.