AlphaStocks

Scoring v23: What Changed and Why

Released

An audit of our five models found that most of them computed something other than what their source describes, and that our methodology pages promised things the code did not do. Version v23 fixes the code to match the sources rather than the other way round. Every score is now computed the way the book, paper or letter defines it, and an analyst who checks a number against that source should get the same answer.

Scores and statuses changed for many stocks on the release day. A stock that was rated highly because of a computation error may have dropped; that is the point. A model that does not apply to a company now says so instead of showing a score.

This release makes no performance claim. The engine was not re-backtested: it is judged by fidelity to its sources and by tests written from them, not by another return series.

Piotroski F-Score

Before: Seven sector variants swapped in signals the paper does not have (net interest margin for banks, FFO for REITs, float for insurers), and a signal without data was marked unavailable while the rest were still added up into a score.

Now:

  • The nine signals exactly as the paper defines them: return on assets over beginning-of-year assets, net income before extraordinary items, long-term debt over average assets, equity issuance, and asset turnover over beginning assets.
  • Complete data or no score: a company missing any input gets "insufficient data", as the paper scored only firms with every signal.
  • Banks, insurers and asset managers are not applicable, and REITs with an unclassified balance sheet are not applicable — said on the page, not scored as zero. One labelled adaptation stays: a company that reports no gross profit has signal 8 computed on operating margin.

Source: Piotroski (2000), Journal of Accounting Research 38 Supplement, pp. 7-12

Graham

Before: A fair-value estimate built on the Graham Number with three scenarios, graded by how far the price sat below it, on trailing-twelve-month earnings, with invented sector variants (tangible book for banks, FFO for REITs).

Now:

  • The seven criteria for the defensive investor from chapter 14, as written. Among them: current ratio ≥ 2 and long-term debt ≤ net current assets; ≤ 15 on three-year average earnings; P/B ≤ 1.5 or P/E × P/B ≤ 22.5.
  • Records Graham asks for but filings do not reach are "record too short", not a fail. Negative earnings or negative book value make a ratio undefined, and undefined is a fail, never a cheap reading.
  • The Graham Number is still shown, as a reference on the model card. It is no longer the site's fair value.

Source: Benjamin Graham, The Intelligent Investor (revised edition, 1973), chapter 14

Buffett

Before: A graded "spectrum" over the median return on equity and its variability, the slope of operating margins, debt against earnings and the smoothness of earnings per share — thresholds that do not appear in anything Buffett wrote — and copy that promised to score competitive moats.

