Strategy Library

Residual Momentum


Residual momentum is the phenomenon that stocks with greater monthly residual returns (normalized by the volatility of the residual returns) tend to outperform those with less. Research has shown the strategy experiences less exposure to the dynamic Fama-French factors, produces greater sharpe ratios, and is more robust out-of-sample than a total return momentum strategy. This strategy is claimed to be more stable throughout the business cycle than a total return momentum strategy. It tends to underperform during trending regimes and outperform during reverting regimes. Additionally, this strategy is less concentrated is small-cap stocks than a total return strategy can sometimes be, leading to less trading costs and reducing the effect of tax-loss selling.


Importing Custom Data

The first step of algorithm is to load 3 years of trailing values of the Fama-French factors. We call the AddData method and provide the Fama-French data source URL from our Tutorials repo. We save the loaded data into a DataFrame in the alpha model.

Universe Selection

In coarse universe selection, we return the first 400 symbols that have fundamental data. In fine universe selection, we rank the stocks by market cap and return the symbols that are in the top 10%. We only create ResidualMomentum objects for stocks added to the universe that have atleast 3 years of historical prices.

Calculate Residual Momentum Score

During construction of ResidualMomentum objects, we manually warmup the trailing 3 years of monthly returns for the security. We also set up a monthly consolidator to update the trailing returns each month and to recalculate the score. The score is calculated by fitting a linear regression model to the trailing 36 months of data, using the Fama-French factors as independent variables and the monthly returns of each stock as the dependent variable.

\[r_t = \alpha + \beta_1 * Mkt_t + \beta_2 * SMB_t + \beta_3 * HML_t + \epsilon_t \]

Where \(r_t\) is the monthly return of the stock in month \(t\); \(Mkt_t\), \(SMB_t\), and \(HML_t\) are the Fama-French factor values in month \(t\); and \(epsilon_t\) is the residual return in month \(t\). After fitting, we test the model on the trailing 12 months of data (excluding the most recent month) to calculate the score. We simply sum the residuals and divide by the standard deviation of the residuals to get the score.

\[score = \frac{\sum{} \epsilon}{\sigma_\epsilon} \]

If a stock's price is below $1 when calculating the score, it's score is set to None, excluding it from trading during the rebalance.


We rebalance the portfolio at the beginning of each month. After calculating a score for each security, we long the 10% of stocks with the greatest scores and short the 10% of stocks with the lowest scores, holding until the next rebalance.


You can also see our Documentation and Videos. You can also get in touch with us via Chat.

Did you find this page helpful?

Contribute to the tutorials: