‹ Build a Screener Lesson 4 of 17
Contents Lesson 4 of 17

4 min read · practitioner

What a screener cannot tell you

Before you build more of it, understand its limits — because a screener's output looks equally authoritative whether or not the question behind it made sense.

It screens today's data, not the past

Your screen runs against the numbers as they are now. That has a consequence people miss for years: you cannot use a screener to ask what would have happened.

"Companies that were cheap in 2019" is not answerable this way. The screener knows today's fundamentals against today's constituents. Ask it a historical question and it will answer using survivors and current figures, and the answer will be wrong in a direction that flatters whatever you hoped. That is two biases at once — survivorship, because the list is today's, and look-ahead, because the figures are today's. Both are the subject of the backtesting course, and the honest thing here is simply to know that this tool does neither.

The number is as old as the filing

earnings_share came from a report that was published on a date, covering a period that ended earlier. Between that period ending and you running the screen, anything may have happened. A company can look cheap on earnings that no longer exist.

The screen cannot flag this. What you can do is show the filing date beside anything derived from fundamentals, so a person can see they are looking at something months old rather than something current.

A ratio is a compression, and it drops the reason

Every ratio throws information away — that is the point of it, and it is also the risk. Two companies with the same P/E are not the same company; one might be cheap because the market is wrong, another because it is about to lose its biggest customer. The ratio cannot distinguish them and neither can your filter.

This is why unit 4 makes you record why a name is on your shortlist. Without it, in three weeks you have a list of tickers and no memory of what you were thinking, which is indistinguishable from a random list.

Absence is not a signal

If a company has no earnings_share, a filter of earnings_share > 0 excludes it. Fine. But it excludes it for two entirely different reasons that look identical from the outside: the company has no earnings, or nobody has reported them into this dataset. Coverage gaps and genuine zeros exit through the same door.

Your screen cannot tell you which happened. Your interface can at least stop pretending: a count of "instruments excluded for missing data" beside the results turns an invisible assumption into a visible number.

What it is genuinely good at

Having said all that — a screener is one of the most useful tools you can own, when used for what it is:

  • Narrowing. Going from tens of thousands to a few dozen you can actually read about.
  • Consistency. The same criteria applied to everything, with no gut feeling in the middle.
  • Repeatability. Run the same screen next month and the change in results is itself information.

The candidates it produces are the start of thinking, not the end of it. Build the tool to feel like that, and you have something worth keeping.

The finance behind it

The missing names are a studied problem, not a quirk of this endpoint: Where do you find the tickers that no longer exist? and Why does a backtest on today's index look so good?

Try it now

Run a screen that returns twenty names, then pick the one you know least about and spend five minutes reading about it. Ask yourself what the screen could not have told you. Whatever you find is the reason unit 4 exists, and it is worth discovering with your own hands rather than being told.