In 2016, Zura Kakushadze from WorldQuant published a six-page paper titled “101 Formulaic Alphas.” The paper did something unusual: it listed the exact formulas for 101 quantitative factors, 80 of which were running in WorldQuant’s production environment. These factors have holding periods of 0.6 to 6.4 days and an average pairwise correlation of just 15.9%.

The paper gives formulas but zero explanation. Why does Alpha#3 look the way it does? What market phenomenon is it trying to capture? Not a word. That gap is what this series fills: we classify all 101 Alpha 101 factors by their economic logic, break down the formulas, and figure out what each factor is actually betting on.

This series has five parts:

  1. This article: the big picture. Classification framework, operator reference, and the complete factor lookup table
  2. Price-volume divergence factors (32 factors)
  3. Momentum and reversal factors (23 factors)
  4. Volatility and intraday structure factors (23 factors)
  5. Liquidity, composite factors, and multi-factor portfolio construction (23 factors)

Data Inputs for Alpha 101

All 101 formulas draw from the same set of daily equity fields:

FieldMeaningNotes
openOpening price
closeClosing price
highDaily high
lowDaily low
volumeTrading volume
vwapVolume-weighted average priceNot in most free data sources; approximate or compute
returnsDaily returnclose / delay(close,1) - 1
capMarket capitalizationUsed for rank weighting
adv{d}d-day average daily dollar volumeadv20 = 20-day rolling mean of price × volume
IndClassIndustry classificationFor industry neutralization

vwap appears in over a dozen formulas, but most free data feeds don’t provide it. A rough proxy for daily factor research: (high + low + close) / 3. For higher accuracy, compute true VWAP from intraday bars.

adv{d} comes in many flavors: adv5, adv10, adv15, adv20, adv30, adv40, adv50, adv60, adv81, adv120, adv150, adv180. Strictly speaking, the paper defines adv{d} as the rolling mean of daily dollar volume (price × shares traded). Many open-source implementations use raw share volume instead, which is a reasonable approximation when the factor is subsequently passed through rank.

For US equities, yfinance provides OHLCV data. For Chinese A-shares, Tushare or AKShare are common options.

Operator Guide: Reading the Formulas

Alpha 101 formulas look intimidating, but they reuse the same dozen or so operators. Once you understand these operators, most of the 101 formulas become readable at a glance.

Cross-Sectional Operators: Comparing Stocks on the Same Day

rank(x): Rank all stocks by their value of \(x\) on a given day, then normalize to the 0–1 range. The stock with the lowest value gets 0, the highest gets 1.

Why rank everything? Because raw values have wildly different scales. Volume might be in the millions of shares, returns in fractions of a percent. Computing correlations or differences on raw values lets large-scale variables dominate. After ranking, everything is a percentile between 0 and 1, so you can compare apples to apples.

Ranking also tames outliers. If one stock’s volume spikes 10x, the raw value can blow up any statistic, but its rank simply becomes 1.0 without distorting other stocks’ relative positions.

This is why rank appears over 90 times across the 101 formulas. It solves the scale problem once, so every other operator can focus on the actual signal.

Time-Series Operators: Looking Back at a Single Stock’s History

delay(x, d): The value of \(x\) from \(d\) days ago. delay(close, 1) = yesterday’s close.

delta(x, d): Today’s value minus the value \(d\) days ago. delta(close, 5) = how much the close moved over 5 days. Unlike returns, delta preserves absolute magnitude without normalizing by the starting price.

ts_rank(x, d): Where the current value falls within the past \(d\) days. If today’s close is the highest in the last 10 days, ts_rank(close, 10) is close to 1.0. This operator translates absolute values into “relative position versus recent history.” A stock up 2% today sounds okay, but if it was up 3%+ every day for the past 10 days, that 2% is actually weak. ts_rank captures this kind of relative strength.

ts_argmax(x, d) / ts_argmin(x, d): Which position in the past \(d\)-day window had the maximum (or minimum) value. Returns a 0-based index: 0 = the oldest day in the window, \(d-1\) = today. If ts_argmax(close, 10) = 9, the peak was today and the stock may still be trending up. If it equals 0, the peak was at the beginning of the window and the stock has been falling since. Larger values mean the extreme is more recent.

