Scores · Version v1.0.0
Methodology
v1 methodology, subject to change
The company profile describes financial characteristics relative to similar companies. It does not predict returns. Every weight below is a starting point.
Pipeline
- US operating companies use the operating score. A bank, an insurer or a REIT is scored only when the filing tags in its own section are present. A name that falls short keeps a page and a note that says which input is missing.
- Each metric is winsorised at the 1st and 99th percentile inside the peer group, then turned into a percentile. Rank 1 is the weakest reading.
- Metric score = 0.7 × peer percentile + 0.3 × absolute-anchor score.
- The operating peer group is the industry when at least 20 scored companies are in it, otherwise the sector. Banks are ranked against other banks, and against the same industry only when at least 20 banks are in it. Insurers are ranked against other insurers and REITs against other REITs.
- A sub-score with under 70% weight coverage is shown as a dash and left out.
- An operating composite needs at least 4 of 6 sub-scores. A bank composite needs at least 4 of 7 bank sub-scores, an insurer composite at least 4 of 5, and a REIT composite at least 4 of 4. Missing inputs are left out and the remaining weights are renormalised. A company with fewer groups stays unscored, and the page lists each group that fell short.
- A hard flag — Altman Z-double-prime under 1.1 and negative free-cash-flow margin — caps the composite at 59.
- v1 calibration is an identity map. A quarterly-frozen anchor table is not fitted yet.
P = 100 × (rank − 1) / (n − 1)
Z″ = 6.56×X1 + 3.26×X2 + 6.72×X3 + 1.05×X4
Weights
Operating companies. v1 methodology, subject to change.
| Group | Weight |
|---|
| Profitability | 20% |
| Growth | 20% |
| Balance sheet | 15% |
| Cash flow | 15% |
| Valuation | 15% |
| Momentum and quality | 15% |
Banks
Banks are not scored on the operating groups. The bank score uses only these filing tags. A tag that is absent stays blank. It is not filled from an operating ratio. CET1 is the tagged CommonEquityTierOneCapitalRatio. When that tag is absent, capital uses equity divided by assets. Net interest margin is net interest income divided by average total assets, because these companyfacts files do not carry an interest-earning-assets tag. Loan-loss provision and loans each use the tagged concept with the newest period end.
| Group | Weight |
|---|
| Returns | 20% |
| Efficiency | 15% |
| Net interest margin | 15% |
| Capital | 15% |
| Credit | 15% |
| Funding | 10% |
| Valuation | 10% |
Returns
| Metric | Weight | Better when | Formula |
|---|
| Return on assets | 50% | higher | NetIncomeLoss / average Assets |
| Return on equity | 50% | higher | NetIncomeLoss / average StockholdersEquity |
Efficiency
| Metric | Weight | Better when | Formula |
|---|
| Efficiency ratio | 100% | lower | NoninterestExpense / (InterestIncomeExpenseNet + NoninterestIncome) |
Net interest margin
| Metric | Weight | Better when | Formula |
|---|
| Net interest margin | 100% | higher | InterestIncomeExpenseNet / average Assets |
Capital
| Metric | Weight | Better when | Formula |
|---|
| CET1 ratio | 50% | higher | us-gaap CommonEquityTierOneCapitalRatio |
| Equity / assets | 50% | higher | StockholdersEquity / Assets |
Credit
| Metric | Weight | Better when | Formula |
|---|
| Loan-loss provision / loans | 100% | lower | Provision tag / loans tag. The newest tagged concept is used. |
Funding
| Metric | Weight | Better when | Formula |
|---|
| Deposit growth | 100% | higher | Deposits now / Deposits prior year − 1 |
Valuation
| Metric | Weight | Better when | Formula |
|---|
| Price / book | 50% | lower | Price / (StockholdersEquity / diluted shares) |
| Price / earnings | 50% | lower | Price / (NetIncomeLoss / diluted shares) |
Insurers
Insurers are not scored on the operating groups. The insurer score uses only these filing tags. A tag that is absent stays blank. Nothing is filled from another concept. The combined ratio is claims incurred plus policy acquisition cost amortization plus other underwriting expense, divided by premiums earned. It is derived only for property and casualty insurers by SEC industry, and only when every part is tagged. Alternate tags are mapped for each part, such as the supplementary insurance information versions. Berkshire Hathaway tags premiums earned, claims and underwriting expenses only on its Insurance and Other segment, so the SEC feed has none of them. For Berkshire they are read from the segment-tagged figures in its own 10-K, only when the three cost parts add up to the filing's underwriting-segment total, and the page says "From reported segment data" with the filing accession and tags. Its combined ratio is losses and loss adjustment expenses plus life, annuity and health benefits plus the one underwriting-expense line, over premiums earned. The four-of-five rule is unchanged. Premium growth compares premiums earned with the prior annual filing, and is used only when premiums earned are at least 20% of revenue, so brokers and companies with a small premium line are not read on it. Price-to-book and price-to-earnings divide a market value by filing totals. That market value is the published universe market value moved to the latest stored close, because filing share counts are not adjusted for later splits and the stored closes are. A figure outside a plausible band, such as a price-to-earnings above 100, is left blank and not scored.
| Group | Weight |
|---|
| Returns | 25% |
| Underwriting | 25% |
| Premium growth | 15% |
| Capital | 15% |
| Valuation | 20% |
Returns
| Metric | Weight | Better when | Formula |
|---|
| Return on equity | 100% | higher | NetIncomeLoss / average StockholdersEquity |
Underwriting
| Metric | Weight | Better when | Formula |
|---|
| Combined ratio | 100% | lower | (PolicyholderBenefitsAndClaimsIncurredNet + DeferredPolicyAcquisitionCostAmortizationExpense + OtherUnderwritingExpense) / PremiumsEarnedNet. Alternate tags are mapped in the filing-tag step. |
Premium growth
| Metric | Weight | Better when | Formula |
|---|
| Premium growth | 100% | higher | PremiumsEarnedNet now / PremiumsEarnedNet prior year − 1 |
Capital
| Metric | Weight | Better when | Formula |
|---|
| Equity / assets | 100% | higher | StockholdersEquity / Assets |
Valuation
| Metric | Weight | Better when | Formula |
|---|
| Price / book | 50% | lower | Market value / StockholdersEquity. Market value is the universe market value moved to the latest stored close. |
| Price / earnings | 50% | lower | Market value / NetIncomeLoss. Market value is the universe market value moved to the latest stored close. |
REITs
REITs are not scored on the operating groups. The REIT score uses only these filing tags. A tag that is absent stays blank. Funds from operations is net income plus depreciation and amortization, minus gains on property sales when the filing tags them. When no property-sale gain is tagged, none is subtracted. Total debt is the largest tagged debt total at the period end. When a filing tags no total, total debt is computed from the reported debt pieces at that same period end: credit lines, senior notes, unsecured debt or term loans, and secured or mortgage debt. Each kind of instrument counts once, and at least two kinds must be tagged. The page says "Computed from reported debt pieces" for those names. FFO yield divides funds from operations by that same split-consistent market value. Dividend coverage divides funds from operations by common dividends paid in the year. When a filing tags no dividends-paid total, it uses the reported common dividend per share times the weighted-average share count for the same year, and the page says how it was computed. A figure outside a plausible band is left blank and not scored. A mortgage REIT without a depreciation and amortization total stays unscored.
| Group | Weight |
|---|
| Funds from operations | 25% |
| Leverage | 25% |
| Dividend coverage | 25% |
| Revenue growth | 25% |
Funds from operations
| Metric | Weight | Better when | Formula |
|---|
| FFO yield | 100% | higher | (NetIncomeLoss + depreciation and amortization − property-sale gains) / market value. Market value is the universe market value moved to the latest stored close. |
Leverage
| Metric | Weight | Better when | Formula |
|---|
| Debt / assets | 60% | lower | Tagged debt / Assets |
| Debt / equity | 40% | lower | Tagged debt / StockholdersEquity |
Dividend coverage
| Metric | Weight | Better when | Formula |
|---|
| Dividend coverage | 100% | higher | FFO / PaymentsOfDividends |
Revenue growth
| Metric | Weight | Better when | Formula |
|---|
| Revenue growth | 100% | higher | Revenue now / Revenue prior year − 1 |
Bands
| Score | Band |
|---|
| 80 to 100 | Very strong profile |
| 65 to 79 | Strong profile |
| 50 to 64 | Mixed profile |
| 35 to 49 | Weak profile |
| 0 to 34 | Very weak profile |
Metrics
Profitability
| Metric | Weight | Better when |
|---|
| ROIC | 30% | higher |
| Operating margin | 25% | higher |
| Gross margin | 15% | higher |
| Net margin | 10% | higher |
| Margin stability | 20% | lower |
Growth
| Metric | Weight | Better when |
|---|
| Revenue CAGR, 3Y | 20% | higher |
| EPS CAGR, 3Y | 15% | higher |
| FCF per share CAGR, 3Y | 15% | higher |
| Consensus revenue growth, 2Y | 20% | higher |
| Consensus EPS growth, 2Y | 20% | higher |
| Growth consistency | 10% | higher |
Balance sheet
| Metric | Weight | Better when |
|---|
| Net debt / EBITDA | 25% | lower |
| Interest coverage | 20% | higher |
| Current ratio | 10% | higher |
| Altman Z-double-prime | 20% | higher |
| Cash runway | 10% | higher |
| Net share issuance, 3Y | 15% | lower |
Cash flow
| Metric | Weight | Better when |
|---|
| FCF margin | 25% | higher |
| FCF conversion | 20% | higher |
| Accruals ratio | 15% | lower |
| Years of positive FCF | 20% | higher |
| FCF margin trend | 10% | higher |
| SBC-adjusted FCF margin | 10% | higher |
Valuation
| Metric | Weight | Better when |
|---|
| FCF yield | 25% | higher |
| Earnings yield | 20% | higher |
| P/E vs own 5Y median | 15% | lower |
| EV/Sales vs sector | 10% | lower |
| Price vs model range | 20% | lower |
| Forward P/E vs growth | 10% | lower |
Momentum and quality
| Metric | Weight | Better when |
|---|
| 12-1 month return | 25% | higher |
| Price vs 200-day average | 10% | higher |
| 6-month relative strength | 15% | higher |
| EPS estimate revisions, 3M | 20% | higher |
| Piotroski F-score | 20% | higher |
| Beneish M-score | 10% | lower |
Risk flags
- Altman Z-double-prime under 1.1.
- Beneish M-score above -1.78.
- Going-concern language in the annual filing text, when that text is on file.
- An 8-K item 4.02 non-reliance mark, when that filing is on file.
- Interest coverage under 1.5 times.
- Diluted share count growing faster than 10% a year over three years.
Scenarios and model range
Model-only estimate
g(t) = g∞ + (g0 − g∞) × (1 − t / N)
EPS(t) = (Revenue(t) × margin(t) × (1 − tax) − interest) / shares(t)
- This app does not load a consensus feed. Bear growth is recent growth minus one standard deviation. Base growth is the fade model. Bull growth is recent growth plus one standard deviation.
- Bear margin is the trough of the last five years. Base blends the company median with the sector median. Bull uses the five-year peak.
- Exit multiples are the company's own 5-year 25th percentile, median and 75th percentile.
- The discount rate is a CAPM rate (risk-free 0.04 plus beta times an equity premium of 0.045). Bear adds one point. Bull subtracts one point.
- No probabilities are assigned.
- Cash-flow model paused for review. It discounts free cash flow for 10 years and adds a terminal value, but it is left out of every model range until the review is done.
- Each remaining method is checked on its own. Both ends must be positive and between 0.2× and 5× the current price, or the method is dropped.
- The combined range is rebuilt from the methods that pass. It is the 25th to 75th percentile of their midpoints, widened to include their low and high ends. It is shown only when at least two methods pass, and the page says how many (for example "Based on 2 of 3 methods"). Otherwise no range is shown. A combined range whose high end is more than 5× its low end is also not shown, because the methods disagree too widely to give a usable range. The page says so.
- The Bear, Base and Bull panel checks each scenario the same way: the value per share must be positive and between 0.2× and 5× the current price. The panel is shown only when at least two scenarios pass, and only the passing scenarios are listed.
- The 5× width limit and the two-method minimum are about what the page shows. The Price vs model score input divides the price by the median midpoint of the methods that passed their own check, even when the combined range is not shown. A method that is dropped is not in that median. When no method passes, the input is left out and the other groups are reweighted. A range that is not shown does not place a stock in "Below model value range".
- Confidence is High when range width is at most 0.35, Medium up to 0.7, otherwise Low. Width is (combined high − combined low) / the median method midpoint.
- Wording is only: price is below, within, or above the model range.
Up to three sliders (revenue growth, margin level, discount rate) can be moved on the company page. Reset restores the published path. The moves are view-only and are not saved.
Plain-language summary
The summary is a template filled from a facts file. A validator rejects any number that is not in those facts, and it rejects a blocklist of directive words. This version does not call a language model.
Sources
- SEC EDGAR companyfacts is the production fundamentals source. Requests send a descriptive User-Agent.
- Fundamentals are cached SEC EDGAR companyfacts snapshots. Regenerate them with npm run edgar:fetch.
- Prices are ten years of daily closes from Yahoo Finance, split-adjusted, downloaded once and then extended by one day each night. Pages read the stored copy and never call Yahoo Finance for history. Charts are labelled Daily prices: Yahoo Finance, split-adjusted, with the date of the latest session. Stooq is the fallback for a symbol where Yahoo Finance failed. A name with no stored history uses sample price data.
- A headline price may be a display quote. The source and time are shown on the figure. It may be delayed. Scores, charts and model ranges use the stored daily closes.
- Financial Modeling Prep is implemented as an adapter and left off unless FMP_ENABLED=true, because a public-display licence is unconfirmed.
Limitations
- A stock is held for review, with no score, when its newest annual filing data ended more than 18 months before the run date. A company that stops filing a revenue tag keeps its history through the latest year on file: the years come from net interest income or net income, and revenue under another tag is used only for years after the old tag ends. A cost-of-revenue tag under 0.5% of revenue is treated as a minor line, not the cost of revenue, so no gross margin is built from it. A reported gross margin of 99.5% or more is held for review. In the cash-flow scenarios, marketable securities and short-term investments are subtracted from debt along with cash.
- Ranked lists and the Top 50 order stocks by the whole-number score shown on the page. When stocks share the same whole-number score, the one with the higher unrounded score comes first, and if those are equal too, the ticker in A to Z order. The order never changes between page views. A stock held for data review has no score and is not ranked, and its score does not appear in other companies' peer tables, which show Held instead. EPS (FY) is the full-year diluted earnings per share the filing reports (basic when no diluted figure is filed, labeled). Only when the filing tags neither is it computed, from net income and diluted shares, and the page says so. A company that reports earnings per share only per class (Berkshire) shows none when the SEC data feed does not carry it. A 52/53-week fiscal year that ends in the first week of January is named for the year before, so the year ended 2026-01-02 is FY2025.
- Annual charts and the annual financials table show the latest five fiscal years on file, one column per fiscal year, and fewer for a recent listing. Older years stay in the data behind the scores, which has up to eight years. A year inside that window with no column is named under the chart, for example a year with zero or negative revenue or one the SEC data feed does not carry.
- The share count on a stock page is the cover-page count of the newest 10-K or 10-Q in the SEC data feed, and the card names that filing. For some stocks the card cites an older filing than the newest one the feed has, because the SEC feed does not yet carry the newer cover data. In the snapshots fetched 2026-11-01, 26 of the 495 cover-count cards cite an older filing than the newest 10-K or 10-Q the feed has for that company (for example CNP, FE, D, DLR, LNT, MAA). The card shows the filing it used, and the count is not changed to a figure the feed does not have.
- Fundamentals are the latest cached EDGAR extract, not a live refresh on each page view. Price history is the stored Yahoo Finance daily closes. Momentum measures that need a longer window stay blank for a name with less history than the window. Filing share counts and per-share figures are put on today's split basis with Yahoo Finance's split events. The share count is the cover-page count of the latest 10-K or 10-Q (all share classes added together; for Berkshire, class B shares count as 1/1,500 of a class A share), with the weighted diluted count used only when the cover count is missing. A count more than 3× away from market value divided by price is rejected. Sectors come from the company profile on Yahoo Finance, with the SEC industry code as the fallback. Day change compares the latest price with the previous session's unadjusted close.
- A company with more than one listed share class (Berkshire A and B, Alphabet GOOGL and GOOG, News Corp NWSA and NWS) is one company. It is scored once, on one ticker (Berkshire on class A figures, otherwise the larger class), and every class shows that same score, rank and model inputs. Market value counts all classes. Per-share figures for Berkshire B are class A figures at 1/1,500. Each class keeps its own price, chart and day change. Goldman Sachs, Morgan Stanley, Charles Schwab, American Express and Synchrony are bank holding companies. They file net interest income, noninterest expense and deposit tags, so they are scored on the bank score even though their SEC industry code is a broker or finance code. Where a filing gives total debt under another standard tag (for example Oracle's combined short- and long-term debt), that tag fills a year only when the main debt tags are absent. Berkshire revenue uses one tag (Revenues) in every year. A stock held for data review shows no score, no model range and no score-based sections. Ranked lists, the score map, Biggest movers and the all-stocks table show one row per company, using the class with the higher average Yahoo Finance volume over the last 20 sessions, with the other tickers noted as "Also". Ranks and counts count companies.
- Identity calibration means the 0 to 100 spread is not yet forced to a universe distribution.
- Banks, insurers and REITs are scored only when their own filing tags are present. A name that is missing a required figure stays unscored, and its page says which one.
- Consensus inputs are left out and the remaining weights are renormalised. Data confidence is lower because those inputs are absent.
- Peer groups inside a 50-name sample are small outside application software.
Changelog
v1.0.0 — October 2026. First published weights, anchors, flags and scenario rules. Calibration is an identity map. Bank groups were added for filings that carry the bank tags. Insurer and REIT groups were added for filings that carry their tags. Operating-company weights are unchanged. v1 methodology, subject to change.