Travis Screener

Broad pre-screen over the deduplicated S&P 500 + NASDAQ-100 + S&P/TSX 60 universe. This is a loose knockout filter, not a reproduction of Graham's actual defensive-investor criteria — see “Full methodology” below for the two remaining deliberate simplifications.

Full methodology

A broad knockout pre-screen over ~577 large-cap tickers — nominally “S&P 500 + Dow 30 + NASDAQ-100 + TSX 60,” but Dow 30 is entirely inside the S&P 500 and NASDAQ-100 overlaps it ~86%, so the real deduplicated US universe is the S&P 500 plus about 14 extra NASDAQ-100 names, not three meaningfully separate pools. The S&P/TSX 60 (~60 large-cap Canadian names, TSX-listed, no overlap with the US exchanges) is added on top — filter by “Index” below to see just those.

This is a loose pre-screen, not a reproduction of Graham's actual defensive-investor criteria — two remaining deliberate simplifications, forced by what's available in bulk at this scale:

  • Earnings: positive EPS every year over whatever history is returned (minimum 3 years, capped at Graham's 10) — not guaranteed to be a full 10 years for every ticker.
  • Dividends: paying a dividend now, not Graham's 20-year uninterrupted streak — that depth of history isn't available in bulk.

P/E < 15, P/B < 1.5, current ratio > 2, and debt are all applied as Graham specified — debt used to be a third simplification (D/E as a proxy), but now uses his actual test: long-term debt below net current assets (current assets minus current liabilities). The per-ticker Defensive Investor screen (via “Deep valuation”) is still the stricter, more faithful check — this screener exists purely to cut a large universe down to a shortlist worth a closer look.

It runs against FMP Premium (750 requests/minute), which covers the full universe with real balance-sheet, income, and cash-flow data — not just ratios. “Run screener” fetches one paced batch (~150 tickers) per click; a daily automated job advances it too, so full coverage builds up over time and then stays fresh on a rolling basis.

Index constituent lists are static, sourced from Wikipedia and a community-maintained GitHub mirror as of 2026-07-05. They drift out of date as index composition changes.

MOS %(this table's default sort, and the home page highlights card's “Top by intrinsic value” row) is Graham's own valuation shorthand: a stock is fairly valued when P/E × P/B ≤ 22.5 (the constant behind the Graham Number formula), so margin of safety as a fraction of intrinsic value is 1 − √(P/E × P/B ÷ 22.5)— computed entirely from P/E and P/B already on hand, no separate price or book-value fetch required. Green means undervalued against that shorthand, red means overvalued; shown for every ticker with a usable positive P/E and P/B, regardless of whether it passes the other five filters. This is a screening shortcut, not a substitute for the full five-method valuation via “Deep valuation.” The home page's “Top by intrinsic value” row shows exactly the top 7 tickers from this same ranking — the same pool, same order, just the first 7 rows of what this table already shows.

F-Scoreis Joseph Piotroski's 9-point quality checklist (Stanford, 2000) — one point each for positive ROA, positive operating cash flow, improving ROA, cash flow exceeding net income (earnings quality), decreasing leverage, improving liquidity, no new shares issued, improving gross margin, and improving asset turnover, comparing this year against last. 8-9 reads as strong, 5 as average, 2 or below as weak — shown as “—” when two years of full financial statements aren't both available.

Z-Scoreis Edward Altman's 1968 bankruptcy-risk model, combining five balance-sheet and income-statement ratios (working capital, retained earnings, EBIT, market value of equity, and sales, each as a fraction of total assets or liabilities) into one number. Above 2.99 reads as financially healthy, 1.81-2.99 is a gray zone, below 1.81 signals real distress risk. Neither score is a Graham method or a buy/sell signal — both are independent, published, citable checks you can weigh alongside the valuation above.

Altman's model was built for manufacturers and reads artificially low for banks, insurers, and other financial companies — their deposits and policy liabilities get classified as “current liabilities” in a way that structurally produces negative working capital regardless of actual health. Altman himself published separate variants for non-manufacturers for this reason; a low Z-Score on a financial-sector ticker here is a known model mismatch, not necessarily distress.

Magic #is Joel Greenblatt's Magic Formula (The Little Book That Beats the Market, 2005) — rank every eligible ticker by earnings yield (EBIT ÷ enterprise value) and separately by return on capital (EBIT ÷ net working capital + net fixed assets), then sum the two ranks. Lower is better; #1 is the best combination of “cheap” and “good.” Financial-sector and utility tickers are excluded entirely, not just flagged — same reasoning as the Z-Score caveat above, their capital structure makes enterprise value and return on capital incomparable to an ordinary operating business, not just noisy. Net working capital here uses plain current assets minus current liabilities rather than Greenblatt's finer excess-cash adjustment, the same simplification most third-party Magic Formula calculators make.

The sector exclusion above only catches what the data provider labels “Financial Services” or “Utilities” — payments processors and other financial-adjacent companies sometimes get classified outside those sectors despite carrying customer float as a current liability the same way a bank carries deposits. Confirmed live on one such ticker: an extreme return-on-capital figure paired with negative net working capital is the tell, and reads as a data-classification gap rather than a genuinely exceptional business.

AM #is Tobias Carlisle's Acquirer's Multiple (The Acquirer's Multiple, 2017) — enterprise value divided by operating income, ranked ascending against every other eligible ticker (#1 is cheapest). Unlike Magic #, this is a single metric, not a combined rank of two, and there's no sector exclusion — Carlisle's own screens don't exclude financials the way Magic Formula does, though the same customer-float distortion described above can still apply to individual financial-adjacent tickers.

M-Scoreis Messod Beneish's earnings-manipulation probability model (“The Detection of Earnings Manipulation,” 1999) — eight year-over-year ratios (receivables growth vs. sales, gross margin change, asset quality, sales growth, depreciation rate change, SG&A change, accruals, leverage change) combined into one score. Above -1.78 (Beneish's own published threshold) reads as an elevated red flag; below -2.22 reads as unlikely. Two practical substitutions: total D&A stands in for pure depreciation (FMP doesn't separate them, common in practitioner implementations), and long-term debt stands in for total debt in the leverage ratio (this app has prior-year long-term debt from the F-Score work, but no prior-year total-debt figure). Needs two full years of financial statements, same as F-Score — shown as “—” when either year is missing.

Financial Services tickers are excluded entirely before computing — confirmed live on TFC (a regional bank), where FMP's “current assets” and “receivables” swung by 6-24x between fiscal years because those concepts don't map onto a bank's loans and deposits, the same root cause as the Z-Score bank caveat above. A separate plausibility guard also suppresses any result outside roughly ±10 regardless of sector — confirmed live on WY (a timber company, non-financial sector), where a large PP&E reclassification between fiscal years produced a mathematically valid but real-world-implausible score of +14. Real Beneish scores, including confirmed fraud cases in the original paper, essentially never exceed roughly ±5; an extreme result is far more likely to be a balance-sheet reclassification artifact than a genuine signal.

Criteria — click to cycle any → pass → fail

Loading…

Click a column to sort by it. Shift+click another column to add it as the next tiebreaker, Excel-style — each click stacks onto the priority order shown by the ¹ ² ³ markers.

TickerIndustryIndexMOS %P/EP/BEPS yrs+DividendYield %Curr. ratioD/EF-ScoreZ-ScoreMagic #AM #M-ScoreScreen