Discovery Engine

A private research engine that runs locally: it screens US stocks on point-in-time fundamentals and price behaviour, then simulates what its rules would have done. This page reports what data it holds and how the tests came out — nothing here is a recommendation.

Snapshot generated 2026-09-05 14:12 UTC

What data we have

DatasetRowsTickersCovers
Fundamentals (SEC XBRL)7,644 companies · 48 metrics18,513,4807,2952009-04-152026-07-27
Daily prices — deep history19,470,6436,3921962-01-022026-08-28
Daily prices — recent2,916,4306,4402024-07-262026-09-04
Prices with raw + adjusted + dividends1,439,9653941980-03-172026-09-04
Stock splits25,67417,5152005-01-032026-12-17
Cash dividends56,45826,3462026-04-152030-12-13
Forward analyst estimates98,7853,8152026-08-102027-07-20

How far back we can test

Prices reach back decades, but company filings only became machine-readable from 2009. Rules that read financials can only be tested where enough companies had filed — which is what the right-hand column shows.

YearTickers pricedWith financials
2000296none
20051,936none
20102,298463
20132,6473,477
20163,0824,058
20203,8905,084
20245,3186,461

Latest screen · 2026-07-28

9,297
Universe
2,407
Survived
6,890
Eliminated
illiquid: 2,329ps_extreme: 233

The tests

Each block is one experiment. The line under every heading is its result, so you can read the outcomes without opening anything; expand one for the chart, the method and the caveats. These are tests, not a track record.

Two ways to avoid overpaying2021–2026Same money, same schedule, same ranking — differing in one decision: how each judges a stock too expensive. Both lost (+29.6% and +40.7%) while SPY made +77.0%.

Both models start on the same day with the same money, buy and sell on the same monthly schedule, hold the same number of companies, and rank them the same way. They differ in exactly one decision — how they decide a stock is too expensive — so the gap between the two lines is what that one decision was worth.

Cumulative return. Both models track the market closely, so the difference is easier to read in the other view.

Model A · relative

Judges 'expensive' against whatever is on offer that month and throws out the dearest slice of it. Always finds something to buy, because the bar moves with the era it is in.

Return
+29.6%
Per year
+5.3%
Worst fall
-40.8%
Return per unit of risk
0.18
Round trips
671
Went up
53%
Model B · absolute

Judges 'expensive' against fixed bounds that do not move with the crowd, and additionally wants a real margin, no reverse split and little dilution. Holds fewer names — or cash — when nothing clears the bar. The exact bounds in force are listed beside it.

Return
+40.7%
Per year
+7.1%
Worst fall
-39.3%
Return per unit of risk
0.25
Round trips
668
Went up
54%

Rebased to 0% on 2021-07-29. Every trade is decided on one day and filled at the next session's opening price, with 25 basis points of cost charged each way. The chart is sampled weekly; the figures above come from the daily series. Both models were tested only on companies that still exist today, which flatters them — see Known gaps.

Dividends are only partly counted. The price history behind every line carries a median of about a third of the dividends actually paid, measured against a known-good source. It applies to the models and the index alike, so the comparison is fair, but each line understates its true total return — SPY's real figure over this window is nearer +79.5% than the +77.0% drawn here. Because value shares yield more than the index, the shortfall is larger for the two models than for the market, so this works against them, not for them.

Model A · relativenow +29.6%

Current rules: at least $50M traded a day · pe_ratio > 0, ps_ratio > 0

Earlier versions of these rules

Kept so the change is attributable, not just announced. The settings column is what explains the difference.

RunReturnWorst fallSettings that differed
2026-08-01 v1+29.6%-40.8%≥ $50M/day traded · pe_ratio > 0, ps_ratio > 0
2026-08-01 v1+29.6%-40.8%≥ $50M/day traded · pe_ratio > 0, ps_ratio > 0
2026-08-01 v1+29.6%-40.8%pe_ratio > 0, ps_ratio > 0· liquidity floor not recorded for this run
2026-08-01 v1-23.5%-49.2%pe_ratio > 0, ps_ratio > 0· liquidity floor not recorded for this run
2026-07-31 v1-21.3%-49.2%pe_ratio > 0, ps_ratio > 0· liquidity floor not recorded for this run

A few winners and a few losers

8 positions picked at random — an equal number of gains and losses, not the biggest of either, and drawn from both sold and still-held lots. Prices are adjusted for splits and dividends.

