Methodology

How we test whether this works.

PeerStock scores how closely a company resembles another company at another moment in time. That is only useful if the resemblance means something, so we measure it against random selection — and publish where it stops working.

What the score measures

Every company is described by 14 metrics, 13 of which are scored — eight from its financial statements (revenue growth and acceleration, gross and operating and net margin, margin trend, free-cash-flow margin, return on equity) and six from its price history (12-month return, 6-month momentum change, 200-day trend slope, distance from the 52-week high, maximum drawdown, annualised volatility).

The financial metrics are deliberately seasonality-resistant. Growth compares a quarter with the same quarter a year earlier, never with the quarter before it: measured across 114,934 company-quarters here, a tenth of the median company’s quarter-on-quarter revenue swing is nothing but its own repeating seasonal pattern, and for 17% of companies it is more than half. Margins and cash flow are trailing twelve months, which also stops a retailer’s Christmas quarter being compared against another company’s spring. Acceleration is the change in the year-over-year rate between consecutive reports, so it stays responsive without inheriting the seasonality.

Each metric is converted to a percentile rank against every other company at that same moment, never to a raw figure. A 40% gross margin means something different in 2022 than today; ranking against contemporaries removes that problem. Similarity is then the average closeness of those ranks across the 13 scored metrics.

The fourteenth, maximum drawdown, is shown but not scored. Comparing only companies whose volatility already matches, how closely two of them agree on drawdown says nothing about how near their next six months land — volatility and distance from the 52-week high already carry it. Leaving it out of the score moved the closeness measure by 0.5–0.7 points in the right direction, on three of three seeds in the top band. It stays in the evidence because a reader comparing two companies still wants to see it.

That comparison is deliberately sector-agnostic: a company is ranked against the whole market, not against its own industry. This is why matches are often not the obvious peers — a company can resemble another in growth, margin trajectory and price behaviour while operating in an entirely different business. Finding those non-obvious analogues is the point; screening by sector is something you can do yourself, and does not need us.

Metrics neither company has count as a miss rather than being quietly dropped, so a company matching well on three metrics cannot outscore one matching well on fourteen.

No look-ahead bias

This is the constraint everything else is built around. If you search Apple as it looked on 24 May 2023, every figure used must have been public on 24 May 2023.

The trap is that a fiscal period ends months before its results are filed. A quarter ending in March may not be published until June — so filtering on the period end would let the engine read results that did not yet exist. PeerStock stores the actual filing date recorded on each SEC fact and filters on that instead. Not an estimate of the reporting delay: the date the document was filed.

An automated test suite walks the full provenance chain behind every metric on every change, and fails the build if any fact carries a filing date later than the search date. The rule is enforced mechanically rather than by remembering to be careful.

How the test is constructed

Take a company at a historical date — the reference. Run the search as it would have run at a later date, and record what the matches did over the following six months. Separately, record what the reference itself did over the six months after its date. The question is whether the matches behaved as the reference did.

Alongside each match’s own return we therefore record a distance: for each match, the gap between its own six-month result and the reference’s own six-month result, in percentage points. A match that gained 30% where the reference gained 34% misses by 4 points. This is deliberately not a measure of whether matches went up — a tool that simply picked stocks that rose would score badly here whenever the reference fell, and that is the correct outcome for a tool whose claim is resemblance.

The control is random stocks drawn from the same scored universe, over identical start and end dates. That matters more than it sounds: comparing matches against a benchmark from a different period would credit or blame the engine for whatever the market did in between. Same universe, same window, same conditions — the only difference is whether the similarity score chose them.

Results are also grouped by what the reference went on to do — gained 25% or more, stayed within ±5%, or fell 25% or more — and each group is compared only against its own control. A group of references that rose is drawn from periods when the market may have risen too, and a shared control would hand the engine credit for that. References landing between those bands are discarded rather than pushed into a neighbouring group, so “stable” means stable.

Results

Across four runs of ~947 historical reference periods each (3,789 in total) and ~4.0 million scored candidates per run: when the reference company went on to gain 25% or more, the margin over random picks scaled with the match score. Random picks over those same dates returned −0.3%, so the return columns below are a comparison against chance rather than a return anyone earned.

Four runs rather than one, because the top band is thin: it holds ~840 candidate returns, and a single run’s figure for it moved between +0.2 and +9.5 points across these seeds with nothing changing but which dates were sampled. Every number below is the mean of the four. The 85–89% band, with fifteen times the sample, is the steadier evidence and it says the same thing.

A second measure follows below, and on it the effect is considerably larger: a 90%+ match finished 22.7 points nearer the reference’s own outcome than a random pick did, against a 4.4 point edge on raw return. Both are reported because they are the same tests read two ways — and the smaller, plainer one is the one most readers can check for themselves.

Why 25%? We specifically tested historical periods where the reference company subsequently gained 25% or more, because these are the situations where users are most likely to want historical precedents. Periods were selected by what the reference company went on to do — never by what the matches did — and each is compared against a control drawn from those same periods, so a rising market cannot be mistaken for the engine working.
Match scoreCandidatesMedian 6-month returnvs. randomrandom: −0.3%
90%+826+4.0%+4.4 pts
85–89%11,435+3.1%+3.4 pts
80–84%47,515+1.6%+1.9 pts
75–79%106,222+0.3%+0.6 pts
below 75%3,802,512−0.2%+0.1 pts

The same tests, measured against the reference

The table above asks whether the matches went up. This one asks the question the engine actually answers: how close did each match’s six-month result land to the reference’s own six-month result? Lower is better, so the second column reports it as an improvement on the control.

CompanySnapshotIts own next 6 months
ReferenceAAPL28 Jun 2019+46.4%
Match90% similarSPXC30 Jun 2025+22.7%
Misshow far apart the two outcomes landed≈ 24 points

The table below pools ~826 comparisons like that one per run — every 90%+ match from each run’s ~950 reference periods — and reports the median. Half miss by less than 54.2 points, half by more. The pair above is a good one, and a single pair proves nothing either way: what the table shows is that across all of them, a random pick measured the same way typically misses by 76.9.

Match scoreCandidatesMiss vs. referenceCloser than randomrandom missed by 70.0%
90%+82654.2%+22.7 pts
85–89%11,43555.5%+21.5 pts
80–84%47,51559.3%+17.6 pts
75–79%106,22263.0%+13.9 pts
below 75%3,802,51278.0%−1.0 pts

The unbroken ordering is the finding, more than any single figure. One bucket doing well can happen by chance; every band improving step by step, in the same order as the score, on both measures at once, is considerably harder to produce by accident. It indicates the score measures degree of resemblance, not merely its presence.

That ordering needs a great many reference periods to be trustworthy, which is the reason for ~950 of them per run, and for repeating the whole run on four seeds. Every candidate inside a single search shares that search’s reference, so the meaningful sample size is the number of reference periods, not the 4.0 million candidates. Tested on roughly a hundred, the ordering moves around between runs; at this size it holds — and the top band, thin even here, is why the four runs are averaged rather than quoted singly.

What these results do not show

This is not a prediction of returns. It measures whether companies that look alike went on to behave alike. A high score is a reason to look closely at a company, not a reason to buy it.

Data and coverage

See it on a company you know

The fastest way to judge any of this is to search a company whose history you already understand, and read the evidence behind the matches.

Try it now

Research tool · not investment advice · PeerStock does not recommend securities.