Is your stock screen just a size bet?
A stock screen is a size bet when its rules consistently select companies from one market-cap range, even though the thesis claims to find a trait that should work across company sizes. Test for it by splitting each historical result into market-cap groups, comparing the signal within those groups, and rerunning the backtest after raising the market-cap floor. If the result disappears, size was doing more work than the thesis admitted.
This problem turns up often in value research. Small companies can look cheaper, trade less often, receive less analyst coverage, and carry messier filing histories. A screen built around cheapness may end up selecting that whole bundle. The backtest then rewards or punishes the bundle while the research note talks about one ratio.
Why does company size get into the result?
Market capitalization is the market value of a company's common equity: share price multiplied by shares outstanding. It describes the market's price for the equity slice. Revenue, assets, and business quality require their own measures.
Size can enter a thesis directly through the universe floor. It can also enter through a rule that seems unrelated. A deep-value cutoff has more room to find extreme readings among small companies. A dollar-volume requirement filters those companies back out. A five-year history rule favors older filers. A profitability rule may lean toward larger, established businesses. Each choice changes the size distribution before you read a return.
There is a long public record behind treating size as its own return exposure. Kenneth French's data library sorts US companies into size groups using NYSE market-equity breakpoints, then forms portfolios at the intersection of size and another characteristic. That design measures size and the target characteristic together. It keeps one exposure from borrowing the other's story.
A broad-market benchmark won't remove the problem. If a thesis selects mostly smaller companies and you compare it only with a large-company index, the excess return mixes the stock-selection rule with a size mismatch. The comparison may be arithmetically correct and still miss the research question.
What should you measure before reading returns?
Start with the market cap of every eligible company and every company that passes the gate at each rebalance date. Use the values known on that date. Today's market cap attached to an old qualification would let later winners grow into a higher bucket and failed companies vanish from view.
Put the eligible names into fixed buckets or quantiles. Fixed buckets answer an implementation question: could you actually trade these businesses at the capital you expect to deploy? Quantiles answer a research question: does the signal reach beyond the smallest part of the universe? Use both if the distinction matters.
For each bucket, record:
- the share of eligible companies
- the share of companies passing the gate
- the pass rate within the bucket
- the bucket's contribution to the hypothetical result
- turnover and the number of qualification events
The pass rate is selected companies divided by eligible companies inside the same bucket. That's the useful denominator. A bucket supplying many selections may contain many eligible names to begin with. A sharply higher pass rate shows that the rules themselves prefer it.
Then inspect the distribution as well as its average. One very large company can pull the average market cap upward while nearly every other result sits near the floor. The median helps, and the actual bucket counts are better. If most passing names hug the minimum market cap, treat the floor as an active selection rule.
Event counts matter too. A small-cap bucket with a striking average return based on a thin handful of qualifications hasn't established much. One acquisition can dominate it. Open the underlying events before turning the bucket into a conclusion.
Run a market-cap floor ladder
A floor ladder is a set of backtests that changes only the minimum market capitalization. Keep the feature definitions, gate, dates, reporting lag, cadence, exit rule, and benchmark fixed. Raise the floor through several round values and preserve every report.
Don't choose the steps after looking for the line that wins. Pick thresholds that correspond to plausible research scopes or tradability limits. The exact values are your proposed parameters. What matters is that the ladder was declared before its returns were visible.
Read the ladder as a sensitivity test:
- Does the direction of excess return survive as the smallest companies leave?
- Does the event sample collapse at one step?
- Does turnover fall because the remaining companies trade more steadily?
- Do drawdown and return change together, suggesting that the first result carried a different risk profile?
Suppose the result weakens gradually as the floor rises. The thesis may have broad support with a stronger expression among smaller businesses. Suppose it vanishes as soon as one narrow band above the original floor is removed. Then the original claim was mostly about that band. Suppose it improves. The smallest names may have added noise or costs the headline backtest didn't charge.
Every backtest in this comparison is hypothetical and excludes trading costs. That caveat bites harder at the small end, where bid-ask spreads and market impact can be larger. A paper result that gets stronger as liquidity gets worse deserves more friction testing. Extra precision in the return won't answer the cost question.
How to choose the universe your screen runs on covers the practical reason for setting a market-cap floor. The ladder asks a different question: how much of the historical conclusion was purchased by that setting?
Compare like-sized companies
The floor ladder removes companies. A within-size comparison keeps them and asks whether the signal sorts companies among reasonable peers.
At each historical date, divide the eligible universe into size buckets first. Then compare high and low signal readings inside each bucket. For a cheapness thesis, that means asking whether cheaper companies beat more expensive companies among small companies, then among middle-sized companies, then among larger companies. This comparison assigns the gap within peer groups before the groups are combined.
This follows the logic of the French portfolio construction above: sort on size and the target characteristic separately, then read their intersection. Treat the outcome as a diagnostic for intertwined return sources. It can't establish causality.
Quantery's current thesis DSL can't run that exact within-size test. pct_rank(feature_name) ranks a feature across the whole declared universe, and the universe block has a minimum market cap without a maximum or a size-bucket operation. Raising min_market_cap therefore creates overlapping, cumulative universes. It doesn't create separate size buckets or rank a signal within them.
Use separate thesis versions with higher market-cap floors only for the floor-ladder sensitivity test above. An exact within-size analysis sits outside the current thesis DSL. It needs a point-in-time research dataset containing eligibility, signal, qualification, market-cap, and return records so companies can be assigned to disjoint buckets at each historical date. Keep the historical information clock intact while doing that. The backtest benchmark guide also explains why each size scope needs a comparison that resembles its investable alternative.
Don't add a different valuation threshold to every bucket after seeing the outcomes. That replaces one hidden size bet with a grid of tuned rules. Keep the signal fixed first. If the economics genuinely require different definitions at different scales, write separate claims and test each as its own thesis.
What should the thesis code make visible?
Put size and liquidity in the thesis where they can be versioned and changed. The shape below is illustrative, and the bundled templates are the reference for exact fields. The Quantery thesis documentation covers the broader structure.
# Value and cash quality with visible size scope: illustrative
meta:
name: value-quality-size-test
label: Value Quality Size Test
description: Filed cash generation and valuation inside a declared size range.
universe:
exchanges: [NYSE, NASDAQ, AMEX]
min_market_cap: 200000000
exclude_sectors: [Financial Services, Real Estate]
quality:
required:
price: no_price
revenue_ttm: no_revenue
fcf_ttm: no_fcf
params:
yield_ok: 0.05
margin_ok: 0.03
min_dollar_volume: 1000000
features:
revenue_ttm: ttm(revenue)
fcf_ttm: ttm(free_cash_flow)
fcf_yield: if(market_cap > 0, fcf_ttm / market_cap, null)
fcf_margin: if(revenue_ttm > 0, fcf_ttm / revenue_ttm, null)
dollar_volume: price * avg_volume
criteria:
valuation:
rules:
- { when: "is_null(fcf_yield)", score: 0, flag: no_yield }
- { when: "fcf_yield >= $yield_ok", score: 1 }
- { else: 0 }
cash_quality:
rules:
- { when: "is_null(fcf_margin)", score: 0, flag: no_margin }
- { when: "fcf_margin >= $margin_ok", score: 1 }
- { else: 0 }
tradability:
rules:
- { when: "dollar_volume >= $min_dollar_volume", score: 1 }
- { else: 0 }
gate:
mode: strict
The market-cap floor defines which companies may enter. Dollar volume, price multiplied by average daily trading volume, checks how much stock changes hands. They aren't substitutes. A company can have a respectable market value and a thinly traded float, while a smaller company can trade actively.
Save the base version before running it. Copy it, change only min_market_cap, and rerun over identical dates. The immutable versions turn the ladder into a record instead of a memory. If you also change the cash-flow rule, you won't know which edit moved the result.
The fcf_yield feature deserves suspicion because market cap sits in its denominator. A higher yield can come from stronger cash generation or a lower equity valuation. If the smallest bucket dominates, inspect fcf_margin beside it. That second feature asks whether cash generation is strong relative to the business's own revenue, which helps separate operating quality from a depressed market price. It doesn't solve the size question, but it tells you which half of the ratio is moving.
When should the claim change?
Change the claim when the evidence changes scope. If the signal keeps its direction across the floor ladder and inside several size groups, it has earned a broader description. If it survives only among smaller companies, call it a small-company thesis and test it against an appropriate benchmark. A narrower claim can still be useful.
If the result disappears after applying a tradability rule, the implementable version failed even if the frictionless chart looked good. If missing histories cluster among recent or small filers, the effective universe may be selecting seasoned companies before the thesis runs. Checking data coverage before a backtest is part of the size audit for that reason.
A size-controlled result can still hide a sector tilt, a particular market regime, or one outlier. Those are separate tests. Run them one at a time. Find which exposure earned the result and name the claim accordingly. Real-world exposures belong in the explanation when they're part of what the thesis selects.
Raise the floor. Split the sample. Match the benchmark. If the conclusion survives, keep going. If it doesn't, don't rescue the broad story. The rules are yours, and the size range is one of them.
Research tooling, not investment advice. Nothing here is a recommendation to buy, sell, or hold any security. Screens, scores, and backtests are informational only; backtested results are hypothetical, exclude costs such as commissions and slippage, and do not guarantee future results. Verify against primary filings and make your own decisions.
Want to try this on your own rules? Quantery is free for 14 days: the full app, no card required.
← All articles