StockBoughtAtSoldAtHeldReturn
MU2022-11-29$55.712022-12-29$49.4030d-11.5%
HUN2023-06-01$23.782023-07-03$27.0432d+13.4%
M2023-08-02$16.102023-08-31$12.3429d-23.5%
LW2024-10-02$63.002024-10-31$77.0729d+22.0%
FIVE2025-03-06$83.872025-04-04$53.6329d-36.2%
RHI2026-01-06$26.572026-02-05$32.9430d+23.7%
FOUR2026-01-06$63.842026-02-05$58.4530d-8.7%
LRN2026-03-09$85.462026-07-28$95.88141d+11.9%

Measured against SPY. Trading costs are charged on every one of these.

Model B · absolutenow +40.7%

Current rules: at least $50M traded a day · dilution_1y <= 0.1, pe_ratio <= 40, profit_margin >= 0.05, ps_ratio <= 10, reverse_splits <= 0

Earlier versions of these rules

Kept so the change is attributable, not just announced. The settings column is what explains the difference.

RunReturnWorst fallSettings that differed
2026-08-01 v2+40.7%-39.3%≥ $50M/day traded · dilution_1y <= 0.1, pe_ratio <= 40, profit_margin >= 0.05, ps_ratio <= 10, reverse_splits <= 0
2026-08-01 v2+40.7%-39.3%≥ $50M/day traded · dilution_1y <= 0.1, pe_ratio <= 40, profit_margin >= 0.05, ps_ratio <= 10, reverse_splits <= 0
2026-08-01 v2+40.7%-39.3%dilution_1y <= 0.1, pe_ratio <= 40, profit_margin >= 0.05, ps_ratio <= 10, reverse_splits <= 0· liquidity floor not recorded for this run
2026-08-01 v1-11.8%-42.7%dilution_1y <= 0.1, pe_ratio <= 20, profit_margin >= 0.05, ps_ratio <= 3, reverse_splits <= 0· liquidity floor not recorded for this run
2026-07-31 v1-11.6%-42.6%dilution_1y <= 0.1, pe_ratio <= 20, profit_margin >= 0.05, ps_ratio <= 3, reverse_splits <= 0· liquidity floor not recorded for this run

A few winners and a few losers

8 positions picked at random — an equal number of gains and losses, not the biggest of either, and drawn from both sold and still-held lots. Prices are adjusted for splits and dividends.

StockBoughtAtSoldAtHeldReturn
CHD2021-08-30$81.512021-09-29$81.9430d+0.3%
BBWI2022-12-29$41.352023-03-02$39.4563d-4.8%
SWN2023-01-31$5.402023-03-02$5.3230d-1.7%
ALB2023-10-02$169.192023-10-31$126.6729d-25.3%
GIS2024-06-03$68.692024-07-03$63.0130d-8.5%
SJM2024-10-31$113.992024-12-02$118.0032d+3.3%
CRM2025-12-04$243.692026-01-06$255.2033d+4.5%
OWL2026-07-09$9.272026-07-28$9.8119d+5.6%

Measured against SPY. Trading costs are charged on every one of these.

Buy every 10% drop, sell at a doublecontrolEvent-driven, no ranking, no valuation test — shares no machinery with the models above. +10.1% on the money put in, against +45.9% for the same cash into SPY. Two opposite rules, the same verdict.

A control, built to test the engine rather than to make money: buy a fixed amount of any liquid stock that falls 10% in a day, buy again every time it falls again, and sell a lot only once it has doubled. Nothing is ever cut.

The money arrives as trades happen, so this is a return on everything paid in, not the growth of one opening stake — a different measure from the first chart, which is why it is not on it. The fair comparison is the same money going into the index on the very same days, and that is the dashed line.

The rule+10.1%Same money into SPY+45.9%
Put in
$49.0M
49,042 buys of $1,000
Ended worth
$54.0M
+10.1% on the money in
Same money in SPY
+45.9%
the like-for-like comparison

Why the win rate is a trap here. A position can only be closed by doubling, so the 16,828 sales were almost all winners by construction — the figure measures the rule, not the skill. Everything that went wrong is still being held: 32,214 open positions that cost $32.2M are worth $16.8M (-48.0%). Selling winners and holding losers is the whole result.

A few winners and a few losers

