Skip to content
All library documents

Ranking Equities by Momentum and Risk-Adjusted Return Measures

Article Quant Q&A · Author: user2664

Summary

The document describes ways to rank stocks using historical returns. It distinguishes a return-based measure of value, such as the mean of log returns, from risk measures such as return volatility or maximum drawdown. Stocks can be compared on both dimensions, and rolling estimates or bootstrap resampling can help show how uncertain those estimates are. It also mentions relative strength, measured against a benchmark or a self-constructed universe index.

For momentum investing, the suggested process is to calculate a statistic from past returns and then sort stocks by that statistic, optionally with a risk model. Simple or exponentially weighted averages are possible, but results depend on the chosen window or half-life. The answer notes that prices themselves can be misleading when corporate actions such as splits and dividends are not accounted for, and that many equity studies use a lookback that skips the latest month. These are methodological suggestions, not evidence that a particular ranking will predict future returns; the underlying persistence assumption remains a hypothesis.

Key ideas

  • Momentum rankings are commonly calculated from historical returns and compared across an equity universe.
  • Mean log return can represent historical performance, while volatility or drawdown can represent risk.
  • Simple and exponentially weighted averages give different results depending on their window or half-life.
  • Relative strength can compare each stock with a benchmark or an index built from the stock universe.
  • Rolling estimates and bootstrap resampling can help characterize uncertainty in performance and risk measures.

Tags

Full text
# How to compute momentum from equity time series?


# How to compute momentum from equity time series?












Let's say I have time series of stock prices for many stocks. What's the best way to sort the stocks based on which have been going up/stayed the same relative to others? Can this be done with a weighted average, putting more weight on the most recent numbers, to account for trends?

## Answer by Zach (score 7)

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

This entire approach hinges on how you define "value." Once you've defined value, you can define a metric for "stability" or "risk." A working hypothesis would be that stock that have been stably valuable in the past would continue to be valuable in the future. Of course, this is a hypothesis.

Let's say (for sake of an example, this is not financial advice) you define value as "mean of log returns" and stability as "standard deviation of log returns." You could then sort your stocks by these metrics and pick ones with a high value and a low risk.

If you want to get fancy, you can use another metric of risk, such as drawdown. You can also do a rolling analysis or use bootstrap re-sampling to distributions around your "value" and "stability" metrics.

Here's some code in R that illustrates my example:

```
#Load Data
rm(list = ls(all = TRUE)) #CLEAR WORKSPACE
set.seed(1)
library(quantmod)
myStocks <- c('AAPL','MSFT','GOOG','F')
getSymbols(myStocks,from='01-01-2004')
Data <- na.omit(cbind(Cl(AAPL),Cl(MSFT),Cl(GOOG),Cl(F)))
names(Data) <- myStocks

#Define value and risk
returns <- function(x) {diff(log(x))}
value <- function(x) {mean(returns(x))}
risk <- function(x) {sd(returns(x))}

#Estimate value and risk
StockScreen <- data.frame(  risk=apply(as.matrix(Data),2,risk),
                            value=apply(as.matrix(Data),2,value))
round(StockScreen,6)
plot(StockScreen)
text(StockScreen$risk+.001,StockScreen$value,labels=row.names(StockScreen))

#Estimate value and risk, different risk measure
library(PerformanceAnalytics)
risk <- function(x) {maxDrawdown(returns(x))}
StockScreen <- data.frame(  risk=apply(as.matrix(Data),2,risk),
                            value=apply(as.matrix(Data),2,value))
round(StockScreen,6)

#Boostrap value and risk measure
library(meboot)
library(plyr)

bootstrap <- function(x) {
    reps <- as.data.frame(meboot(as.ts(x), reps=100)$ensemble)
    valueDistribution <- apply(reps,2,value)
    riskDistribution <- apply(reps,2,risk)

    valueMean <- mean(valueDistribution)
    valueSD <- sd(valueDistribution)
    riskMean <- mean(riskDistribution)
    riskSD <- sd(riskDistribution)

    data.frame(valueMean=valueMean,valueSD=valueSD,riskMean=riskMean,riskSD=riskSD)
}

bootstrapScreen <- ldply(as.list(Data),bootstrap,.progress = "text")
row.names(bootstrapScreen) <- bootstrapScreen$.id
bootstrapScreen$.id <- NULL
round(bootstrapScreen,4)
```

## Answer by IrishStat (score 3)

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

you might want to rank stocks on the basis of standard dev of a forecast divided by the forecast. In this way the "tighter" the value the more predictable the stock.

## Answer by Ralph Winters (score 2)

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

It sounds as if you would be interested in computing Relative Strength

http://www.investopedia.com/terms/r/relativestrength.asp

You could either measure it against a benchmark index such as the Dow 30, or compute your own index from your 50 stocks and measure each individual stock against the index.

-Ralph Winters

## Answer by Tal Fishman (score 1)

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

What you are describing is momentum investing. It is typically done in two steps:

- Compute a momentum statistic from past prices/returns.

- Compare momentum statistics across all equities in your universe.

Step 1 is typically done using a moving average of past returns (it is wrong to use prices because splits and dividends will skew the results). This can be done using a simple moving average, or using exponentially weighted moving averages. In either case, your results will depend strongly on the window/half-life of the moving average. For equity momentum, most studies use momentum in the last 6-12 months excluding the most recent month or so.

Step 2 may be done either using an ad hoc sorting rule (Jegadeesh and Titman (1993) use top/bottom deciles) or with the aid of a risk model.

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.