Method

What the model does, and where it fails

Every number on this page is measured, and each measurement is named so it can be checked. The honest one-line summary: the ranking is validated on held-out data and the profit is not.

live_validated: false

Nothing on this page has been confirmed by live forward trading. Every statistic comes from history reconstructed after the fact.

What the model actually is

It ranks the S&P 500 by the estimated probability that a stock travels +target% within N trading days before falling stop%. That is the only question it answers. It has no view on valuation, no view on the company, and no view on what anyone should own.

The training corpus was rebuilt from scratch as labelled outcomes — one row per (ticker, scan date, parameter set) — and evaluated the way the training code insists on: fit on the earlier dates, test on strictly later ones, so no future information can leak backwards into a score.

Training rows
Scan dates in corpus
Train / test split boundary
Model live in the API

Held-out validation

The one thing that is genuinely established
Model ROC AUC held out, ranking quality
Old heuristic ROC AUC 0.50 is a coin flip
Top-10 reached target against a base rate of
Top-10 stopped out the same picks, hitting their stop

ROC AUC measures whether the model orders stocks correctly, not whether following it makes money. Those are different claims and only the first one is supported. The heuristic it replaced scored near 0.50 on the same held-out data — it was not ranking at all.

The picks also beat their own scan-date universe, so the effect is selection rather than simply owning higher-beta names: on a 5% / 3-day / moderate setting the top three returned +0.93% per trade against +0.19% for every eligible stock that same day. That gap is real in the sample and not statistically significant at this sample size.

Track record of published candidates

Losses and stop-outs shown alongside hits
Candidates evaluated
Reached target
Hit stop-loss
Neither (expired)
Avg realized return

Scored against real subsequent prices once each horizon has passed. An expired candidate is neither a win nor a loss — it is the most common outcome, and any summary that quietly drops it is flattering itself.

Performance varies enormously by setting

Held out, top 3 per date, mean return per trade
Setting Reached target Stopped out Return / trade t
5% / 3d / Calm11%29% −0.15%−0.40
8% / 5d / Calm6%39% −0.15%−0.35
5% / 3d / Moderate43%6% +0.93%1.61
8% / 5d / Moderate33%17% +0.97%1.13
5% / 3d / Volatile63%9% +1.79%2.81
8% / 5d / Volatile51%13% +2.17%2.36

The “Calm” tier lost money in the measurement. It is not cautious, it is mislabelled: capping ATR at 2.5% selects stocks that cannot travel 5% in three days, so the stop-outs arrive without the wins. Its excess return against the universe was negative in all four variants tested. The tier is still offered on the screener because hiding a measured negative would be worse than publishing it — but the label describes volatility, not safety.

Tight stops cost money too. Widening the cap from 3% to 10% raised return per trade in nine of ten comparisons, because a 3% stop sits inside ordinary daily noise.

How candidates are ranked and filtered

Rank by P(target), break ties on downside

The probability calibrator is a step function, so a live scan routinely returns whole groups sharing one probability — one 5% / 3-day scan came back with all ten candidates at exactly 0.360. Their stop probabilities were not tied at all: some at 4–7%, others at 18–22%. Same measured upside, triple the downside, ordered arbitrarily. Sorting ties by the lower P(stop) lifted 5% / 3d / moderate from +0.93% to +1.17% per trade (t 1.61 → 2.30).

Ranking on full expected value was worse (+0.74%). Both probabilities are driven by the same volatility, so differencing them cancels the signal. P(stop) is used only to order stocks the model already considers equal.

Several names, not one

The top-ranked single name beat the top three on raw return in some settings and lost on every risk-adjusted measure — 5% / 3d / volatile went from t = 1.67 with a 17.0% maximum drawdown at top-1, to t = 3.15 and 7.0% at top-5. Where a broker supports fractional shares, spreading across three to five names costs nothing extra, since cost is proportional to dollars rather than to the number of positions.

A market-regime dial that was tested and rejected

Market context is deliberately excluded from the features: within a single date those columns are identical for every stock, so they can only overfit. But that leaves the cross-date question open, so it was asked separately. On the moderate tier the answer looked strong — roughly 0% per trade when the index's 5-day change was positive against +1.9% when negative.

It does not survive checking. Pooled across every configuration it is +0.92% vs +1.46% at Welch t = 1.38, not significant, and on the volatile tier it inverts. So there is no regime dial. It is recorded here because a negative result that stops you acting on noise is worth as much as a positive one.

Filtered out

  • Earnings inside the holding window. A result gaps past a stop rather than trading through it.
  • Negative expected value at the chosen target and stop.
  • Fewer than 60 bars of price history. This one blocks on a structural argument rather than a return one: the model reads a 50-day trend feature that does not exist below 50 bars, and a listing that young appeared on no training date, so the output would be an extrapolation rather than a fit. It caught a recent spin-off that was 38 bars old and fell 23% on its first standalone earnings report.

Deliberately not filtered

  • A “High” volatility assessment. It is derived from ATR%, so on the volatile tier it reads High for most of the list by construction. Screening on it would discard exactly the names that tier exists to surface.
  • Recent single-day shocks. This filter was added and then removed, because the data disagreed with it. On the volatile tier's held-out picks, 57% had recently shocked, and those returned +1.92% per trade against +1.62% for the calm ones (Welch t = −0.38). Briefs mark them with ⚡ and do not act on it.

Exits, measured four ways

The same 90 held-out trades, re-scored under each policy
Exit policy Return / trade Win rate Worst trade
Stop and target both resting+0.93% 58%−9.6%
Target limit only, stop worked by hand+0.84% 58%−12.6%
Judged once a day at the close+1.35% 56%−12.6%
No stop at all+0.90% 58%−17.2%

Judging at the close beat resting orders in 14 of 15 configurations. Most of the gain is upside a resting target limit throws away: a stock that gaps through its target keeps running to the close instead of being sold at exactly +5%. The cost is a fatter left tail — −12.6% worst trade against −9.6%, and higher variance throughout.

Read that honestly: the extra return comes from uncapped upside measured in a window that ended at a record high, so expect less of it in a flat market. The fatter tail is structural and will show up regardless.

On position sizing

This site does not size positions and will not. How much of anything to hold depends on circumstances it knows nothing about — income, obligations, tax position, how much of a loss would actually matter — and advising on that requires a licence the author does not hold. Briefs rank candidates and stop there. What to do with a ranking is entirely the reader's decision.

Limitations

Read this part twice
  • The corpus carries survivorship bias. The ticker list is today's index membership, so companies dropped over the period are missing from history. Every backfilled metric on this page is therefore an upper bound.
  • Thirty held-out dates is thirty observations. Not thirty thousand rows — thirty independent points, because stocks on the same day move together. A t of 2.3 on thirty points is encouraging, not established.
  • The test window ended at a record high. It ran from December 2025 to August 2026. No part of this has been tested through a sustained decline, and the exit policy that measured best is the one most exposed to one.
  • No live validation. live_validated is false on the readiness endpoint: of the 30 live labelled scan dates required. Every number above comes from reconstructed history.
  • Data quality is not guaranteed. Prices, news and social signals come from public endpoints that can be delayed, incomplete, or simply wrong, and the model consumes whatever it is given.
Observations logged
Labelled (outcome known)
Awaiting evaluation
Labelled scan dates
Live labelled scan dates

The honest summary

A real but unproven edge in ranking, measured on a short window that never went through a drawdown, with no live confirmation. The value of running it in public is that every call is logged and dated, so the record accumulates whether or not it flatters the model. Come back when the live count is not zero.