8 positions picked at random — an equal number of gains and losses, not the biggest of either. Both sold and still-held are drawn from deliberately. A lot can only be SOLD here by doubling, so every sold row is a gain and all the losses are still held. Sampling closed trades alone would therefore have shown one side only. Prices are adjusted for splits and dividends, so they are the comparable series rather than the number printed on the ticker that day.

StockBoughtAtSoldAt / nowHeldReturn
XOMA2022-06-13$17.302025-09-03$34.531178d+98.6%
NXDR2022-11-10$2.19still held$2.301356d+4.8%unrl.
EJH2024-05-21$8,000.002024-07-08$18,750.0048d+133.2%
FFAI2024-06-21$2,480.40still held$4.63767d-99.8%unrl.
CMTG2025-04-11$2.46still held$2.12473d-14.0%unrl.
NNNN2025-11-03$16.822025-12-04$37.4031d+121.2%
AMKR2026-06-08$68.40still held$45.6950d-33.4%unrl.
PMI2026-06-08$0.26still held$0.0950d-66.0%unrl.

Earlier versions of these rules

Kept so the change is attributable, not just announced. The settings column is what explains the difference.

RunReturnWorst fallSettings that differed
2026-08-01 v1+10.1%-35.5%≥ $50M/day traded
2026-08-01 v1+9.8%-35.5%liquidity floor not recorded for this run
2026-07-31 v1+9.8%-35.5%liquidity floor not recorded for this run
2026-07-31 v1+9.8%-35.5%liquidity floor not recorded for this run
2026-07-31 v1+9.8%-35.6%liquidity floor not recorded for this run
Buy every 10% jump, cut at -10%mirror controlThe same machinery with every sign flipped: buys strength, cuts losers, rides winners. +8.3% on the money put in, against +44.6% for the same cash into SPY. Two opposite rules, the same verdict.

The exact opposite rule, run through the same machinery: buy any liquid stock that RISES 10% in a day, never take a profit, and sell only once a lot sits 10% below what it cost. It cuts its losers and rides its winners — the textbook discipline, and the reverse of what the model above does.

The money arrives as trades happen, so this is a return on everything paid in, not the growth of one opening stake — a different measure from the first chart, which is why it is not on it. The fair comparison is the same money going into the index on the very same days, and that is the dashed line.

The rule+8.3%Same money into SPY+44.6%
Put in
$66.5M
66,479 buys of $1,000
Ended worth
$72.0M
+8.3% on the money in
Same money in SPY
+44.6%
the like-for-like comparison

Why the win rate is a trap here. A position can only be closed by falling 10%, so the 59,810 sales were losers by construction — the figure measures the rule, not the skill. Everything that went right is still being held: 6,669 open positions that cost $6.7M are worth $18.4M (175.9%). Cutting losers and riding winners is the whole result — the exact reverse of the model above, and it lands in almost the same place.

One number here is assumed, not measured. When a stop fires, this model books the sale at exactly −10%. In reality a stock often closes far below that, and no order could have filled at a price it never traded at. Running the identical rules while selling at the price that actually traded turns +8.3% into +4.5% — so roughly half of what this model appears to earn comes from that one assumption.

A few winners and a few losers

8 positions picked at random — an equal number of gains and losses, not the biggest of either. Both sold and still-held are drawn from deliberately. A lot can only be SOLD here by hitting its stop, so every sold row is a loss and all the gains are still held. Sampling closed trades alone would therefore have shown one side only. Prices are adjusted for splits and dividends, so they are the comparable series rather than the number printed on the ticker that day.

StockBoughtAtSoldAt / nowHeldReturn
WRAP2021-08-06$8.142021-08-19$7.3313d-10.4%
NU2022-06-22$3.77still held$14.681497d+288.4%unrl.
SBEV2023-10-06$111.202023-10-25$100.0819d-10.4%
HMR2025-03-19$3.442025-03-24$3.105d-10.4%
CMI2025-04-10$288.04still held$641.60474d+122.2%unrl.
SVRA2025-10-21$4.09still held$5.33280d+30.0%unrl.
KZIA2026-04-23$11.46still held$12.6996d+10.5%unrl.
VECO2026-06-10$67.452026-07-02$60.7122d-10.4%

Earlier versions of these rules

Kept so the change is attributable, not just announced. The settings column is what explains the difference.