correlation(x, y, d): Pearson correlation between \(x\) and \(y\) over the past \(d\) days. Heavily used in price-volume divergence factors, e.g., correlating price rank with volume rank. High correlation means price and volume move together; low or negative correlation means divergence.

covariance(x, y, d): Covariance of \(x\) and \(y\) over the past \(d\) days. Similar to correlation but not normalized, so it retains scale information.

decay_linear(x, d): Weighted average over the past \(d\) days with linearly declining weights (most recent day gets the highest weight). A simple moving average treats every day equally, but in quantitative factors, recent information usually has more predictive power. decay_linear implements a straightforward “more recent = more important” weighting scheme. Weight assignment: day 1 (most recent) gets weight \(d\), day 2 gets \(d-1\), and so on, then normalize.

stddev(x, d): Standard deviation of \(x\) over the past \(d\) days. Volatility.

sum(x, d) / product(x, d): Rolling sum / product over \(d\) days.

min(x, d) / max(x, d): Rolling minimum / maximum over \(d\) days.

Transform Operators

scale(x, a=1): Rescale cross-sectional values so that the sum of absolute values equals \(a\). The practical purpose is converting factor values into position weights. With \(a=1\), the scaled values directly represent portfolio allocations (positive = long, negative = short), summing to a fully invested portfolio.

signedpower(x, a): Exponentiation that preserves the sign: \(\text{sign}(x) \times |x|^a\). When \(a > 1\), larger values get amplified more than smaller ones. The effect is widening the gap between top and bottom stocks, making extreme signals stronger.

Industry Neutralization

IndNeutralize(x, IndClass): Demean \(x\) within each industry group cross-sectionally.

Why? Suppose your factor is “rate of change in volume.” Banking stocks inherently have orders-of-magnitude more volume than biotech stocks. Without industry neutralization, the top-ranked stocks would all be banks, not because they have alpha but because of industry characteristics.

After IndNeutralize, banks are compared with banks and biotech with biotech. The industry-level systematic difference is removed, leaving only stock-specific alpha signals.

26 of the 101 factors use IndNeutralize. If you don’t have industry classification data, skip these 26 and work with the remaining 75.

Core Operators in pandas

import numpy as np
import pandas as pd

def rank(df):
    """Cross-sectional percentile rank, normalized to [0, 1]."""
    return df.rank(axis=1, pct=True)

def delay(df, d):
    """Shift by d days."""
    return df.shift(d)

def delta(df, d):
    """d-day difference."""
    return df - delay(df, d)

def ts_rank(df, d):
    """Current value's percentile rank within past d days."""
    return df.rolling(d).apply(
        lambda x: x.rank().iloc[-1] / len(x), raw=False
    )

def ts_argmax(df, d):
    """Index of maximum value within past d days (0 = oldest)."""
    return df.rolling(d).apply(lambda x: x.argmax(), raw=True)

def ts_argmin(df, d):
    """Index of minimum value within past d days (0 = oldest)."""
    return df.rolling(d).apply(lambda x: x.argmin(), raw=True)

def decay_linear(df, d):
    """Linearly decay-weighted average, most recent weighted highest."""
    weights = np.arange(1, d + 1, dtype=float)
    weights /= weights.sum()
    return df.rolling(d).apply(
        lambda x: np.dot(x, weights), raw=True
    )

def scale(df, a=1):
    """Scale cross-sectionally so absolute values sum to a."""
    return df.mul(a).div(df.abs().sum(axis=1), axis=0)

def signedpower(df, a):
    """Sign-preserving exponentiation."""
    return np.sign(df) * df.abs().pow(a)

def ts_corr(x, y, d):
    """Rolling Pearson correlation."""
    return x.rolling(d).corr(y)

def ts_cov(x, y, d):
    """Rolling covariance."""
    return x.rolling(d).cov(y)

Operator Quick-Reference Table

