The Claude Trader

Method, snapshot 2026-10-26

Graham Defensive

418 companies scored under this rule set this week. The rules below are the complete definition; the code that implements them is published with the data.

Machine-readable: graham.json, graham.md, top 100 at /q/top/graham.json.

Rules

# Graham Defensive — scoring rules

Source: Benjamin Graham, *The Intelligent Investor*, chapter 14 ("Stock Selection for the Defensive Investor"), 1973 revised edition. Tested empirically in Oppenheimer (1984), *Financial Analysts Journal*.

Score 0–100 = sum of points below. "Passes all" = full points on every test.

| # | Test | Points | Scoring | Inputs (SEC XBRL concept unless noted) |
|---|---|---|---|---|
| 1 | Adequate size: revenue >= $1B (Graham's $100M, inflation-adjusted) | 5 | pass/fail | Revenues / RevenueFromContractWithCustomerExcludingAssessedTax, latest CY frame |
| 2a | Current ratio >= 2.0 | 15 | linear: 1.0 -> 0, 2.0 -> 15 | AssetsCurrent / LiabilitiesCurrent, latest instant |
| 2b | Long-term debt <= working capital | 15 | linear on LTD/WC: 1.0 -> 15, 2.0 -> 0; negative WC -> 0 | LongTermDebtNoncurrent (or LongTermDebt), AssetsCurrent - LiabilitiesCurrent |
| 2 (unclassified balance sheet) | Company reports no AssetsCurrent / LiabilitiesCurrent (homebuilders, some conglomerates). Fallback: long-term debt <= equity, replaces 2a+2b | 30 | linear: 1.0 -> 30, 2.0 -> 0 | LongTermDebt / StockholdersEquity |
| 2 (utilities) | Debt <= 2x equity, replaces 2a+2b per Graham's utility exception | 30 | linear: 2.0 -> 30, 4.0 -> 0 | LongTermDebt / StockholdersEquity |
| 3 | Positive net income in each of the last 10 fiscal years | 15 | 1.5 per positive year; all ten years must be reported, otherwise the test is insufficient | NetIncomeLoss (or ProfitLoss), CY frames |
| 4 | Dividends paid every year for 20 years | 15 | 0.75 per year with at least one ex-dividend | Yahoo Finance dividend history |
| 5 | EPS growth >= 33%: 3-year average now vs 3-year average 10 years earlier | 10 | linear: 0% -> 0, +33% -> 10 | EarningsPerShareDiluted, CY frames |
| 6 | P/E <= 15 on 3-year average EPS | 15 | linear: 15 -> 15, 25 -> 0 | last close (Yahoo) / mean(EPS last 3 FY) |
| 7 | P/B <= 1.5, or P/E x P/B <= 22.5 | 10 | max of: P/B linear 1.5 -> 10, 3.0 -> 0; product linear 22.5 -> 10, 40 -> 0; equity not positive -> 0 | StockholdersEquity / point-in-time shares outstanding (cover page or CommonStockSharesOutstanding, restated for verified splits after its date, as for market value); only for a filer with no point-in-time count at all, the latest diluted weighted average, flagged on the input row |

Not scored: SIC 60, 61, 63, 64 and 67 (banks, credit, insurers, REITs and holding companies); SIC 62 (brokers, exchanges, asset managers) is scored, so GS, MS and SCHW carry scores and should be read with that in mind. Graham's tests assume an industrial balance sheet.

Known limits: CY frames align fiscal years to calendar years (a FY ending in June 2025 appears under CY2025 or CY2024 per SEC's frame rule). Yahoo dividend history is the only dividend source in v0; XBRL dividends-per-share is loaded and will become the cross-check.

## Freshness, completeness and status (applies to every philosophy)
- A balance-sheet input counts only if its period end is within 18 months (550 days) of the snapshot. Older values mean the company stopped reporting that line; the test is reported as insufficient, never silently scored.
- Long-term debt evidence, in order: LongTermDebtNoncurrent; else LongTermDebt including current maturities (an upper bound); else total liabilities minus current liabilities (an upper bound). An upper bound can only pass the test (bound within the threshold); if it does not settle the test the test is insufficient. With no debt and no total-liabilities tag, insufficient. Zero is never assumed.
- Test 3 needs all ten fiscal years present; test 5 needs all three years on each side; test 6 needs the last three years. Missing years are listed in the component.
- EPS is split-adjusted to today's share count using the recorded split history (Yahoo Finance), and the as-reported value and factor are shown on the input row. EPS values that cannot be per-share USD (|EPS| > 500, or more than 5x away from net income / shares) are dropped as filer tagging errors.
- Status: `ok` = every test computed; `partial: <tests>` = score is the sum of computed tests, `passes_all` is false; `insufficient data (<reason>)` = no score. `data_as_of` is the oldest financial input used; `price_as_of` is separate.
- Test 4 cross-check: for every year with an XBRL `CommonStockDividendsPerShareDeclared` fact, a positive declaration must coincide with a Yahoo ex-dividend date in that year (and a zero declaration with none). Years agree / disagree / have no XBRL fact are listed on the test row; the Yahoo input row is marked verified, mismatch or unverified accordingly.

## Why so few companies pass all seven tests (dated analysis, snapshot 2026-10-15, full eligible universe)

This is a one-off analysis of the full eligible universe on 2026-10-15, before the public grid moved to the S&P 500 active
scope; its counts are not today's. Current counts: /q/stats.json (`graham_pass_all`, `graham_complete`, `graham_partial`
for the active scope; `full_universe.scored_by_philosophy` for the whole universe) and /q/pass-all/graham.json.

Of 4,470 scored companies, 857 have every test computable from fresh filings ("complete") and 4 pass all seven. This is the
classic screen behaving as designed, not a relaxed or broken one:

| Among the 857 complete scores, companies failing… | count |
|---|---|
| Test 6, P/E ≤ 15 on 3-year average EPS | 723 |
| Test 7, P/B ≤ 1.5 or P/E×P/B ≤ 22.5 | 596 |
| Test 4, 20 unbroken dividend years | 576 |
| Test 3, 10 positive earnings years | 489 |
| Test 2a / 2b, current ratio and debt vs working capital | 471 / 455 |
| Test 5, EPS growth ≥ 33 % over a decade | 412 |

Only 11 complete companies fail exactly one test. Graham's own 1970s screens produced similarly short lists; the thresholds
are kept at his values and are not tuned to raise the pass count.

**Partial, not failing.** 2,822 companies are "partial": a test could not be computed because a required year is absent.
The absent years cluster on 2014–2016 (test 5 base period) and on fewer than 10 fiscal years of net income (test 3): these
are mostly companies listed for less than 12 years. Long-listed filers (KO, PG, JNJ, IBM, CAT) hold all 13 years in our
data, so the gaps are in the companies' histories, not in the loader. Partial scores are hidden by default and flagged.

**Unmapped inputs, distinct from both.** 810 eligible companies have no US-GAAP net income fact: foreign private issuers
that tag IFRS (`ifrs-full:ProfitLoss`, e.g. HSBC, Shell), 20-F filers without XBRL financial facts (e.g. ASML), and a few
reorganised registrants whose history sits under a predecessor CIK (ExxonMobil Holdings). They are `insufficient data`
for Graham and Magic Formula; IFRS tags are not yet read. Momentum and Insider score them when prices or Form 4s exist.

## Date semantics, exactly
- **Hard freshness (550 days).** A balance-sheet instant (current assets, liabilities, equity, debt, cash, PP&E, share
  count) is used only if its period end is within 550 days (~18 months). Older → the test is `insufficient`, score `partial`.
- **Stale warning (120 days).** A used current-period input older than 120 days (a missed quarter) is marked `stale` on the
  input row, listed in `stale_inputs`, and the grid shows an amber "stale" word. It is still used.
- **History inputs** (10-year net income, EPS windows, dividend years) are deliberately old and never marked stale;
  `history_from` / `history_through` state the years used.
- **data_as_of** = the oldest current-period input the score depends on (never a history year).
- **price_as_of** = the close used; `price_stale` if older than 7 days. Momentum requires a trade within 10 days and 13
  months of history; its `data_as_of` is the last price date.
- **Insider coverage** = the date Form 4 data is loaded through (`coverage.through`); more than 3 missing days in the
  90-day window makes the score `complete: false`.

Top 50

by score, then ticker

#TickerCompanyScoreData as of
1PHMPultegroup Inc97.02025-12-31
2EIXEdison International96.22025-12-31
3EDConsolidated Edison Inc92.62025-12-31
4PEGPublic Service Enterprise Group Inc92.12025-12-31
5LENLennar Corp90.02025-11-30
6SRESempra89.52025-12-31
7OKEOneok Inc88.12025-12-31
8CFCF Industries Holdings, Inc.86.82025-12-31
9NKENike, Inc.86.82026-05-31
10PNWPinnacle West Capital Corp86.42025-12-31
11CTSHCognizant Technology Solutions Corp85.82025-12-31
12DOVDover Corp85.72025-12-31
13CMSCMS Energy Corp85.22025-12-31
14LULUlululemon athletica Inc.85.02026-02-01
15SNASnap-on Inc84.52026-01-03
16AEEAmeren Corp83.52025-12-31
17ADMArcher-Daniels-Midland Co83.12025-12-31
18DTEDTE Energy Co83.12026-03-31
19AEPAmerican Electric Power Co Inc82.32025-12-31
20ATOAtmos Energy Corp82.32025-09-30
21NUENucor Corp80.62025-12-31
22DUKDuke Energy Corp79.52026-03-31
23AOSSmith A O Corp79.32025-12-31
24XELXcel Energy Inc79.12026-06-30
25STLDSteel Dynamics Inc79.02025-12-31
26SOSouthern Co78.42025-12-31
27APTVAptiv Plc78.02025-12-31
28BF-ABrown Forman Corp77.92026-04-30
29CNPCenterpoint Energy Inc77.72025-12-31
30NINisource Inc.77.52025-12-31
31AWKAmerican Water Works Company, Inc.77.32025-12-31
32FSLRFirst Solar, Inc.76.82025-12-31
33SMCISuper Micro Computer, Inc.76.22026-06-30
34SWKSSkyworks Solutions, Inc.76.02025-10-03
35AMATApplied Materials Inc75.02025-10-26
36FASTFastenal Co75.02025-12-31
37GWWW.W. Grainger, Inc.75.02025-12-31
38KLACKLA Corp75.02026-06-30
39KMIKinder Morgan, Inc.75.02025-12-31
40RSGRepublic Services, Inc.75.02025-12-31
41SCHWSchwab Charles Corp75.02025-12-31
42WSTWest Pharmaceutical Services Inc75.02025-12-31
43EXCExelon Corp74.62025-12-31
44TXNTexas Instruments Inc74.52025-12-31
45HRLHormel Foods Corp74.42026-07-26
46ETREntergy Corp74.32025-12-31
47EVRGEvergy, Inc.73.92025-12-31
48TECHBio-techne Corp73.52026-06-30
49ESEversource Energy73.12025-12-31
50LIILennox International Inc72.72025-12-31