How a pick gets made
no black box, no magicEvery weekday, after US close, we run a pipeline that ingests fresh data, scores every stock on 17 factors, combines those into a single composite, and publishes the top 10 longs plus bottom 5 avoids. Below is the full factor list, what each one measures, where the data comes from, and the weight applied.
The 17 factors
grouped into 7 buckets, weighted into one score| Bucket | Factor | What it measures | Source | Bucket weight |
|---|---|---|---|---|
| momentum | mom_12m | 12-month total return | Yahoo prices | 25% |
| mom_6m | 6-month total return | Yahoo prices | ||
| mom_3m | 3-month total return | Yahoo prices | ||
| mom_1m | 1-month total return | Yahoo prices | ||
| price_vs_50dma / 200dma | distance from moving averages | Yahoo prices | ||
| value | value_pe | TTM P/E (lower = better) | SEC EDGAR + price | 15% |
| value_pfcf | price / operating cash flow | SEC EDGAR + price | ||
| quality | quality_roe | return on equity | SEC EDGAR | 15% |
| quality_de | long-term debt / equity (lower = better) | SEC EDGAR | ||
| growth | growth_rev_yoy | revenue YoY growth, last Q vs same Q prior year | SEC EDGAR | 15% |
| growth_eps_yoy | diluted EPS YoY growth | SEC EDGAR | ||
| sentiment | sentiment_7d | average news sentiment last 7 days, scored by Claude Haiku | Finnhub + Anthropic | 10% |
| insider | insider_cluster_30d | weighted purchase value times number of insiders, last 30 days | OpenInsider / SEC Form 4 | 10% |
| catalyst | catalyst_recency | flag if catalyst news (earnings, FDA, M&A, etc.) in last 3 days | Finnhub + Claude classification | 10% |
Volatility (vol_30d), RSI (rsi_14), and a few others are computed and stored, but currently held out of the composite based on the factor backtest finding they were neutral or contrarian in the 2025-2026 regime. They appear in the dossier for context.
From factor to score to pick
- Raw values: each factor is computed per stock from raw data (no normalization yet).
- Percentile rank: for each factor, every stock gets a 0-100 percentile within the active universe (516 stocks). Factors where "lower is better" (P/E, P/FCF, debt-to-equity, volatility) are inverted so higher percentile always means more bullish.
- Bucket score: average percentile within each bucket. A stock missing one factor in a bucket still gets a bucket score from the rest.
- Composite: weighted average of bucket scores. Requires at least 50% bucket coverage to qualify, otherwise the stock is skipped.
- Picks: top 10 by score become longs, bottom 5 become avoids. Targets and stops are set from 14-day ATR (target = entry + 2x ATR for longs, stop = entry - 1.5x ATR).
- Reasoning: Claude Haiku writes a 2-3 sentence rationale for each pick using the factor breakdown plus the last 7 days of catalyst news.
What we don't do
- We do not pretend the backtest is unbiased. Universe is current S&P 500 + Nasdaq-100; survivors only. Real-world results will be lower.
- We do not retroactively delete losing picks. Every pick we publish goes into the public track record, win or lose.
- We do not optimize weights to the most recent month. Weights are set by hand from prior knowledge plus the factor predictiveness report.
- We do not claim to be "AI-powered" beyond Claude doing sentiment scoring and writing reasoning. The scoring engine is plain Python and percentile ranking.