OperatorTypeIntuitionAnalogy
rankCross-sectionPercentile rank, removes scaleExam ranking vs. raw score
delayTime-seriesLook back d days“Yesterday’s close”
deltaTime-seriesd-day change“How much it moved this week”
ts_rankTime-seriesCurrent value’s position in recent history“Is today a local high or low?”
ts_argmaxTime-seriesPosition of the peak in the window“Where in the last 10 days was the high?”
correlationTime-seriesCo-movement of two series“Do price and volume move together?”
decay_linearTime-seriesRecency-weighted average“Recent data matters more”
stddevTime-seriesVolatility“How choppy has it been?”
scaleCross-sectionNormalize to position weights“All positions sum to 1”
signedpowerTransformAmplify extreme signals“The strong get stronger”
IndNeutralizeCross-sectionRemove industry bias“Compare banks to banks, biotech to biotech”

Five Categories: What Each Factor Is Betting On

With the operators covered, we can look at the factors themselves. The 101 formulas may seem all over the place, but by economic logic, they fall into five categories.

Price-Volume Divergence (32 Factors)

Core thesis: price and volume should move in sync. When price rises on shrinking volume, the rally may lack conviction. When volume surges without much price movement, buyers and sellers disagree, and a directional breakout may be coming.

Price-volume divergence is one of the oldest ideas in technical analysis. Alpha 101 formalized it.

Alpha#3 is the cleanest example of this category:

$$\text{Alpha#3} = -1 \times \text{correlation}(\text{rank}(\text{open}),\ \text{rank}(\text{volume}),\ 10)$$

Layer by layer:

  1. rank(open): Rank all stocks by opening price on each day, normalize to 0–1
  2. rank(volume): Rank all stocks by volume on each day, normalize to 0–1
  3. correlation(..., 10): Pearson correlation of these two rank series over the past 10 days
  4. -1 *: Flip the sign

If a stock’s opening-price rank and volume rank have been moving together over the past 10 days (positive correlation), the factor gives a negative value (short signal). If they have been diverging (negative correlation), the factor gives a positive value (long signal).

Why is price-volume divergence a buy signal? One interpretation: when the opening price rises but volume does not follow, the move is not driven by retail chasing, so it may reflect slow fundamental repricing. When both price and volume surge together, the stock is more likely overheated in the short term.

Alpha#12 is more direct:

$$\text{Alpha#12} = \text{sign}(\text{delta}(\text{volume}, 1)) \times (-1 \times \text{delta}(\text{close}, 1))$$

In plain terms: if today’s volume is higher than yesterday’s (sign(delta(volume, 1)) = +1), bet against today’s price direction (multiply by -1 * delta(close, 1)). If volume dropped, bet with today’s price direction.

The logic: a rally on heavy volume is likely to reverse; a decline on light volume is likely to bounce. Abnormal price-volume alignment signals a reversal.

This category has the most factors (32 out of 101), which suggests WorldQuant found price-volume relationships to provide the largest number of independent short-term signals.

# Alpha#3 computation example
# df_open and df_volume are DataFrames with rows=dates, columns=stocks
alpha3 = -1 * ts_corr(rank(df_open), rank(df_volume), 10)

Momentum and Reversal (23 Factors)

Core thesis: stocks tend to reverse over very short horizons (1–5 days) and persist over medium horizons (10–20 days).

Short-term reversal has a straightforward economic explanation: stocks that rallied hard today attract profit-taking tomorrow, pushing prices back down. Stocks that sold off heavily get bottom-fished, pushing prices back up. This is a stable phenomenon in liquid markets, driven by market makers and short-term traders.

Medium-term momentum has a different source: information diffusion takes time. When good news breaks, not everyone reacts simultaneously. Smart money buys first, and less-informed participants follow, creating a trend.

Alpha#9 is a conditional reversal factor:

$$\text{Alpha#9} = \begin{cases} \text{ts_rank}(\text{delta}(\text{close},1),\ 5) & \text{if } 0 < \text{ts_min}(\text{delta}(\text{close},1),\ 5) \\ \text{ts_rank}(\text{delta}(\text{close},1),\ 5) & \text{if } \text{ts_max}(\text{delta}(\text{close},1),\ 5) < 0 \\ -1 \times \text{delta}(\text{close},1) & \text{otherwise} \end{cases}$$

The first two conditions check for a consistent trend: if every day in the past 5 was up (minimum change > 0), or every day was down (maximum change < 0), use ts_rank to gauge how the current move compares to recent history. Otherwise (mixed up-and-down days), use a simple reversal signal. The two trend branches have identical formulas, and that is not a typo: the paper applies the same momentum measure to both “consistently up” and “consistently down” regimes. The sign difference comes from delta(close,1) itself being positive or negative.

What stands out: it uses momentum logic (ts_rank) during trending markets but switches to reversal logic in choppy markets. A single layer of regime detection on top of a naive reversal factor.

Alpha#20 targets gap fills:

$$\text{Alpha#20} = -1 \times \text{rank}(\text{open} - \text{delay}(\text{high}, 1)) \times \text{rank}(\text{open} - \text{delay}(\text{close}, 1)) \times \text{rank}(\text{open} - \text{delay}(\text{low}, 1))$$

All three terms measure where today’s open sits relative to yesterday’s candlestick. If today gapped up above yesterday’s high, close, and low, all three terms are positive, their product is positive, and the -1 makes the factor negative (short signal). The logic: large gap-ups tend to be overreactions that get partially filled during the day.

Volatility (11 Factors)

Core thesis: volatility mean-reverts. Periods of high volatility tend to subside; periods of low volatility tend to expand.

More precisely, volatility factors try to identify regime transitions. When a quiet stock suddenly makes a big move, it often signals new information arrival and the start of a trend. Conversely, after sustained high volatility, the market digests the information and volatility contracts.

Alpha#1 is a conditional volatility signal:

$$\text{Alpha#1} = \text{rank}\Big(\text{ts_argmax}\big(\text{signedpower}(\text{returns} < 0\ ?\ \text{stddev}(\text{returns}, 20)\ :\ \text{close},\ 2),\ 5\big)\Big) - 0.5$$

Step by step: pick the signal source conditionally (volatility during declines, closing price during rallies), apply signedpower to amplify differences, use ts_argmax to find where the 5-day maximum sits in the window, then cross-sectionally rank and subtract 0.5 to center the factor around zero (positive = long, negative = short).

The underlying intuition: in a down market, focus on volatility, because extreme volatility during sell-offs signals peak panic, and peak panic tends to precede reversals. In an up market, focus on price levels.

The volatility category has only 11 factors, but the underlying logic connects directly to volatility trading strategies: volatility itself is a tradeable quantity.

Intraday Structure (12 Factors)

Core thesis: the relative positions of open, close, high, low, and VWAP within the daily bar encode information about intraday trader behavior.

How much did the stock gain from open to close (intraday return)? Where does the close sit within the day’s range (near the high or the low)? Is VWAP above or below close (were institutions trading above or below the final price)?

Alpha#101 has the simplest structure:

$$\text{Alpha#101} = \frac{\text{close} - \text{open}}{(\text{high} - \text{low}) + 0.001}$$

Numerator is the intraday gain; denominator is the intraday range (plus 0.001 to avoid division by zero). The ratio measures what fraction of the day’s range was captured as directional return. A value near +1 means the stock opened at the low and closed at the high (unidirectional rally all day). A value near 0 means the close was about the same as the open despite intraday swings.

This is a classic technical indicator known as the “close location value.” Its predictive interpretation: stocks with strong unidirectional days tend to show (weak) continuation the next day. Stocks that churned all day with no net progress lack directional momentum.

Alpha#42 looks at VWAP vs. close:

$$\text{Alpha#42} = \frac{\text{rank}(\text{vwap} - \text{close})}{\text{rank}(\text{vwap} + \text{close})}$$

When vwap - close > 0, the volume-weighted average transaction price exceeds the closing price, meaning “most trading happened at higher prices and the stock drifted down toward the close.” This is often a sign that institutions were distributing (selling) throughout the day. The factor treats this as a bearish signal.

Note that Alpha#42 uses no delay: all inputs are from the current day. The paper lists its holding period as approximately 0 days, making it a purely intraday signal. In T+1 markets like Chinese A-shares, this factor cannot be directly applied.

Liquidity and Composite (23 Factors)

Core thesis: changes in liquidity (volume, turnover) reflect institutional money flow.

Large institutional orders cannot be filled in a single trade. When a stock shows elevated volume for several consecutive days but little price movement, someone may be building a position in slices. A sudden volume drop may signal the accumulation is done or the market has shifted to wait-and-see.

Alpha#7 is a conditional liquidity signal:

$$\text{Alpha#7} = \begin{cases} -1 \times \text{ts_rank}(\text{abs}(\text{delta}(\text{close},7)),\ 60) \times \text{sign}(\text{delta}(\text{close},7)) & \text{if } \text{adv20} < \text{volume} \\ -1 & \text{otherwise} \end{cases}$$

The condition: is today’s volume above the 20-day average? If yes (elevated volume), the factor uses the 7-day absolute price change, ranked within 60 days, multiplied by the direction, then flipped. If volume is below average (quiet day), it defaults to -1 (short signal).

The logic: on quiet days, go short, because low participation means weak support. On active days, assess the “magnitude” of the price move relative to recent history. Larger moves on high volume carry more meaning.

These factors tend to be complex, often nesting multiple operators and conditional branches. They blend volume, price, and volatility information into a single score. Parsing them one by one can be tedious, but the common thread is detecting where institutional-scale money is flowing.

Complete Alpha 101 Classification Reference

The table below assigns all 101 factors to five categories. The “Core Operators” column highlights the most important computation in each formula. “IndNeut” marks whether industry neutralization is required.

Alpha 101 factor classification distribution

#CategoryCore OperatorsOne-Line LogicIndNeutSeries Part
1Volatilitystddev, ts_argmaxVolatility extremes during down marketsNoPart 4
2Price-Volcorrelation, rankPrice-volume rank correlation + intraday moveNoPart 2
3Price-Volcorrelation, rankOpen-volume rank correlationNoPart 2
4Momentumts_rankLow-rank short signalNoPart 3
5Intradayrank, ts_rank, vwapVWAP deviation rank changeNoPart 4
6Price-VolcorrelationDirect open-volume correlationNoPart 2
7Liquidityadv, ts_rank, deltaConditional volume-price momentumNoPart 5
8Momentumrank, delta, sumOpen change vs. return rank interactionNoPart 3
9Momentumdelta, ts_min/maxConditional reversal: trending vs. choppyNoPart 3
10Momentumdelta, ts_min/maxConditional momentum variant of #9NoPart 3
11Price-Volrank, correlation, vwapVWAP/close/volume interactionNoPart 2
12Price-Volsign, deltaVolume change direction × price changeNoPart 2
13Price-Volrank, covarianceClose-volume covariance rankNoPart 2
14Price-Volcorrelation, returnsOpen-return correlationNoPart 2
15Price-Volcorrelation, rankHigh-volume rank correlationNoPart 2
16Price-Volcovariance, rankHigh-volume covariance rankNoPart 2
17Price-Volrank, ts_rank, deltaClose rank vs. volume momentum rankNoPart 2
18Volatilitycorrelation, stddevClose-open correlationNoPart 4
19Momentumreturns, delayConditional return reversalNoPart 3
20Momentumrank, open, delayGap fill reversalNoPart 3
21Volatilitymean, stddev, closeMean deviation + volume conditionNoPart 4
22Price-Volcorrelation, delta, stddevHigh-volume correlation + price changeNoPart 2
23Momentumsma, delta, highHigh-price mean conditional reversalNoPart 3
24Momentumsma, delta, closeClose-price mean conditional reversalNoPart 3
25Price-Volrank, returns, adv, vwapReturn × volume deviation × VWAP rankNoPart 2
26Price-Volcorrelation, ts_rankTime-series rank correlation + volumeNoPart 2
27Price-Volrank, correlationPrice-volume correlation rank quantileNoPart 2
28Price-Volcorrelation, adv, rankVolume vs. average volume correlationNoPart 2
29Momentumdelta, ts_rank, returnsClose change rank trendNoPart 3
30Momentumdelta, close, volumePrice-volume change sign interactionNoPart 3
31Liquidityrank, adv, correlation, decay_linearLiquidity + decayed price-volume correlationNoPart 5
32Price-Volscale, correlationMean deviation × decayed price-volume correlationNoPart 2
33Momentumrank, open/closeOpen-close rank reversalNoPart 3
34Volatilityrank, stddev, deltaVolatility rank + price reversalNoPart 4
35Momentumrank, returns, volume, ts_rankMulti-factor composite reversalNoPart 3
36Volatilitycorrelation, rank, advMulti-dimensional correlation rankNoPart 4
37Momentumcorrelation, rank, delayOpen rank autocorrelationNoPart 3
38Momentumrank, close, openClose rank vs. intraday changeNoPart 3
39Momentumrank, delta, decay_linearDecayed momentum signalNoPart 3
40Price-Volrank, stddev, correlationHigh-price volatility × volume rankNoPart 2
41Intradayhigh, low, vwapIntraday range vs. VWAPNoPart 4
42Intradayrank, vwap, closeVWAP-close deviationNoPart 4
43Price-Volrank, adv, deltaLiquidity rank × price changeNoPart 2
44Price-Volcorrelation, rankLow-volume rank correlationNoPart 2
45Price-Volrank, delta, correlation, decay_linearClose change rank × decayed price-vol corrNoPart 2
46Momentumdelay, delta, closeConditional price momentumNoPart 3
47Intradayrank, adv, high, close, vwapLiquidity-weighted VWAP-close deviationNoPart 4
48Liquiditycorrelation, rank, deltaIndustry-neutral price-volume corrYesPart 5
49Momentumdelta, delay, closeConditional price reversalNoPart 3
50Price-Volcorrelation, rank, ts_rankPrice-volume rank time-series corrNoPart 2
51Momentumdelta, delay, closeConditional delayed reversalNoPart 3
52Momentumdelta, ts_min, ts_rankPrice trough + volume rankNoPart 3
53Momentumdelta, close, high, lowIntraday position changeNoPart 3
54Intradayopen, close, lowIntraday deviation structureNoPart 4
55Price-Volcorrelation, rankIntraday range vs. volume correlationNoPart 2
56Momentumrank, returns, capMarket cap × return rank interactionNoPart 3
57Volatilitydecay_linear, rank, ts_argminDecayed trough position rankNoPart 4
58Liquiditycorrelation, rank, volumeIndustry-neutral price-volume corrYesPart 5
59Liquiditycorrelation, rank, volumeIndustry-neutral price-volume corr variantYesPart 5
60Price-Volscale, correlation, rankPrice-vol corr × scaled intraday changeNoPart 2
61Liquidityrank, vwap, advVWAP rank vs. average volume rankNoPart 5
62Intradayrank, vwap, correlation, advVWAP rank × price-volume corrNoPart 4
63Liquidityrank, vwap, delta, decay_linear, advDecayed liquidity signalYesPart 5
64Intradayrank, correlation, vwap, advVWAP-liquidity correlation rankYesPart 4
65Intradayrank, correlation, vwap, advVWAP rank correlation decayYesPart 4
66Intradayrank, decay_linear, vwap, deltaVWAP deviation decayed momentumYesPart 4
67Liquidityrank, correlation, high, advHigh-price vs. average volume corr rankYesPart 5
68Intradayrank, correlation, high, adv, closeHigh-volume corr × close rankYesPart 4
69Liquidityrank, ts_rank, delta, close, advIndustry-neutral price momentum rankYesPart 5
70Liquidityrank, delta, close, vwapIndustry-neutral price-VWAP changeYesPart 5
71Liquiditydecay_linear, correlation, rank, close, advMulti-layer decayed liquidity signalYesPart 5
72Liquidityrank, correlation, vwap, adv, decay_linearDecayed price-volume rank corrYesPart 5
73Intradayrank, decay_linear, vwap, delta, openVWAP decay × open changeYesPart 4
74Price-Volrank, correlation, close, advClose vs. average volume corr rankYesPart 2
75Liquidityrank, correlation, vwap, volumeVWAP vs. volume rank correlationNoPart 5
76Liquidityrank, decay_linear, correlation, vwapDecayed VWAP rank corrYesPart 5
77Price-Volrank, decay_linear, delta, correlationDecayed price change × price-vol corrNoPart 2
78Price-Volrank, correlation, low, advLow vs. average volume corr rankNoPart 2
79Liquidityrank, delta, vwap, correlation, closeIndustry-neutral VWAP change rankYesPart 5
80Liquidityrank, delta, close, correlation, advIndustry-neutral change + price-vol corrYesPart 5
81Price-Volrank, correlation, vwap, advVWAP vs. average volume rank corrNoPart 2
82Liquidityrank, delta, open, correlation, advIndustry-neutral open change rankYesPart 5
83Volatilityrank, delay, high, lowLagged intraday range rankNoPart 4
84Momentumrank, vwap, close, signedpowerVWAP-close deviation poweredNoPart 3
85Price-Volrank, correlation, high, advHigh rank vs. avg volume corrNoPart 2
86Volatilityrank, correlation, close, adv, delayLagged price-volume corr conditionalYesPart 4
87Liquidityrank, decay_linear, delta, vwap, advDecayed VWAP momentumYesPart 5
88Price-Volrank, decay_linear, correlation, openOpen rank decayed correlationNoPart 2
89Liquiditydecay_linear, correlation, rankDecayed correlation signalNoPart 5
90Momentumrank, correlation, close, advClose vs. avg volume rank corr reversalNoPart 3
91Liquidityrank, correlation, close, adv, decay_linearClose-volume decayed corrYesPart 5
92Price-Volrank, decay_linear, delta, correlationMulti-dimensional decayed price-vol signalNoPart 2
93Liquidityrank, correlation, vwap, adv, decay_linearIndustry-neutral decayed VWAP corrYesPart 5
94Volatilityrank, correlation, advVolume rank and low-price signalNoPart 4
95Price-Volrank, correlation, high, advHigh rank vs. avg volume corrNoPart 2
96Volatilitydecay_linear, rank, ts_argmax, correlationDecayed extremum position × price-vol corrNoPart 4
97Liquidityrank, decay_linear, delta, correlation, advIndustry-neutral decayed liquidityYesPart 5
98Volatilityrank, decay_linear, correlation, vwap, advDecayed VWAP corr rankNoPart 4
99Price-Volrank, correlation, high, volumeHigh vs. volume rank correlationNoPart 2
100Liquidityrank, stddev, correlation, advVolatility-liquidity corr rankYesPart 5
101Intradayclose, open, high, lowIntraday return as fraction of rangeNoPart 4

Practical Tips

The decimal parameters are machine-optimized noise. Alpha#4 has a window of 9.99922. Alpha#35 includes 2.21. These numbers came from automated optimization, not human judgment. They are almost certainly overfit to the in-sample period. Rounding to the nearest integer (10, 2) likely gives similar out-of-sample performance.

26 factors require industry classification data. Factors marked “IndNeut” in the table above use IndNeutralize, which requires an industry label for every stock. For US equities, use GICS or SIC codes. For Chinese A-shares, use Shenwan (申万) industry classification. If you don’t have industry data, start with the other 75 factors.

Some factors are purely intraday signals. Alpha#42 and #54, for example, use no delay and rely entirely on same-day OHLCV data. The paper lists their holding periods as approximately 0 days. In T+1 markets (Chinese A-shares), these cannot be executed directly. You can lag the signals by one day as next-day selection factors, but expect degraded performance.

A single factor is not a strategy. The paper was published in 2016, a decade ago. Any individual factor suffers alpha decay after publication as more people trade the same signal. But the classification logic does not expire: price-volume divergence, momentum reversal, and volatility mean-reversion are economic regularities that do not disappear because a paper was published.

These factors were designed for US large-caps. The 101 alphas were developed on a universe of roughly 1,000 US large-cap equities, with dollar-neutral and market-cap-weighted constraints. Applying them directly to Chinese A-share small-caps or other markets can produce very different results. A-share specifics like T+1 settlement, daily price limits, and a higher retail participation rate all affect factor behavior, especially for reversal and intraday factors. Always run local backtests before trusting any cross-market transfer.

The correct use of Alpha 101 is as building blocks. Combine factors into a multi-factor model. The average pairwise correlation of 15.9% means the factors capture different dimensions of information and diversify well in combination. For evaluating the resulting portfolio, see the quant metrics guide covering Sharpe ratio, maximum drawdown, and related measures.

Series Roadmap

This is Part 1 of the Alpha 101 series. The next four articles go category by category:

If you are not yet familiar with standard portfolio evaluation metrics, start with the quant metrics guide for Sharpe ratio, maximum drawdown, and more. The volatility factors connect directly to ideas in volatility trading strategies, which may be worth reading in parallel.