RunReturnWorst fallSettings that differed
2026-08-01 v1+8.3%-11.8%≥ $50M/day traded
2026-08-01 v1+8.3%-11.8%liquidity floor not recorded for this run
2026-07-31 v1+8.3%-11.8%liquidity floor not recorded for this run
Every run, side by side12 sets of rulesOne row per set of rules, showing its most recent run and how many times it has been simulated. 1 of 12 beat the index they were measured against.

Each row is the same rules run over a past period, buying and selling on the dates they would have fired. Trading costs are charged. Returns include only part of the dividends paid — see the note below the chart. One row per set of rules, showing its most recent run; “Runs” counts how many times that set was simulated, because a result picked from many attempts is weaker evidence than one from a single attempt.

StrategyPeriodReturnvs indexWorst fallTradesRuns
pop_stop_at_close2020-07-292026-07-28+4.5%+44.6%SPY-13.7%59,8105
pop_stop_or_hold2020-07-292026-07-28+8.3%+44.6%SPY-11.8%59,8104
dip_double_or_holdon cash paid in2020-07-292026-07-28+10.1%+45.9%SPY-35.4%16,82812
deep_neglect_price_only2013-01-022026-07-28+345.5%+283.3%IWM-46.2%2809
deep_value_neglect2013-01-022026-07-28+216.4%+283.3%IWM-63.1%2809
value_momentum2021-07-292026-07-28+50.9%+77.0%SPY-24.2%3802
quality_neglect2021-07-292026-07-28+27.2%+77.0%SPY-46.4%6202
absolute_cheap_value_ranked2021-07-292026-07-28+54.8%+77.0%SPY-31.3%2462
absolute_cheap_fixed2021-07-292026-07-28+33.3%+77.0%SPY-33.2%4742
relative_cheapest_quartile2021-07-292026-07-28+34.0%+77.0%SPY-40.9%3992
absolute_value_monthly2021-07-292026-07-28+40.7%+77.0%SPY-39.3%66815
relative_value_monthly2021-07-292026-07-28+29.6%+77.0%SPY-40.8%67115
Paying for the searchoverfitting checkTry enough rules and the best one looks skilled by luck alone. With 12 tested, that luck is worth +0.46. Nothing clears the 0.95 bar — the best reaches 0.57.

Try enough sets of rules against the same history and the best one looks skilled purely by luck. That bar is measurable: with 12 sets tested, the best of that many worthless strategies would still have posted a return-to-risk score of +0.46. Anything at or below that line is explained by the search alone. The last column is the probability the result is real after paying that cost — above 0.95 is the usual bar.

StrategyReturn per unit of riskProbability it is real
absolute_cheap_fixed+0.350.397
absolute_cheap_value_ranked+0.480.512
absolute_value_monthly+0.380.430
deep_neglect_price_only+0.510.570
deep_value_neglect+0.420.439
dip_double_or_hold-0.210.067
pop_stop_at_close-0.350.035
pop_stop_or_hold+0.120.225
quality_neglect+0.310.368
relative_cheapest_quartile+0.350.399
relative_value_monthly+0.320.378
value_momentum+0.530.555

The count of tests is a floor, not a total — it counts only the runs that were recorded, never the thresholds nudged and abandoned along the way. So the real bar is higher than the one shown.

Known gaps

Listed because a result is only worth as much as the honesty about what is missing from it.

Survivorship — the companies that failedthe main limitation

Every simulation here was run on companies that still exist. The price archive carries almost nothing that went to zero, so the worst outcomes are missing and every result is flattered. Being fixed slowly: 396 delisted companies' price histories collected so far, capped at ~450 a month by the free data tier.

Linking dead companies to their financialsmostly solved

When a company delists, public sources drop the link between its ticker and its regulatory filings. Archived copies of the SEC's own ticker file recovered 7,264 of those links; 349 companies remain unmatched, mostly ones that delisted before 2017 when the archives begin.

Dividends are only partly countedmeasured, not fixed

The price history behind every result carries a median of about a third of the dividends actually paid. It applies to the strategies and the index alike, so comparisons stay fair, but each figure understates its true total return — and by more for high-yield value shares than for the market.

Costs are simplifiedknown

Every trade is charged a flat 25 basis points each way, regardless of how small or illiquid the company is, and there is no model of market impact or tax. Real trading would cost more, especially in the smallest names.

Sector codesdone

Needed because bank profit margins are not measurable from XBRL, and the P/E rule reads margin.

