Liquidity Screens and Tradability Filters
A universe filter built on full-sample average volume knows the future. Applied honestly, using only volume known at the time, the same filter often excludes the exact names that made the backtest's headline number look good.
Prerequisites: Look-Ahead Bias, Point-in-Time Data
Almost every backtest needs a rule to exclude names too thin to trade — "minimum $5 million average daily volume," say. The natural way to compute that average is to take the whole sample period and average it. That's a look-ahead bias with a specific, damaging shape: it uses volume the strategy could not have known at the time, and it tends to include names that only became liquid later, right when the strategy would have wanted to be trading them at the smaller size that was actually available.
Worked example: liquid in hindsight, illiquid at the time
A small-cap momentum strategy applies a $5 million ADV filter, computed once as the average daily volume across the full 2018-2023 backtest window, then applied to the whole period. One name in the universe is a stock that IPO'd thinly traded, grew into a well-covered mid-cap by 2022, and averages $9 million ADV across the full sample — comfortably past the filter.
But in 2019, when the momentum signal actually fired on this name, its trailing ADV was $1.8 million — well under the $5 million bar. A point-in-time filter, using only volume known as of the trade date, would have excluded it entirely at that moment.
| Filter method | Name included in 2019? | ADV used for sizing |
|---|---|---|
| Full-sample average (look-ahead) | Yes | $9M (a 2023 number) |
| Trailing 60-day, point-in-time | No | $1.8M (the real 2019 number) |
The full-sample filter doesn't just mis-time the entry, it mis-sizes it — a backtest that lets this name in and sizes a position off its eventual $9 million ADV would try to trade several times the volume the market could actually absorb in 2019, understating cost on top of the look-ahead bias in inclusion.
Liquidity filters must use only volume data known as of the trade date — a trailing window, not a full-sample or forward-looking average — or the filter silently admits names on the strength of liquidity they hadn't yet developed.
This bias compounds with capacity assumptions: a name let in on future liquidity gets sized as if that liquidity already existed, so the same look-ahead that mis-selects the universe also mis-estimates how large a position could actually have been executed at the time.
The fix is a trailing, point-in-time ADV window (commonly 20-60 trading days), recomputed at every rebalance, applied both to inclusion and to position sizing — never a single static number computed once over the whole sample.
Practice in interviews
Further reading
- Fama & French, Common Risk Factors in the Returns on Stocks and Bonds (data appendix)