Now:

  • The tests from the Berkshire letters, each pass or fail: ROE on average equity ≥ 15% in every year and ≥ 20% on average over 10 years (judged on at least 5); total debt ≤ 3 × owner earnings, and equity positive; market value added ≥ $1 for each $1 of earnings retained over 5 years.
  • Owner earnings as the 1986 letter defines them, with stock-based pay left as an expense. Negative equity (McDonald's, for one) now fails the debt test instead of reading as low debt.
  • "Moat" became something the filings can show — moat signals in the numbers: return on tangible capital ≥ 15% in at least 80% of the years, and gross (else operating) margin with a coefficient of variation ≤ 0.15 across the window. Brand, switching costs and network effects are no longer claimed; no filing measures them.
  • Insurers are now rated, on an adaptation labelled as one (Berkshire letters 2007 and 2009): total benefits, losses and expenses ÷ net premiums earned ≤ 100% summed over 10 years (judged on at least 5) — an upper bound on the combined ratio; not applicable when premiums are below 75% of total revenues; ROE on average equity ≥ 10% on average over 10 years and no year below 0% (judged on at least 5); book value per share, with dividends paid added back, compounded ≥ 10% a year over up to 10 years (at least 5); equity positive and net premiums earned ≤ 3 × equity; plus the retained-dollar, share-count and margin-of-safety tests. With Buffett on their Quality axis, insurers get a composite score.

Source: Berkshire Hathaway shareholder letters 1977–1992; Frazzini, Kabiller & Pedersen, "Buffett's Alpha" (2018)

Lynch

Before: PEG and dividend-adjusted PEG scored as two separate checks (the same fact counted twice), growth taken over three years, and a PEG computed for cyclical companies, which is the trap Lynch warned against.

Now:

  • Every stock is placed in one of Lynch's six categories first, and valued the way that category is: PEGY for growers, cash against debt for turnarounds, the discount to net assets for asset plays, and no P/E-to-growth score for cyclicals.
  • Growth is the five-year EPS growth rate ending at the latest fiscal year, with a tiny-base guard; P/E uses trailing-twelve-month earnings. The grower test: P/E (trailing twelve months, earnings from continuing operations) ÷ (5-year EPS growth % + dividend yield %) < 1; score 10 at PEGY ≤ 0.5, 8 at ≤ 0.67, 6 at ≤ 1, 3 at ≤ 2, else 0.

Source: Peter Lynch, One Up on Wall Street (1989), chapters 7 and 13

Greenblatt

Before: The raw earnings yield and return on capital were added together, so a very high return on capital swamped any yield and the list became a return-on-capital list — Apple, at a low earnings yield, scored at the top.

Now:

  • Rank by earnings yield, rank by return on capital, add the ranks — the book's method. The score is the position in that combined list.
  • Enterprise value now includes preferred stock and minority interest and subtracts only cash the business does not need; working capital excludes cash and short-term debt.
  • Utilities, financial companies and REITs are not ranked, as the book leaves them out.

Source: Joel Greenblatt, The Little Book That Beats the Market (2006)

Fair value

Before: several estimates were blended, a different method took over when the estimate sat far from the market price, and an estimate was hidden when a confidence gate judged it too far from the price. The price was, in effect, an input to its own valuation, and different pages could show different numbers.

Now: One fair value per stock, from one method chosen by sector profile. The market price is never an input: no blending toward it, no hiding a value that disagrees with it. Each value comes with its method and a low–base–high range, and is withheld only when the method's inputs are invalid, with the reason shown. The fair value is displayed; it is not an input to the composite score.

  • Two-stage owner-earnings DCF (Damodaran industry cost of equity): Owner earnings per share (net income + D&A − capex, 3-year average) grown for 5 years at the company's 5-year revenue growth (0 to 13.95%), faded over 5 years to 3%, discounted at the Damodaran industry cost of equity, with a terminal value at the stable-growth cost of equity (8.41%).
  • Justified P/B = (ROE − g)/(COE − g) × book value: (ROE − g) ÷ (COE − g) × book value per share; ROE averaged over 5 years on average common equity, COE 8.41%, g 3%.
  • Justified P/E = payout × (1 + g)/(COE − g) on normalized EPS: payout × (1 + g) ÷ (COE − g) × normalized EPS, payout = 1 − g ÷ ROE; EPS and ROE on earnings from continuing operations, EPS averaged over 3 years, COE 8.41%, g 3%.
  • FFO × Nareit property-group P/FFO: FFO per share (net income from continuing operations + depreciation & amortization) × the Nareit REITWatch property-group median P/FFO.

Source:Aswath Damodaran's relative valuation and financial-firm valuation, with market parameters from his dated tables (January 2026); REIT multiples from Nareit REITWatch.

Composite score

  • The stock page and the screener now compute the composite through one implementation, so they can no longer disagree.
  • Momentum is now the 12-1 month price return — the close about 30 days ago over the close about 365 days ago — ranked across the universe: 10 × the share of stocks with a lower return (Jegadeesh & Titman (1993), Journal of Finance 48(1), pp. 65-91; the most recent month is skipped because one-month returns reverse (Jegadeesh 1990; Carhart 1997)). It used to be a six-month trend.
  • A composite needs a Quality axis, a Value axis and a momentum score. A model that does not apply is left out of its axis, never scored as zero; an axis with no model means no composite, and the stock page says why. A model that applies but has too few evaluable signals for a score (Buffett, Graham, Piotroski) counts only if it pulls its axis down: its share of evaluable signals passed enters at its usual weight and the axis is the lower of the two, so missing data never raises an axis (our decision, not a source's). Before, a company without a Value axis could score on Quality alone.
  • The axis weights did not change: Quality 40%, Value 10%, Momentum 35%, Timing 15% in the general profile. Changing them honestly would need the backtest this release chose not to run.

Filings data

Before:share counts filed in thousands or millions were caught only by guessing from the price, figures in a foreign currency were set against a US-dollar price, and some international filers had no depreciation, capital spending or owners' profit line the models could read. Debt tagged only instrument by instrument, or not at all by a debt-free company, read as unknown.

Now:

  • Every share count is checked against reported EPS: implied shares = net income ÷ EPS (net income available to common where filed, so preferred dividends do not fail a correct count). A count within 15% of the implied one ÷ 1,000 or 1,000,000 was filed in thousands or millions and is rescaled (× the same, filed too large); with no count filed, the implied count is used and flagged; a count off by anything else is kept as filed and flagged, and no fair value is built on it. EPS below $0.10 checks nothing (cent rounding alone moves it too far). With no EPS to check against, the cover-page count of shares outstanding replaces a count more than 2× off it, or a missing one; only without either is the unit guessed from the price. A company with several share classes that reports EPS only per class (and so no count that reconciles) is counted in units of its listed class: net income available to common ÷ the listed class's diluted EPS, as filed in its 10-K or 10-Q — the class whose cover-page trading symbol is the ticker, or with one listed class the class with the most shares outstanding — used only within 2× of that class's own tagged diluted count (a loss year's two-class allocation can make the EPS no longer as-converted); per-share values are then per share of the class the price quotes. A filing that tags some counts in thousands beside others in units is first brought to one unit. Stock splits: a 10-K restates per-share data only for the years it presents, so each filing is put on the latest filing's share basis — the ratio read off the periods two filings both report, counted as a split only within 0.5% of a split ratio and only if the reported EPS moved inversely — and every older share count and per-share figure is adjusted by it. Where no filing links an older year to today's basis, a jump of more than 1.6× between consecutive share counts makes every multi-year per-share comparison across it unavailable. Where the listed class is not the class EPS is reported for, the chartered ratio converts it — never a ratio guessed from prices. BRK.B: 1,500 to one.
  • The reporting currency is the one most of a company's revenue and net income facts are filed in; convenience translations into another currency are dropped. Our prices are USD quotes, so for a company reporting in any other currency nothing that sets the price against its per-share figures is computed: it would need an FX rate and the ADR's shares-per-receipt ratio, and we model neither. Quality criteria from the filings alone are still scored. Not computed for such a company: market ratios (P/E, P/B, dividend yield, earnings yield, market cap); such a company is also left out of its sector's median P/E; Lynch (every category is valued against the price); Greenblatt (earnings yield sets a USD enterprise value against EBIT); Graham: Adequate size; Moderate P/E on 3-year average earnings; Moderate price to book value; Buffett: Each $1 retained added at least $1 of market value (5 years); Price at or below 75% of intrinsic value; the intrinsic value; the fair value. The page says “reports in <CCY>; ADR ratio/FX not modelled”.
  • Net income: IFRS profit attributable to owners of the parent comes before ProfitLoss, which includes non-controlling interests.
  • Earnings for price ratios: P/E, PEG and the earnings-based fair values (justified P/E, P/FFO, the P/E context) use income from continuing operations when it is filed, else net income, so a disposal gain is not capitalised. A 10-K with no continuing-operations line reported no discontinued operations, so its net income counts as continuing in the trailing twelve months. The EPS records (Graham's ten years, Lynch's growth), Piotroski's ROA and the owner-earnings DCF keep net income, as their sources define them. Price ratios read the trailing-twelve-month row at the live price; quality ratios (ROE, margins) the latest fiscal year.
  • Depreciation & amortization: Each later line is used only in a year where nothing before it is tagged; the last IFRS lines include impairment, which the 1986 letter's "certain other non-cash charges" covers.
  • Capital expenditure: The IFRS combined line (PP&E, intangibles and other non-current assets) is the last fallback.
  • Cost of revenue: Health-care benefit costs are added to cost of goods sold for filers with an insurance segment, unless the filer tags a total cost of revenue, which already includes them.
  • Intangible assets: The total excluding goodwill when tagged; otherwise finite-lived plus indefinite-lived (the indefinite total, else trademarks, franchise rights, licences and other lines summed).
  • Interest expense: Used only with no interest expense line: a net interest expense stands in for it (a floor — interest income is netted in); net interest income is ignored.
  • Current debt: Instrument lines, used only when no current-debt line (DebtCurrent, current term debt, short-term borrowings) is tagged; one family each, summed, a value tagged twice counted once.
  • Non-current debt: Instrument lines, used only when no non-current or total debt line is tagged; summed the same way.
  • Debt, instrument totals: Last resort for non-current debt: totals that may include the current portion, less the known current debt; UnsecuredDebt already contains notes, credit lines and loans. Instrument lines that sum to zero are not taken as no debt.
  • Debt counts as zero only when no debt line of any kind is tagged, nothing else in the filing says debt exists, the balance sheet is present (total liabilities, else assets less equity), and interest is at most 0.5% of liabilities and 0.5% of revenue. Otherwise debt stays unknown: unseen debt never reads as no debt. Such a period is shown as “no debt reported — treated as zero”.
  • Debt is part of liabilities, so debt above total liabilities (else assets less equity) is a tagging error: that period's debt is left unknown, never used and never read as zero. A negative debt line is likewise dropped and never read as zero. A total-debt line includes the current maturities, so they are subtracted for non-current debt: the current-portion line when tagged, else the current-debt line less short-term borrowings tagged beside it.

The full current definitions — every criterion, threshold, source and status band — are on the methodology pageand each model's page. They are generated from the same code that computes the scores.