Measures it computes (62)referenceEvery quantity the screen can read about a company, with the version of the definition that produced it.
accrualsv1 · ratio

(TTM net income - TTM operating CF) / assets; high = suspicious

assetsv1 · USD

Total assets, latest reported

assets_currentv1 · USD

Current assets

buyback_yieldv1 · ratio

TTM buybacks / market cap

cashv1 · USD

Cash and equivalents, latest reported

cash_conversionv1 · ratio

TTM operating cash flow / TTM net income

cash_to_assetsv1 · ratio

Cash / total assets

current_ratiov1 · ratio

Current assets / current liabilities

debt_to_equityv1 · ratio

Long-term debt / equity

decline_daysv3 · days

Days since LAST at that peak

dilution_1yv3 · ratio

Share count growth over ~1 year, split-adjusted

dividend_yieldv1 · ratio

TTM dividends paid / market cap

dollar_volumev2 · USD

Median daily traded value (tradability)

drawdownv2 · ratio

Fall from trailing-252d peak

earnings_growth_1yv1 · ratio

TTM net income growth; null off a negative base

equityv1 · USD

Stockholders equity, latest reported

fcf_marginv1 · ratio

TTM free cash flow / TTM revenue

fcf_yieldv1 · ratio

TTM free cash flow / market cap

forward_epsv1 · USD

Consensus EPS, next 4 quarters, as visible on as_of

forward_pev1 · ratio

Price / forward 4-quarter consensus EPS

goodwillv1 · USD

Goodwill on the balance sheet

goodwill_to_assetsv1 · ratio

Goodwill / total assets (acquisition risk)

gross_marginv2 · ratio

TTM gross profit / TTM revenue

interest_coveragev1 · ratio

TTM operating income / TTM interest expense

inventoryv1 · USD

Inventory, net

inventory_to_revenuev1 · ratio

Inventory / TTM revenue

liabilitiesv1 · USD

Total liabilities, latest reported

liabilities_currentv1 · USD

Current liabilities

long_term_debtv1 · USD

Long-term debt (total, else noncurrent)

market_capv3 · USD

RAW price x as-reported shares

net_debtv1 · USD

Long-term debt minus cash

ocf_growth_1yv1 · ratio

TTM operating cash flow growth

operating_marginv1 · ratio

TTM operating income / TTM revenue

pe_ratiov3 · ratio

Market cap / TTM net income (positive only)

ppe_netv1 · USD

Property, plant and equipment, net

price_to_bookv1 · ratio

Market cap / stockholders equity

profit_marginv2 · ratio

TTM net income / TTM revenue

ps_ratiov3 · ratio

Market cap / TTM revenue

public_floatv1 · USD

Public float as stated on the cover page

rd_intensityv1 · ratio

R&D / TTM revenue

receivablesv1 · USD

Accounts receivable, net current

receivables_to_revenuev1 · ratio

Receivables / TTM revenue

retained_earningsv1 · USD

Retained earnings / accumulated deficit

revenue_growth_1yv1 · ratio

TTM revenue vs the same measure a year earlier

reverse_splitsv1 · count

Reverse splits in trailing year (distress)

roav1 · ratio

TTM net income / total assets

roev1 · ratio

TTM net income / equity

sbc_to_revenuev1 · ratio

Share-based comp / TTM revenue (real dilution cost)

shares_outv3 · count

Shares outstanding, as reported

ttm_buybacksv1 · USD

Trailing 12m share repurchases (absolute)

ttm_capexv1 · USD

Trailing 12m capital expenditure (absolute)

ttm_dividends_paidv1 · USD

Trailing 12m dividends paid (absolute)

ttm_free_cash_flowv1 · USD

TTM operating cash flow - capex, period-aligned

ttm_gross_profitv2 · USD

Trailing 12m gross profit

ttm_interest_expensev1 · USD

Trailing 12m interest expense (absolute)

ttm_net_incomev2 · USD

Trailing 12m net income

ttm_operating_cash_flowv1 · USD

Trailing 12m cash from operations

ttm_operating_incomev1 · USD

Trailing 12m operating income

ttm_rdv1 · USD

Trailing 12m research and development

ttm_revenuev2 · USD

Trailing 12m revenue, point-in-time

ttm_sbcv1 · USD

Trailing 12m share-based compensation

volume_trendv2 · ratio

30d mean volume / prior mean volume

Research output only. Nothing on this page is investment advice, and no result here is a prediction of future returns.