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
| Dataset | Rows | Tickers | Covers |
|---|---|---|---|
| Fundamentals (SEC XBRL)7,644 companies · 48 metrics | 18,513,480 | 7,295 | 2009-04-15 → 2026-07-27 |
| Daily prices — deep history | 19,470,643 | 6,392 | 1962-01-02 → 2026-08-28 |
| Daily prices — recent | 2,916,430 | 6,440 | 2024-07-26 → 2026-09-04 |
| Prices with raw + adjusted + dividends | 1,439,965 | 394 | 1980-03-17 → 2026-09-04 |
| Stock splits | 25,674 | 17,515 | 2005-01-03 → 2026-12-17 |
| Cash dividends | 56,458 | 26,346 | 2026-04-15 → 2030-12-13 |
| Forward analyst estimates | 98,785 | 3,815 | 2026-08-10 → 2027-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.
| Year | Tickers priced | With financials |
|---|---|---|
| 2000 | 296 | none |
| 2005 | 1,936 | none |
| 2010 | 2,298 | 463 |
| 2013 | 2,647 | 3,477 |
| 2016 | 3,082 | 4,058 |
| 2020 | 3,890 | 5,084 |
| 2024 | 5,318 | 6,461 |
Latest screen · 2026-07-28
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.
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%
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.
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.
| Run | Return | Worst fall | Settings 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.
| Stock | Bought | At | Sold | At | Held | Return |
|---|---|---|---|---|---|---|
| MU | 2022-11-29 | $55.71 | 2022-12-29 | $49.40 | 30d | -11.5% |
| HUN | 2023-06-01 | $23.78 | 2023-07-03 | $27.04 | 32d | +13.4% |
| M | 2023-08-02 | $16.10 | 2023-08-31 | $12.34 | 29d | -23.5% |
| LW | 2024-10-02 | $63.00 | 2024-10-31 | $77.07 | 29d | +22.0% |
| FIVE | 2025-03-06 | $83.87 | 2025-04-04 | $53.63 | 29d | -36.2% |
| RHI | 2026-01-06 | $26.57 | 2026-02-05 | $32.94 | 30d | +23.7% |
| FOUR | 2026-01-06 | $63.84 | 2026-02-05 | $58.45 | 30d | -8.7% |
| LRN | 2026-03-09 | $85.46 | 2026-07-28 | $95.88 | 141d | +11.9% |
Measured against SPY. Trading costs are charged on every one of these.
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.
| Run | Return | Worst fall | Settings 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.
| Stock | Bought | At | Sold | At | Held | Return |
|---|---|---|---|---|---|---|
| CHD | 2021-08-30 | $81.51 | 2021-09-29 | $81.94 | 30d | +0.3% |
| BBWI | 2022-12-29 | $41.35 | 2023-03-02 | $39.45 | 63d | -4.8% |
| SWN | 2023-01-31 | $5.40 | 2023-03-02 | $5.32 | 30d | -1.7% |
| ALB | 2023-10-02 | $169.19 | 2023-10-31 | $126.67 | 29d | -25.3% |
| GIS | 2024-06-03 | $68.69 | 2024-07-03 | $63.01 | 30d | -8.5% |
| SJM | 2024-10-31 | $113.99 | 2024-12-02 | $118.00 | 32d | +3.3% |
| CRM | 2025-12-04 | $243.69 | 2026-01-06 | $255.20 | 33d | +4.5% |
| OWL | 2026-07-09 | $9.27 | 2026-07-28 | $9.81 | 19d | +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.
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.
| Stock | Bought | At | Sold | At / now | Held | Return |
|---|---|---|---|---|---|---|
| XOMA | 2022-06-13 | $17.30 | 2025-09-03 | $34.53 | 1178d | +98.6% |
| NXDR | 2022-11-10 | $2.19 | still held | $2.30 | 1356d | +4.8%unrl. |
| EJH | 2024-05-21 | $8,000.00 | 2024-07-08 | $18,750.00 | 48d | +133.2% |
| FFAI | 2024-06-21 | $2,480.40 | still held | $4.63 | 767d | -99.8%unrl. |
| CMTG | 2025-04-11 | $2.46 | still held | $2.12 | 473d | -14.0%unrl. |
| NNNN | 2025-11-03 | $16.82 | 2025-12-04 | $37.40 | 31d | +121.2% |
| AMKR | 2026-06-08 | $68.40 | still held | $45.69 | 50d | -33.4%unrl. |
| PMI | 2026-06-08 | $0.26 | still held | $0.09 | 50d | -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.
| Run | Return | Worst fall | Settings 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.
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.
| Stock | Bought | At | Sold | At / now | Held | Return |
|---|---|---|---|---|---|---|
| WRAP | 2021-08-06 | $8.14 | 2021-08-19 | $7.33 | 13d | -10.4% |
| NU | 2022-06-22 | $3.77 | still held | $14.68 | 1497d | +288.4%unrl. |
| SBEV | 2023-10-06 | $111.20 | 2023-10-25 | $100.08 | 19d | -10.4% |
| HMR | 2025-03-19 | $3.44 | 2025-03-24 | $3.10 | 5d | -10.4% |
| CMI | 2025-04-10 | $288.04 | still held | $641.60 | 474d | +122.2%unrl. |
| SVRA | 2025-10-21 | $4.09 | still held | $5.33 | 280d | +30.0%unrl. |
| KZIA | 2026-04-23 | $11.46 | still held | $12.69 | 96d | +10.5%unrl. |
| VECO | 2026-06-10 | $67.45 | 2026-07-02 | $60.71 | 22d | -10.4% |
Earlier versions of these rules
Kept so the change is attributable, not just announced. The settings column is what explains the difference.
| Run | Return | Worst fall | Settings 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.
| Strategy | Period | Return | vs index | Worst fall | Trades | Runs |
|---|---|---|---|---|---|---|
| pop_stop_at_close | 2020-07-29 → 2026-07-28 | +4.5% | +44.6%SPY | -13.7% | 59,810 | 5 |
| pop_stop_or_hold | 2020-07-29 → 2026-07-28 | +8.3% | +44.6%SPY | -11.8% | 59,810 | 4 |
| dip_double_or_holdon cash paid in | 2020-07-29 → 2026-07-28 | +10.1% | +45.9%SPY | -35.4% | 16,828 | 12 |
| deep_neglect_price_only | 2013-01-02 → 2026-07-28 | +345.5% | +283.3%IWM | -46.2% | 280 | 9 |
| deep_value_neglect | 2013-01-02 → 2026-07-28 | +216.4% | +283.3%IWM | -63.1% | 280 | 9 |
| value_momentum | 2021-07-29 → 2026-07-28 | +50.9% | +77.0%SPY | -24.2% | 380 | 2 |
| quality_neglect | 2021-07-29 → 2026-07-28 | +27.2% | +77.0%SPY | -46.4% | 620 | 2 |
| absolute_cheap_value_ranked | 2021-07-29 → 2026-07-28 | +54.8% | +77.0%SPY | -31.3% | 246 | 2 |
| absolute_cheap_fixed | 2021-07-29 → 2026-07-28 | +33.3% | +77.0%SPY | -33.2% | 474 | 2 |
| relative_cheapest_quartile | 2021-07-29 → 2026-07-28 | +34.0% | +77.0%SPY | -40.9% | 399 | 2 |
| absolute_value_monthly | 2021-07-29 → 2026-07-28 | +40.7% | +77.0%SPY | -39.3% | 668 | 15 |
| relative_value_monthly | 2021-07-29 → 2026-07-28 | +29.6% | +77.0%SPY | -40.8% | 671 | 15 |
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.
| Strategy | Return per unit of risk | Probability it is real |
|---|---|---|
| absolute_cheap_fixed | +0.35 | 0.397 |
| absolute_cheap_value_ranked | +0.48 | 0.512 |
| absolute_value_monthly | +0.38 | 0.430 |
| deep_neglect_price_only | +0.51 | 0.570 |
| deep_value_neglect | +0.42 | 0.439 |
| dip_double_or_hold | -0.21 | 0.067 |
| pop_stop_at_close | -0.35 | 0.035 |
| pop_stop_or_hold | +0.12 | 0.225 |
| quality_neglect | +0.31 | 0.368 |
| relative_cheapest_quartile | +0.35 | 0.399 |
| relative_value_monthly | +0.32 | 0.378 |
| value_momentum | +0.53 | 0.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.
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.
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.
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.
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.
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 · USDTotal assets, latest reported
assets_currentv1 · USDCurrent assets
buyback_yieldv1 · ratioTTM buybacks / market cap
cashv1 · USDCash and equivalents, latest reported
cash_conversionv1 · ratioTTM operating cash flow / TTM net income
cash_to_assetsv1 · ratioCash / total assets
current_ratiov1 · ratioCurrent assets / current liabilities
debt_to_equityv1 · ratioLong-term debt / equity
decline_daysv3 · daysDays since LAST at that peak
dilution_1yv3 · ratioShare count growth over ~1 year, split-adjusted
dividend_yieldv1 · ratioTTM dividends paid / market cap
dollar_volumev2 · USDMedian daily traded value (tradability)
drawdownv2 · ratioFall from trailing-252d peak
earnings_growth_1yv1 · ratioTTM net income growth; null off a negative base
equityv1 · USDStockholders equity, latest reported
fcf_marginv1 · ratioTTM free cash flow / TTM revenue
fcf_yieldv1 · ratioTTM free cash flow / market cap
forward_epsv1 · USDConsensus EPS, next 4 quarters, as visible on as_of
forward_pev1 · ratioPrice / forward 4-quarter consensus EPS
goodwillv1 · USDGoodwill on the balance sheet
goodwill_to_assetsv1 · ratioGoodwill / total assets (acquisition risk)
gross_marginv2 · ratioTTM gross profit / TTM revenue
interest_coveragev1 · ratioTTM operating income / TTM interest expense
inventoryv1 · USDInventory, net
inventory_to_revenuev1 · ratioInventory / TTM revenue
liabilitiesv1 · USDTotal liabilities, latest reported
liabilities_currentv1 · USDCurrent liabilities
long_term_debtv1 · USDLong-term debt (total, else noncurrent)
market_capv3 · USDRAW price x as-reported shares
net_debtv1 · USDLong-term debt minus cash
ocf_growth_1yv1 · ratioTTM operating cash flow growth
operating_marginv1 · ratioTTM operating income / TTM revenue
pe_ratiov3 · ratioMarket cap / TTM net income (positive only)
ppe_netv1 · USDProperty, plant and equipment, net
price_to_bookv1 · ratioMarket cap / stockholders equity
profit_marginv2 · ratioTTM net income / TTM revenue
ps_ratiov3 · ratioMarket cap / TTM revenue
public_floatv1 · USDPublic float as stated on the cover page
rd_intensityv1 · ratioR&D / TTM revenue
receivablesv1 · USDAccounts receivable, net current
receivables_to_revenuev1 · ratioReceivables / TTM revenue
retained_earningsv1 · USDRetained earnings / accumulated deficit
revenue_growth_1yv1 · ratioTTM revenue vs the same measure a year earlier
reverse_splitsv1 · countReverse splits in trailing year (distress)
roav1 · ratioTTM net income / total assets
roev1 · ratioTTM net income / equity
sbc_to_revenuev1 · ratioShare-based comp / TTM revenue (real dilution cost)
shares_outv3 · countShares outstanding, as reported
ttm_buybacksv1 · USDTrailing 12m share repurchases (absolute)
ttm_capexv1 · USDTrailing 12m capital expenditure (absolute)
ttm_dividends_paidv1 · USDTrailing 12m dividends paid (absolute)
ttm_free_cash_flowv1 · USDTTM operating cash flow - capex, period-aligned
ttm_gross_profitv2 · USDTrailing 12m gross profit
ttm_interest_expensev1 · USDTrailing 12m interest expense (absolute)
ttm_net_incomev2 · USDTrailing 12m net income
ttm_operating_cash_flowv1 · USDTrailing 12m cash from operations
ttm_operating_incomev1 · USDTrailing 12m operating income
ttm_rdv1 · USDTrailing 12m research and development
ttm_revenuev2 · USDTrailing 12m revenue, point-in-time
ttm_sbcv1 · USDTrailing 12m share-based compensation
volume_trendv2 · ratio30d 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.