How FinPile Scores Stocks — Our Methodology
Last updated September 2026 · Methodology version 1.6
The one-sentence version
Every score, rating, and flag on FinPile is computed by fixed, published rules — deterministic code, not AI judgment. AI writes the plain-English explanation after the scoring is done, and it cannot change a single number.
Most AI stock tools work the other way around: they hand your ticker to a language model and let it improvise an opinion. We think that's the wrong architecture for financial analysis, because you can't audit an improvisation. You can audit a rulebook. This page is ours.
The fairness rule
Every rule in our engines must be statable without naming a company, a country as a prejudice, or a sector as a prejudice. No ticker is special-cased. No market gets a thumb on the scale.
That doesn't mean every stock is treated identically — a micro-cap with three reverse splits should read differently than a mega-cap with a buyback program. It means the differences flow from stated, universal conditions any stock could trigger: "listings quoted in pence get currency normalization," "sectors on this named list get asset-heavy valuation treatment," "any company whose share count fell more than 50% in a year gets that trend excluded as a probable restructuring artifact." Same trigger, same treatment, every time.
What we analyze
Financial Health — 11 signals, one rating (12 for financial institutions). Profitability, cash-flow quality (is net income backed by operating cash?), free-cash-flow status, returns, growth, liquidity, leverage, interest coverage, share-count trend, and equity status. Banks and insurers are scored on bank-appropriate metrics — industrial solvency ratios are excluded as not meaningful, and ROE joins the set. Each signal passes, fails, sits in a neutral band, or is marked not meaningful with its reason. The weighted total maps to five ratings, Strong to Distressed — and the badge shows the score, the fail count, and an edge qualifier when a rating sits at its band's boundary, because a Strong at 4.0 with two fails and a Strong at 11.5 with none are different animals and should look it. A perfect sweep — every signal passing, no caveats — earns a "flawless" mark; it's rare, and it describes the snapshot, not the future. A company whose revenue is collapsing gets its rating capped no matter how pretty the other signals look.
Valuation — multiples with a loss-maker rule, a band line, and a refusal. Six multiples with fixed cheap/elevated bands, judged against sector medians and the stock's own 5-year range (the combined rule: a multiple reads elevated only when it exceeds both the absolute threshold and 1.2× its sector median). Earnings-based measures lead when real earnings exist; loss-makers are judged on revenue-based multiples and labeled as such. Fewer than two usable multiples → "insufficient data," not a guess. The valuation band shows the price zones where our own verdict would flip — and when the current price sits far outside every zone (beyond ~2× the boundary), we refuse to draw the band and say why: at that distance, the market is pricing expectations far beyond reported results, and dollar zones would imply a precision the arithmetic doesn't have.
DCF Sensitivity — assumptions shown, spread as the answer. We display a discounted-cash-flow grid across terminal-growth and discount-rate assumptions, with every input disclosed (WACC, beta, growth path — from our data provider's model) and our own recomputation reconciled against it within 2% before anything renders. The spread across the grid is the finding; we never label any cell "fair value." The module gates itself off for financial institutions, negative-cash-flow companies, and stale computations — a negative "intrinsic value" is an artifact, not a valuation.
Implied Expectations — the DCF, run backwards. A forward DCF guesses the future to produce a value, which is why we refuse to print one. A reverse-DCF inverts the arithmetic instead: it takes today's price as given and solves for the annual free-cash-flow growth rate that price already implies, then shows it beside what the company has actually delivered — the gap between implied and realized is the finding. It rests on three fixed, deliberately disclosed assumptions, rendered with every result: a single transparent 10% discount rate (not a per-stock WACC estimate, which would add precision the inputs don't support), a 10-year horizon, and 2.5% terminal growth thereafter, grown from trailing-twelve-month free cash flow. Reverse-DCF is more honest than forward-DCF but it is not assumption-free, so you can always see exactly what the number rests on — a different discount rate implies a different growth rate. It gates for the same cases the forward DCF does: banks, insurers, REITs, pre-revenue companies, and negative trailing free cash flow, where a growth rate cannot be solved from a negative base at all. This is a separate lens from the valuation verdict, not an input to it: it feeds no rating, no cell, no scanner, and no score. It reveals the expectations already priced in; it never estimates what a company is worth, and whether the implied growth is plausible is your judgment to make.
One lens, two rules — stated side by side so the difference is deliberate, not drift. The implied growth rate is read by two modules that ask different questions, and each has its own rule. The evidence tally asks the valuation question — is the price assuming more than the company has shown? — so it reads the rate relatively: implied growth more than 5 points above every recent realized figure (last-year revenue, 3-year revenue CAGR, TTM free-cash-flow change) leans unfavorable; implied growth below every one of them leans favorable; anything between is neutral. The "Into earnings" panel asks the setup question — how demanding is the assumption in absolute terms? — so its badge tier reads the rate absolutely: implied free-cash-flow growth of 15%/yr or more is a High bar, 5–15% a Moderate bar, below 5% or negative a Low bar. A decade-long ≥15% assumption is demanding regardless of what recent quarters did, so the relative comparison becomes the modifier sentence there, honest in both directions: "a rate the company has recently been clearing" when delivery sits above the implied rate, "above what the company has recently delivered" when it sits below. A stock can therefore lean favorable in the tally and still carry a High bar into a report — both statements are true, about different things.
Dilution Risk — a 100-point score built from SEC filings. We read EDGAR directly: shelf registrations, offering documents, split-adjusted share-count history, reverse-split records, insider Form 4s. Dilution is measured split-adjusted, so a reverse split can't launder a rising share count. Debt offerings are classified and excluded — borrowing is not printing shares. Insider transactions are classified by their filing codes: open-market purchases are distinguished from option exercises, scheduled-plan sales, and awards, and transactions pre-dating a company's listing are flagged rather than counted.
Technical read — levels, structure, and history. A price ladder of the monthly and weekly levels the market has actually respected, with break/hold/reclaim detection; a structure read from trend alignment and level interaction; seasonal history over ten years with win rates, ranges, and flags on the months where an earnings date — not the calendar — drives the average; and gap-behavior statistics (how this stock's past gaps resolved, by direction and by earnings context, every rate shown as "X of N"). Pattern detection names what the combined picture resembles — serial diluter, low-float mover, value trap, and others — each with published trigger conditions.
Election History — calendar windows, counted honestly. Around each US election in a stock's available history we measure the ±60-trading-day window — total return, drawup/drawdown, realized range — each beside SPY over identical dates, and the volatility comparison is testable rather than asserted: election-window range is shown against the stock's own average across all ordinary 120-day windows. Every figure carries its n; medians with ranges, never bare averages; fewer than three elections gates the view with the reason. The four-year-cycle table averages only the market's record; a stock below five complete cycles gets its years listed, not averaged. Administrations render only as an undigested chronological list with a named macro confound per window — no "under party X" average exists at any n, because five experiments is a story, not a statistic. The module is context only: it feeds no verdict, no screener, no scanner.
Catalysts — type and materiality, never direction. We classify what happened and how big it is. We retired "positive/negative catalyst" labels deliberately: whether news is good for shareholders is the market's call, and press releases are written to sound like good news. Where an event's mechanics are checkable — a dilutive raise on a thin float, a dividend cut — we name the mechanism; we never grade the story.
The Scanner — cells, not picks. Weekly, we place every universe stock into a grid cell by health × valuation — descriptive names ("Quality at a fair price," "Value-trap territory"), never rankings. Trap cells render as prominently as attractive ones. After every run, an assertion verifies each stock's cell matches its own displayed chips — the cells and the pages can never disagree silently. Empty cells render with their counts, because "no quality is visibly cheap this week" is a finding.
Business trajectory — the income statement over time
the sixth counted factor · traj-lean-1.1Health and trajectory answer different questions, and both answers matter. The health gauge reads the balance sheet and the latest period's quality — is this company sound: does it cover its debt, convert profit into cash, earn a real return? Business trajectory reads the income statement across quarters — is the business growing or shrinking? A company can be financially strong and getting smaller at the same time, and until this layer existed the product named the first and not the second. Neither gauge is a forecast: one describes the books as filed, the other describes the direction the filed quarters have already taken. They can disagree, and when they do, that disagreement is the finding.
The five signals
- Revenue growth trend — year-over-year growth for each of the last 8 quarters, and the direction of that series.
- Operating margin direction — trailing-four-quarter operating margin now against the same figure a year ago, in basis points.
- Gross margin direction — same construction, on gross profit.
- EPS trend — year-over-year diluted EPS growth for the last four quarters. A loss-making year-ago quarter carries no percent (it would not be meaningful) — the pair is shown instead.
- Free cash flow trend — trailing-four-quarter free cash flow now against a year ago.
Every comparison is year-over-year, never quarter-over-quarter: retail, travel and education are seasonal, and a quarter-over-quarter series reads seasonality as trajectory. Fewer than 6 comparable quarters reads "too little history" rather than a direction.
The rule table — first match wins, most specific first
| Verdict | Fires when | What it says |
|---|---|---|
| 1. Too little history | fewer than 6 quarters carry a year-over-year figure | Too few comparable quarters are on file to describe a direction. |
| 2. Turning | a declining base, with the last two quarters improving each step · latest quarter still below +15% | The business has been shrinking, and the last two quarters improved off that base. |
| 3. Declining | latest quarter's revenue is below a year ago, or 2+ consecutive quarters are | Revenue is below where it was a year ago — the business is smaller, not slower. |
| 4. Slowing from high growth | growth falling for 3+ quarters but the latest quarter still ≥ +25% · margins not compressing | Growth is normalizing from a very high rate; the business is still growing fast. |
| 5. Decelerating | growth still positive but falling for 3+ quarters (latest below +25% — above that, Slowing from high growth fires first), or margins compressing while revenue grows at any rate | The business is still growing, but the rate is coming down or the margin is paying for it. |
| 6. Accelerating | growth rising (recent 3 quarters ≥ 2pp above the prior 3) · margins expanding or flat | Growth is faster than it was, and the margin is not paying for it. |
| 7. Margin-led | growth roughly constant (within 2pp) · operating margin expanding (≥ 50 bps) | Growth is about where it was, and the margin is wider than a year ago. |
| 8. Steady | growth roughly constant (within 2pp) · margins flat | Growth and margin are both about where they were a year ago. |
| 9. Mixed trajectory | the readable signals match no row in the table cleanly | The revenue and margin signals do not form one of the named shapes. |
Thresholds: margins read expanding or compressing at ±50 bps and flat inside that; growth reads rising or slowing when the mean of the last three quarters sits ≥2pp above or below the prior three; "slowing" needs 3+ consecutive quarters of falling growth; "declining" fires on a negative latest quarter or 2+ consecutive negative quarters. There is no trajectory score. Turning is deliberately ordered above Declining — a turnaround still has a negative latest quarter, and force-fitting it into Declining (or into Steady) would hide the one shape that is genuinely different. Its mirror sits on the other side of the table: a falling run whose latest quarter is still ≥ +25% reads Slowing from high growth (neutral) rather than Decelerating — growth normalizing from a very high rate is not a business slowing down. Margin compression is deliberately magnitude-free: it still reads Decelerating at any growth rate.
Honesty guards
- Acquisition-driven growth — a major M&A development inside the window where this company is the acquirer caps the verdict at Steady and states that the organic trend is not separable from the filings. Bought revenue is not acceleration. Being acquired does not trigger the cap.
- Divestiture or discontinued operations — a revenue drop coinciding with a divestiture is flagged and the decline verdict is withheld; a smaller line after selling a business is not a shrinking business.
- Currency — a change of reporting currency inside the window is named, never converted, and never changes the verdict.
- Basis breaks — a fiscal-calendar shift makes the year-ago quarter incomparable, so that quarter is left unread and the seam is named on the card.
How it votes — the sixth independent factor
Business trajectory is one of the six independent factors in the balance of evidence and in the convergence read. Health reads the book, trajectory reads the business, and they are genuinely different questions — so a strong balance sheet on a shrinking business now reads as a split instead of agreement. The mapping below is rendered from the engine's own array, so this page cannot drift from the code:
| Verdict | Counts as | Why that weight |
|---|---|---|
| accelerating | favorable (strong) | growth rising and the margin is not paying for it — the whole income statement leans one way |
| turning | favorable (mild) | improving off a declining base — a one-sided improvement, not yet a growing business |
| margin led | favorable (mild) | margin wider on flat growth — better economics, no growth acceleration |
| slowing from high | neutral (normal) | growth normalizing from a very high rate with margins holding — still growing fast, so neither a dissent nor a fresh favorable read |
| steady | neutral (normal) | growth and margin both about where they were — nothing leans |
| mixed | neutral (normal) | the readable signals match no named shape — no lean is claimed |
| decelerating | unfavorable (mild) | still growing below the high-growth floor with the rate coming down, or the margin is paying for growth at any rate |
| declining | unfavorable (strong) | revenue below a year ago — the business is smaller, a whole-income-statement statement |
| too little history | not read — excluded | fewer than six comparable quarters — treated exactly like an unread catalyst: it caps the state at converging and can never reach converged. |
A strong-form dissent still caps the whole read at Mixed — split regardless of the count, so a Declining business against otherwise favorable factors is a split and never a net lean. The ≥3 non-neutral floor is unchanged. An acquisition-capped Steady votes neutral and carries the cap onto its chip — bought revenue never votes as organic growth.
What this build deliberately does not do
The situation-profile table still reads the original five dimensions in this build — the profiles that now hide a trajectory split are recorded for the next profile-table pass:
- Quality at a fair price would split into fair-priced growth vs the fair-priced shrinking book.
- Quality at a premium would split on whether the premium sits on an accelerating or a declining business.
- Cheap-looking on strong books + Declining IS the LULU shape — the discount and the direction are the same finding.
Horizon lenses — the same facts, re-tiered by reach
spec lens-1.5
A balance sheet matters for years. A short squeeze matters for days. Both are facts about the same company, and reading them as one undated pile is what makes a verdict feel wrong at your own holding period. So the evidence is re-tiered by horizon: each lens keeps every factor's verdict and strength exactly as computed and changes only which of them are counted. No factor is re-read, no lean is re-derived, and no multiplier exists anywhere in this system.
Which factors reach which horizon
| Factor | Positionmonths–years | Swingweeks–months | Near-termdays–weeks |
|---|---|---|---|
| Health (balance sheet) | primary | primary | context |
| Valuation (+ implied expectations) | primary | primary | context |
| Business trajectory (income statement) | primary | primary | context |
| Dilution / risk | primary | context | primary |
| Short structure | context | secondary | primary |
| Recent catalyst | context | primary | primary |
| Trend structure (daily / weekly) | primary | context | primary |
| Momentum (4-hour) | context | primary | context |
| Momentum (1-hour) | context | context | primary |
Each lens counts one read of price action at the timeframe matching its reach; other timeframes are context. A dash means the factor is not part of that lens at all.
Why each factor sits where it does
Position · months–years
What the filings say about the business you would own.
- Health (balance sheet) — the balance sheet is what survives a multi-year hold
- Valuation (+ implied expectations) — the price paid against the business is the whole of a long return
- Business trajectory (income statement) — where the income statement is heading compounds over years
- Dilution / risk — share issuance permanently dilutes a multi-year holder's claim
- Trend structure (daily / weekly) — daily and weekly trend structure is the only price read with a 200-period average behind it
- Short structure — positioning turns over in weeks — it does not reach a multi-year hold
- Recent catalyst — one recent development rarely changes the multi-year case
- Momentum (4-hour) — a four-hour momentum reading says nothing about a multi-year hold
- Momentum (1-hour) — an hourly momentum reading describes the last few sessions only
Swing · weeks–months
What has just changed, against what the price already assumes.
- Recent catalyst — a recent major development is the thing most likely to move a swing window
- Valuation (+ implied expectations) — what the price already assumes decides how much a change is worth
- Business trajectory (income statement) — the filed direction of the business is readable inside a quarter or two
- Health (balance sheet) — the balance sheet bounds how far a swing window can go against you
- Momentum (4-hour) — four-hour momentum is the price read that lives as long as a swing window
- Short structure — positioning shapes how a swing move travels
- Dilution / risk — issuance risk is real but rarely lands inside one swing window
- Trend structure (daily / weekly) — daily structure frames the swing read; the counted price read here is the 4-hour gauge
- Momentum (1-hour) — an hourly reading is shorter-lived than a swing window
Near-term · days–weeks
What the tape and the positioning show right now.
- Recent catalyst — the most recent development dominates a days-to-weeks window
- Short structure — short positioning and unwind speed act on exactly this horizon
- Momentum (1-hour) — hourly momentum is the tape a days-to-weeks window actually trades on
- Dilution / risk — an open issuance programme can price inside days
- Trend structure (daily / weekly) — daily trend structure is the regime a days-to-weeks move happens inside — a different question from the hourly push
- Health (balance sheet) — the balance sheet does not change inside a week
- Valuation (+ implied expectations) — cheapness says nothing about the next few days
- Business trajectory (income statement) — quarterly direction does not read at this horizon
- Momentum (4-hour) — the four-hour gauge is shown beside the hourly read, never counted twice
How a horizon read is counted
- Primary — the four counted factors. The same convergence rules apply as to the single tally: at least three agreeing non-neutral reads, conflicts named before any lean, a strong dissent capping the read at split, and an unread factor holding it one step short.
- Secondary — named, never counted toward the agreement floor. It can add to the majority, and a strong dissent or an unread secondary factor stops a converged read.
- Context — displayed with its lean, never counted, never in the denominator. A strong dissent here still stops a converged read: a bankruptcy filing does not reach a multi-year thesis on the arithmetic, but it is not something to leave unnamed either.
- Converged is strict — every counted factor read and agreeing, no unread secondary factor, and no strong dissent anywhere outside the counted tier. Falling short of any of those is stated as one step short, never as a split.
- Disagreement is the finding — when the horizons read differently, that is stated as the result. It is never averaged into one answer.
One counted price read per horizon
| Horizon | Counted price read | Shown as context |
|---|---|---|
| Positionmonths–years | Trend structure (daily / weekly) | Momentum (4-hour), Momentum (1-hour) |
| Swingweeks–months | Momentum (4-hour) | Trend structure (daily / weekly), Momentum (1-hour) |
| Near-termdays–weeks | Momentum (1-hour), Trend structure (daily / weekly) | Momentum (4-hour) |
No trend-structure claim is made at 1 or 4 hours: the established-uptrend / downtrend classification needs a 200-period average, and the intraday feed does not go back far enough to compute one — so those timeframes are read as momentum only, and no shorter average is substituted. Too few intraday bars, or a non-trading listing, leaves the read unread rather than neutral.
Intraday momentum → lean (swing 4-hour · near-term 1-hour)
| Momentum gauge | Lean | Form |
|---|---|---|
| Strongly bullish | favorable | strong-form |
| Bullish | favorable | mild-form |
| Neutral | neutral | normal-form |
| Mixed | neutral | normal-form |
| Bearish | unfavorable | mild-form |
| Strongly bearish | unfavorable | strong-form |
Shorter timeframes are noisier and shorter-lived than the daily read, so the hourly chip carries its own as-of stamp and that cue. A gauge label with no entry in this table is left unread rather than guessed at.
Trend structure → lean (the counted read at a position horizon)
| Structure | Lean | What it means |
|---|---|---|
| Established uptrend | favorable | price above all major averages, bullish alignment |
| Pullback in longer uptrend | favorable | slipped below the 20-day while holding the longer averages |
| Partial bullish alignment | favorable | above the 200-day, averages not yet stacked — favorable, one tier softer |
| Established downtrend | unfavorable | price below all major averages, bearish alignment |
| Weakening structure | unfavorable | below the 200-day, shorter averages not reclaimed |
| Short-term breakdown | unfavorable | above the 200-day but broken below both short averages |
| Early / repairing structure | neutral | short averages reclaimed from below, still under the 200-day — repairing, not repaired |
| No clear structure | neutral | averages entangled — range-type conditions (the sideways case) |
The near-term horizon counts TWO price reads — daily trend structure and 1-hour momentum — because the regime a move happens inside and the push itself are different questions, both acting on a days-to-weeks window; they disagree often, and when they do that disagreement splits the read rather than being averaged. At the position horizon the tape is counted but cannot break a converged read on its own: the counted trend read is capped at mild form there, so a strongly-aligned daily downtrend is named as the exception to the filings rather than splitting a multi-year read. At swing and near-term horizons no cap applies — the tape is the thesis there. Strength otherwise comes from the moving-average alignment gauge, never from the structure label: a strongly-aligned gauge makes the read strong-form, a plain one makes it mild. A structure label with no entry in this table is left unread rather than guessed at.
The context layer — percentiles, position, and profile shapes
Three additions sit alongside the verdicts without changing any of them. None feeds a score, a state, or an alert, and none of them is a composite: there is no summed number, no 0–100 rating and no letter grade anywhere in this layer.
Percentile rank — standing, dated to a snapshot. Ranks are computed once per snapshot cycle from the weekly universe scan, never per page load, and every rendering states the snapshot's own as-of date. A stock's health score is compared against every scanned company with a readable cell, universe-wide and within its sector, and the sector sample size n is always shown — a percentile over eleven peers is a different claim from one over four hundred. A ticker outside the snapshot says so ("no universe rank") rather than borrowing a neighbour's. Only quality factors are ranked: cheap-versus-the-market is not cheap-versus-its-own-history, so the valuation lean deliberately carries no percentile.
Position in band. A verdict word covers a range, so each factor chip also shows where inside its own band the reading sits — a health score at the bottom of a band and one at the top render distinguishably. The position is read from the same values the verdict was computed from (the health score against its band edges, the multiples against their own five-year ranges, short interest against the heavy and slow-to-unwind lines), so it cannot drift from the verdict it annotates.
Situation profiles. A factor pattern says more than any average: strong books at a high multiple is a different situation from middling everywhere, even though a composite would score them alike. So the pattern gets a name, assigned by the fixed rules below in code (not AI), evaluated top-down with the first match winning, one profile per stock. The names describe a situation and never prescribe an action; the whole table is scanned for directional wording at render time and withheld rather than reworded if it ever fails. A stock matching nothing cleanly reads "Mixed profile" honestly.
Deteriorating and priced for it
Rule: health Fragile or Distressed · valuation Cheap-looking · dilution/risk High or Severe
The books read weak, the multiples sit low, and the dilution read is elevated on top of it.
Homework: Verify the cash runway and the most recent financing terms before treating the low multiple as a discount.
Diluting into weakness
Rule: dilution/risk High or Severe · health Fragile or Distressed
The dilution read is elevated while the books read weak.
Homework: Verify the share count trend and any open shelf or ATM capacity in the latest filings.
Cheap for a reason
Rule: health Fragile or Distressed · valuation Cheap-looking
The multiples sit low against this company's own history while the books read weak.
Homework: Verify whether the weakness is one-off or structural — a low multiple on deteriorating books is not the same as a discount.
Weak books at a premium
Rule: health Fragile or Distressed · valuation Expensive
The books read weak while the multiples sit high against this company's own history.
Homework: Verify what the multiple is pricing in, since the filings do not yet show it.
Strong books, crowded short
Rule: health Strong or Solid · short structure heavy
The books read well while short interest sits heavy against the float.
Homework: Verify what the short case rests on — heavy positioning is a fact about other participants, not about the filings.
Quality at a premium
Rule: health Strong or Solid · valuation Expensive
The books read well and the multiples sit high against this company's own history.
Homework: Verify what the premium is paying for — and what has to keep going right for it to hold.
Quality at a fair price
Rule: health Strong or Solid · valuation in the fair range
The books read well and the multiples sit inside this company's own usual range.
Homework: Verify the health read still holds on the newest filing, since a fair range is only fair while the books are.
Cheap-looking on strong books
Rule: health Strong or Solid · valuation Cheap-looking
The books read well while the multiples sit low against this company's own history — the two readings disagree.
Homework: Verify why the discount exists: the market usually knows something the filings do not show yet.
Middling everywhere
Rule: every readable factor neutral — no factor leans either way
No readable factor leans in either direction — there is no sharp shape here.
Homework: Verify nothing is hiding in the unread factors; a flat read is often a coverage story.
Mixed profile
Rule: readable factors match no shape in the table cleanly
The readable factors do not form one of the named shapes.
Homework: Read the factor breakdown directly — the detail is the finding here.
Thin read
Rule: fewer than 3 independent factors readable
Too few independent factors are readable to describe a shape.
Homework: Check back once coverage fills in; a thin read is a coverage fact, not a finding about the company.
Health bands are the engine's own five ratings; the valuation lean is the valuation gauge's own verdict; "dilution/risk elevated" means the risk engine's High or Severe band; "short structure heavy" is the short module's own heavy-against-float line. Nothing in this table recomputes any of them.
Where the data comes from
Company fundamentals and prices come from Financial Modeling Prep. Dilution and insider analysis comes from SEC EDGAR — the primary source, read filing by filing. (During one investigation we found major free aggregators displaying share counts inflated ~25× because they'd missed a reverse split. That's why we go to the filings.)
When we don't know, we say so
This is where most tools quietly fail, so we're explicit:
- •A metric that isn't computable is marked N/M with the reason — never silently substituted with a look-alike.
- •"Not reported by provider" and "unavailable" mean different things here, and we use the right one.
- •Data artifacts are gated, not scored: a literal-zero interest coverage on a company with billions in operating profit is a feed artifact, not distress; a 70% share-count drop on a new listing is restructuring, not buybacks. Excluded, with the reason shown.
- •Newly listed companies get a visible low-coverage qualifier — "based on 5 of 11 usable signals" — and time-window features (seasonal history, 5-year ranges, insider tallies) gate themselves when the history doesn't exist rather than implying one.
- •Financials older than ~6 months trigger a staleness warning. Every analysis states its statement basis — "TTM through [quarter-end], filed [date]" — and when a company reports earnings, the analysis recomputes on the event rather than waiting out a cache timer.
- •Percentages are never shown over immaterial bases: a 4,000% position change on a rounding-error holding renders as the share counts instead, because the percentage would be noise wearing precision.
The engine argues with itself
Every render runs internal consistency checks: signal counts must reconcile with the audit table, operating cash flow must agree in sign everywhere it appears, free cash flow must equal its own components, the P/E must equal price over the displayed EPS. A failed check degrades the affected figure to "not meaningful" with the failure stated — we would rather show a labeled gap than a number we can't stand behind. Implausible provider values are bounded out before scoring, so a corrupt figure never becomes a verdict input.
Where AI actually fits
After the deterministic engines produce every number, an AI model writes the narrative explanation — under constraints: it receives only pre-computed results, its output is appended after code-written lead sentences, and a post-generation filter strips claims the data doesn't support. If the AI provider went down entirely, every score on FinPile would be identical; you'd just read tables instead of prose.
How we test
We maintain a pinned regression suite — real tickers spanning mega-caps, foreign listings, serial-diluter micro-caps, reverse-split cases, and sparse-data new listings — with frozen expected outputs, plus synthetic fixtures that run the same gauge code as production. Every engine change is verified against the full suite before it ships. The methodology is versioned; when a rule changes, the change and its reason are recorded, and this page's version number moves.
What FinPile deliberately does not do
- •No price predictions or price targets. Nobody reliably predicts short-term prices; tools claiming to are selling confidence, not analysis.
- •No buy/sell/hold recommendations. Nothing here is financial advice.
- •No direction labels on news. Type and materiality only — the market grades the story.
- •No fair-value points. Bands, spreads, and refusals — never a single number pretending the future is priced.
- •No hidden AI opinions. If a number appears on FinPile, there is a rule behind it that this page describes.