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.
That includes the one word at the top of every stock page. FinPile's Buy / Hold / Sell rating is a fixed function of a five-point checklist and the measured odds for the stock's class — the definition is below, and every call is scored on the Ledger.
The rating: Buy, Hold, Sell
rule version rating-1.2 · paid members · every call on the public record
FinPile publishes a Buy / Hold / Sell rating. It is not an opinion and no person or model chooses it: the rating is a fixed function of two things that are already on the page, and this section is the whole function. Anyone can recompute it from the stock page.
1. The checklist
Five yes/no standards against the stored read — the same row the gauges, the Guardian and the screener grid read. Each is pass, fail or unreadable.
| Standard | Default |
|---|---|
| Financially sound | financial-health rating at least Solid (Distressed · Fragile · Mixed · Solid · Strong) |
| Not diluting you | dilution-risk band at most Moderate (Low · Moderate · High · Severe) |
| Reasonably priced | valuation against the company's own history not Expensive |
| Business not shrinking | business trajectory not declining |
| Halal (optional) | off by default; when on, the AAOIFI summary verdict must be halal |
The checklist passes when every readable standard passes and all four core standards are readable; it fails when one or more fail; otherwise it can't say. Members can change the thresholds for their own view; the public record always uses the defaults above.
Pre-revenue companies. When the stored valuation reads Pre-revenue (no revenue on record and fewer than two usable multiples), the standards built for operating companies don't apply: financially sound, reasonably priced and business not shrinking are all unreadable. The checklist then can't say, unless the dilution standard, which still counts, fails. The card adds a cash-runway line instead: cash and short-term investments ÷ trailing-12-month operating cash burn, in months, dated. It is a fact, not a vote. (Added in rule 1.2; before it, these companies failed the health and trajectory standards for lacking a business those standards can measure.)
2. The odds
The setup-outcome study groups every past stock by its class — profile shape × Position-lens state — and counts how often the class was higher 60 sessions later, against the all-stocks control for the same window. A class is read only when it has at least 300 past episodes and its edge over the control held across the two eras (no sign flip, under 5 points of drift). A read class leans higher when its edge is +3 points or more, leans lower at −3 or less, and otherwise has no lean.
3. The rating
| Buy | the checklist passes AND the class does not lean lower |
| Sell | the checklist fails AND (the class leans lower OR two or more standards fail) |
| Hold | everything else — a pass whose class leans lower, a single failure with no lower lean, and every “can't say” |
The checklist decides; the odds can only pull a rating back. A stock that meets every standard is a Buy unless the measured history of its class argues against it; a stock that fails one standard is a Hold unless that history agrees with the failure or a second standard fails. (Rule 1.0 required a readable higher lean for Buy, which parked most quality stocks at Hold whenever their class had too few episodes or an unstable edge — a fact about the study's reach, not about the company; 1.1 corrected it on the day of release.)
A caution, not a vote. When the stock's short interest is 10% or more of shares outstanding, the rating carries a line from the squeeze study: how often past stocks with the same short structure rose 40%+ and fell 20%+ over 60 sessions, beside the all-stocks rates. The study found crowded shorts predict wide outcomes, not direction, so this line never moves the word — it says how rough the ride has tended to be.
Every rating is printed with its odds line — “setups that read like this were higher 60 sessions later X% of the time (all stocks Y%, n Z)” — the as-of date of the stored read, and the condition that would change it. The odds are history, not a promise: a Buy can fall and a Sell can rise, and the record below says how often each did.
4. The record
The first rating for a stock and every change of rating, under the default checklist, is written to an append-only record with the price at the time, then graded at 60 and 120 sessions: Buy is a hit when the price was higher, Sell when lower; Hold is listed and never scored. The hit rate is shown beside the base rate — how often any stock in the study was higher (or lower) over the same window — because a 55% hit rate in a market where 60% of stocks rose is not an edge. Nothing is removed from the record. It lives on the Ledger.
What the rating is not
It is not a price target, a fair value or a forecast of how far or how fast. It does not know your situation, your horizon or what else you hold. It is one word that collapses the page by a rule you can read, so you can decide whether to read further — and it is scored in public so you can decide whether to trust it.
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 judged against their sector medians, with the stock's own 5-year range shown beside each (rule v2, Oct 2026: a multiple reads elevated when it exceeds 1.2× its sector median or a fixed sanity ceiling — P/E 40, P/S 10, EV/EBITDA 25, P/B 6 — and cheap when it sits under 0.8× the median or a sanity floor; without a sector median the fixed absolute thresholds apply. Under the earlier rule a multiple had to clear both the absolute threshold and the sector multiple, which left most stocks in the Fair range by construction; the next weekly scan re-scores every stock under v2, and the Ledger lists each valuation word that moves). 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.
The per-stock AI agent
Each stock page carries an agent that answers questions from that ticker's stored, pre-computed piles and reads its SEC filings on request. It receives only results the deterministic engines already produced, and cites the source and as-of date for each section it uses. When a data block is missing, it says so instead of filling the gap; it never produces a score or number itself.
Gap behavior
Gap-behavior statistics show how this stock's past gaps resolved, by direction and by earnings context. Every rate is shown as "X of N" from the stock's own price history, so the sample size is always in view.
Support and resistance levels
A price ladder of the monthly and weekly levels the market has actually respected, with break, hold and reclaim detection. Levels come from price and volume history, and each one shows how often it has held.
Ownership
Insider transactions are read from SEC Form 4 filings and classified by their filing codes: open-market purchases are distinguished from option exercises, scheduled-plan sales and awards. Institutional holdings come from 13F filings, and congressional transactions from public disclosures, each listed with its date. Transactions pre-dating a company's listing are flagged rather than counted.
Financial health
Eleven signals (twelve for financial institutions) covering profitability, cash-flow quality, returns, growth, liquidity, leverage, interest coverage, share-count trend and equity status. 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. Inputs are the company's audited quarterly and annual statements.
Valuation
Six multiples with fixed bands, judged against sector medians and the stock's own 5-year range. Loss-makers are judged on revenue-based multiples and labeled as such; fewer than two usable multiples reads "insufficient data," not a guess.
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 by a cumulative ≥ 4pp (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 ≥ 3pp 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 3pp) · operating margin expanding (≥ 50 bps) | Growth is about where it was, and the margin is wider than a year ago. |
| 8. Steady | growth within ±4pp · leading margin within ±75 bps | 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 ≥3pp 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.6
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.
- Still reading is not unread — a factor whose read has not come back yet is left out of the count and out of the coverage judgment, exactly as if there were nothing to read, and is named as "still reading". It never holds a read one step short; the state is computed over the factors that have answered and re-runs when the late one lands. A factor that answered and could not be read is unread, and that does hold a read short.
- 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.
Short structure — the change, not just the level
FINRA publishes short interest twice a month. The level (how much of the float is short) says how crowded the position is; the change across the last two settlements says whether it is being added to or unwound. Both are read, and they have strictly separate jobs: the level owns the direction of the lean, the change owns only how strongly it is stated. A change can never flip an unfavorable read favorable, or the reverse.
Change tiers, measured over one settlement cycle and share-basis verified: flat under 10% · modest 10–25% · steady 25–40% · rapid above 40%. If the share basis moved across the seam — a split, an exchange, a restatement — the two reports are not comparable and the change is reported unread; the lean is then the level's alone. Nothing is estimated across a basis break.
The change against price, over the same window
Price is measured on the same two settlement dates as the short change — the close on the newer settlement against the close on the older one, never "today versus then". Up is more than +5%, down is less than −5%, anything between is flat. The four readings are structure descriptions, not outcomes; a flat-price window gets no reading at all.
- •Building + price up → “shorts building into strength”
- •Building + price down → “shorts pressing a working thesis”
- •Covering + price up → “shorts covering into strength”
- •Covering + price down → “shorts stepping back as price falls”
The borrow extension
The FINRA print is already about nine business days old when it publishes, so the daily borrow book extends it: the fee today against the fee as it stood on the newer settlement date. More than 25% higher reads “borrow cost has risen since — the pressure looks ongoing”; more than 25% lower reads “has eased since”; anything between reads “steady since”. This covers Interactive Brokers' lending book only, which is stated every time, and when the book has no row that old the sentence is omitted rather than guessed.
Level × change → the lean
| Level (sets direction) | Rapid build (>40%) | Steady build (25–40%) | Modest build (10–25%) | Flat (<10%) | Modest cover (10–25%) | Steady cover (25–40%) | Rapid cover (>40%) |
|---|---|---|---|---|---|---|---|
| Light (<5% of float)base: neutral · normal | unfavorable · mildmoved by the change | neutral · normal | neutral · normal | neutral · normal | neutral · normal | neutral · normal | neutral · normal |
| Elevated (5–15%)base: neutral · normal | unfavorable · mildmoved by the change | neutral · normal | neutral · normal | neutral · normal | neutral · normal | neutral · normal | neutral · normal |
| Heavy (≥15%), quick to unwindbase: unfavorable · mild | unfavorable · strongmoved by the change | unfavorable · strongmoved by the change | unfavorable · mild | unfavorable · mild | unfavorable · mild | neutral · normalmoved by the change | neutral · normalmoved by the change |
| Heavy (≥15%), slow to unwindbase: unfavorable · strong | unfavorable · strong | unfavorable · strong | unfavorable · strong | unfavorable · strong | unfavorable · strong | unfavorable · mildmoved by the change | unfavorable · mildmoved by the change |
Generated from the engine's own table at render time (spec short-change-1.0) — bold cells are the ones the change moved. No cell in this table produces a favorable lean: covering makes a crowded short read less strongly, never well.
A rapid build or cover on a watched ticker also raises one Guardian notice per settlement — a structural event, carrying the reading, the share counts, both settlement dates and the borrow line, and never an outcome. The event class arms only for settlements published after it shipped: already-public prints are recorded silently rather than notified after the fact.
The short-interest base-rate study
When a stock's short interest reaches 10% of its shares outstanding, the page shows what happened to past stocks with the same short structure — a count over stored episodes, never a statement about the stock you are reading. These are the rules behind it.
It starts in September 2021. The stored series begins with entries in Sep 2021, so the early-2021 short-interest episodes are not in the study and no rate on the site describes them. Every line states the start date beside its sample size.
Short interest is measured against shares outstanding, not float. No feed carries historical float, so a float-based percent could not be reconstructed for past episodes without inventing it. Percent of outstanding is smaller than the float percent you may see quoted elsewhere; the card shows its own arithmetic — shares short ÷ last filed share count, with that filing's date.
Entry is the day after FINRA published the reading. Short interest settles twice a month and is published about nine business days later. Measuring from the settlement session would use a number nobody could have known, so every episode is measured from the first session after publication.
There is a null model. Every rate is shown beside lightly shorted stocks — under 5% of shares outstanding, same universe, same windows. A rate without that comparison says nothing, so a line missing it is dropped rather than shown alone. Delisted listings are included on purpose: dropping the companies that died would flatter every number.
Days to cover runs the other way from the folk theory. In the stored episodes, stocks with under two days to cover rose 40%+ more often than stocks with ten or more — the opposite of the idea that a crowded, slow-to-exit short is the primed one. And the most crowded, slowest cell — short interest above 30% of outstanding with ten or more days to cover — is not where the rises concentrate; it carries the study's higher rate of 20% falls. We publish that because it contradicts the story the pattern is usually told with.
A rate that does not survive being cut in two is not shown as a rate. Each cell is re-counted over the first and second half of its episode sequence. A cell that moves 10 points or more between halves is tagged "unstable across periods", and a cell with fewer than 30 episodes reads "too few to read" with no number at all. The study feeds no score, no verdict, no ranking, and no watchlist — it is context, and it never describes what any stock is about to do.
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 ratings by opinion. FinPile does publish Buy / Hold / Sell — but by the rule above, from filed facts and measured frequencies, with the definition public and every call scored. No analyst, no model and no one here can move a rating by hand.
- •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.