Methodology
How TrendMatrix scores stocks.
TrendMatrix scores 2,500+ US stocks across ten dimensions every night, runs the survivors through an expert-panel gate set, and publishes one of four verdicts with an entry target, take-profit, stop-loss, and risk/reward ratio.
This page is the long form. It explains every score, every gate, every verdict label, and the cadence on which the engine runs. The about page covers the founder story and the data sources at a higher level.
The universe
2,500+US stocks; ≥$1B market cap; foreign ordinaries (the non-tradeable F-suffix tickers like TOYOF) excluded; ADRs (Y-suffix and similar) included; rebuilt monthly. The $1B floor matches the engine’s hard-block constant MIN_MARKET_CAP in verdict_config.py; anything below that is excluded from BUY consideration even if the score qualifies, on the view that micro-caps are not where this model has edge.
Today’s verdict distribution
2,558 stocks scored. BUY-eligible share (BUY_NOW + BUY_WAIT): 20.7%.
- BUY NOW2 · 0.08%
- BUY WAIT528 · 20.64%
- HOLD535 · 20.91%
- SELL1,493 · 58.37%
BUY-eligible share over time
Trend chart activates at 30 daily snapshots (currently 15).
Avg verdict tenure: 1.1 days — average time a verdict label persists before flipping (read from verdict_history).
The 10 dimensions
Each stock receives a 0–10 score on ten dimensions. The composite score is a weighted sum: value, quality, and growth at 15% each; momentum, sentiment, insider, and peer rank at 10% each; technical, risk, and catalyst at 5% each. The weighting biases toward fundamentals over technicals, and toward business reality over short-term flow.
| Dimension | Weight | What it measures |
|---|---|---|
| Value | 15% | What you pay vs what the business produces |
| Quality | 15% | How profitable + well-capitalized the business is |
| Growth | 15% | How fast top + bottom lines are expanding |
| Momentum | 10% | Whether price action confirms fundamentals |
| Sentiment | 10% | News flow + analyst signal (Haiku-classified) |
| Insider | 10% | Form-4 P/S transactions, C-level amplifier |
| Peer Rank | 10% | Where the stock sits inside its industry |
| Technical | 5% | Chart-level entry quality |
| Risk | 5% | What can blow up the position |
| Catalyst | 5% | What's about to move the stock |
Value (15%)
What you pay relative to what the business produces. Inputs: trailing P/E, forward P/E, P/S, P/B, EV/EBITDA, free-cash-flow yield, PEG ratio, and analyst consensus target with a coverage-tiered haircut. The dimension blends 40% trailing signals with 60% forward signals so a name with a strong 12-month outlook is not punished for a weak last quarter. REITs use P/OCF instead of P/E because depreciation add-backs make GAAP earnings structurally misleading. A stock with a forward P/E under 15 and a positive free-cash-flow yield typically scores 8 or higher on value; a stock with a forward P/E above 60 and negative cash flow typically scores below 4.
Quality (15%)
How profitable and well-capitalized the business is. Inputs: return on equity, return on assets, gross margin, operating margin, net margin, debt-to-equity, current ratio, interest coverage, and the Piotroski F-score[1]. A company compounding capital at 25%+ ROE on healthy margins scores at the top of the range; a thin-margin business carrying excessive leverage scores at the bottom. The quality framework draws on the Quality-Minus-Junk evidence[2] that high-quality companies command a return premium.
Growth (15%)
How fast the top and bottom lines are expanding. Inputs: year-over-year revenue growth, earnings growth, and last-quarter EPS surprise versus consensus. Strong growth (20%+ YoY) earns a note; declining revenue earns a flag. The dimension is unweighted across components — beating estimates by 10% counts the same as growing 20% YoY.
Momentum (10%)
Whether price action confirms or contradicts the fundamental view. Inputs: RSI(14), MACD line and histogram, position versus the 20/50/200-day moving averages, and volume ratio. The RSI interpretation is context-aware — an RSI of 35 in an uptrend (above 200-day MA) reads as a buyable pullback and scores 7+; the same RSI in a downtrend reads as a falling-knife risk and scores 3.5. The component is anchored in the cross-sectional momentum literature[3], which documents persistent 3-12 month price continuation in US equities.
Sentiment (10%)
What the news flow and analyst community are saying. News sentiment is computed from the last 30 days of headlines, with each article pre-scored by Claude Haiku 4.5 (model id claude-haiku-4-5-20251001; see src/trendmatrix/pipeline/llm_sentiment.py). Scores are recency-weighted so a two-day-old story counts more than a 25-day-old one. Analyst signal is structured: target-price moves, upgrade/downgrade actions, and consensus distribution all feed the score separately. A stock with positive headlines and a tightening analyst consensus around a higher target scores well.
Insider (10%)
What the people closest to the business are doing with their shares. The dimension reads SEC Form 4 transactions from Finnhub and uses only codes P (open-market purchase) and S (open-market sale). Codes M (option exercise), F (tax-withholding on vest), A (grant), G (gift), and D(derivative) are ignored because they are mechanical, scheduled, or non-economic. The score blends net dollar value of P/S transactions over the last 90 days as a percentage of market cap, a C-level amplifier, and a buy/sell ratio. A CEO buying 0.5%+ of cap on the open market scores at the top; a cluster of C-level sellers above 0.5% of cap scores at the bottom. The Finnhub “BULLISH/BEARISH” categorical signal is ignored — three small routine sales should not look the same as a $50M CEO dump. The discretionary-insider read draws on Cohen-Malloy-Pomorski[4], which separates routine from discretionary insider trades and shows the discretionary subset carries the informational edge.
Peer Rank (10%)
Where the stock sits inside its industry. Each industry cohort is scored on value, quality, and growth, and the stock is ranked 1-of-N within its peer group. A best-in-class operator gets a positive note; a worst-in-class operator gets flagged as lagging peers. The ranking is what powers the “#8 of 80” label on the stock page.
Technical (5%)
Chart-level entry quality. Inputs: Bollinger band position, distance from support and resistance, ATR (average true range) as a percent of price. A stock trading near support with low realized volatility scores well; a stock pinned to upper Bollinger with a wide ATR scores poorly.
Risk (5%)
What can blow up. Inputs: short interest as a percentage of float (with a quality-conditional read — high short on a high-quality name reads as squeeze setup, high short on a low-quality name reads as justified-bear), beta versus the S&P 500, recent volatility, options put/call skew, and a concentration component derived from 10-K stock-intel extraction (each HIGH-severity concentration takes 2.5 points off the dimension). Sector floors apply: Healthcare gets a lower bar (biotech volatility is structural, anchored in clinical-event binary outcomes), Utilities and Consumer Defensive get a tighter one (a defensive name with a weak risk score is unusual).
Catalyst (5%)
What is about to move the stock. Inputs: earnings revision momentum (analyst EPS estimate change over 30 and 90 days), proximity to the next earnings date, recent material news, and beat/miss streak. Estimates revising up by 5%+ over 30 days add 2.5 points to the catalyst score; estimates revising down by 5%+ subtract 2.5.
The V9 expert panel
A 7.5/10 score is not enough. The fundamentals can be excellent and the timing or setup wrong. The V9 expert panel is the layer that catches that. Gates run after the score is computed. Any gate failure can downgrade a strong-score stock from STRONG_BUY_NOW to STRONG_BUY_WAIT (or further, if the failure is severe). The philosophy is simple: a stock can be a great business at a bad moment, and the verdict should reflect that.
| Gate | Scope | Status |
|---|---|---|
| ASYMMETRY | Universal | live |
| MOMENTUM | Universal | live |
| DEATH_CROSS | Universal | live |
| INSIDER | Universal | live |
| 8K:CLEAN | Universal | live |
| NEWS_EVENTS | Universal | live |
| SEMI_CYCLE_PEAK | Tech / Semis | live |
| EARNINGS_PROXIMITY | Universal | live |
| Value-trap heuristic | Universal | live |
| REIT_TENANT_CLIFF | Real Estate | shipped 2026-04-25 |
| HEALTHCARE_PAYER | Healthcare | shipped 2026-04-25 |
| GEO_CONCENTRATION | Financial Services | shipped 2026-04-25 |
| Bank CRE | Banks | deferred — data shape |
| Insurance state HHI | Insurance | deferred — data shape |
| Healthcare M&M | Healthcare | deferred — data shape |
| Asset-mgr counterparty | Asset Mgmt | deferred — data shape |
| Biotech pipeline | Biotech | deferred — data shape |
| Utility regulatory | Utilities | deferred — data shape |
12 gates live (9 universal + 3 sector-specific concentration cliffs); 6 sector-specific gates deferred on data-shape mismatch between extracted concentrations and academic thresholds. Detailed prose for each gate below.
Implemented — universal gates
- ASYMMETRY — the risk/reward ratio at the entry price must be ≥1.5. A stock with 5% upside and 5% downside does not clear, regardless of score.
- MOMENTUM — the momentum dimension must score ≥4.5. A stock with great fundamentals but a chart in active breakdown is a wait, not a buy.
- DEATH_CROSS — the 50-day moving average below the 200-day moving average is a hard block. Trend structure matters even when fundamentals look fine.
- INSIDER — the insider dimension must clear the floor (currently 2.5). Heavy C-level selling above 0.5% of market cap blocks BUY_NOW regardless of score.
- 8K:CLEAN — no recent material 8-K red flag. Auditor changes, earnings restatements, and bankruptcy filings are hard blocks.
- NEWS_EVENTS — no recent material negative event in the news feed. CEO transitions, regulatory probes, and product recalls trigger this gate.
- SEMI_CYCLE_PEAK — applies only to Tech and Semiconductors. A forward P/E under 10 combined with a forward/trailing P/E ratio under 0.30 means EPS just exploded off a trough — the classic memory-semi cycle peak signature. Catches MU cleanly without false-flagging NVDA or AMD.
- EARNINGS_PROXIMITY — within 7 calendar days of the next earnings print, BUY_NOW becomes BUY_WAIT. The 8-to-14-day window gets a visible warning with no block. Median S&P names realize roughly 80% of their earnings-driven move in the five trading days around the print.
- Value-trap heuristic — when the forward P/E is much higher than the trailing P/E, earnings are about to compress. The “cheap” valuation is a mirage and the gate flags it. Threshold:
REV_GROWTH_VALUE_TRAP= −5% revenue growth combined withPIOTROSKI_FLOOR_DEEP_VALUE= 4 — a deep-value path opens only when revenue is still growing and the Piotroski F-score is ≥4 (otherwise the “cheap” forward multiple is the trap, not the entry).
Implemented — sector-specific concentration cliffs
Shipped 2026-04-25 alongside the 10-K stock-intel extraction pipeline. Each fires only inside the relevant sector and reads structured concentration data extracted from the issuer’s 10-K.
- REIT_TENANT_CLIFF — applies only to Real Estate. A single tenant ≥40% of net operating income is a concentration cliff. Net-lease REITs disclose this as a policy risk factor at the same threshold.
- HEALTHCARE_PAYER — applies only to Healthcare. Government payer (Medicare, Medicaid, CMS) ≥70% of revenue is a reimbursement cliff. CMS rate changes have driven 50%+ drawdowns in pure-play government-payer names.
- GEO_CONCENTRATION — applies only to Financial Services. A single state or shared regional cluster ≥60% of book is a geographic cliff. Anchored in regional-bank distress literature: Texas 1986, Florida 2008, the New York regional cluster in 2023.
Deferred — sector-specific gates
Each of the gates below was specified during the V9 design pass but is deferred on a data-shape mismatch between the academic threshold and what the 10-K stock-intel extraction currently emits. They are listed by name so the V9 panel section reflects implementation, not design intent.
- Bank CRE— extraction reports “% of loan portfolio” but the FDIC 2006 guidance threshold is “% of Tier 1 equity”. Data shape doesn’t match the academic threshold.
- Insurance state HHI — Herfindahl-Hirschman concentration on premium-by-state requires structured per-state breakdowns; current extraction emits free-text region labels.
- Healthcare M&M — medical-malpractice litigation reserves vs surplus; current extraction does not isolate M&M reserve disclosures from broader litigation contingencies.
- Asset-manager counterparty — top-counterparty exposure as % of AUM; current extraction reports counterparties qualitatively without consistent percentage anchors.
- Biotech pipeline — single-asset pipeline-revenue dependence; extraction emits clinical-stage products as a list without the percent-of-projected-revenue field needed for a cliff threshold.
- Utility regulatory — single-state-regulator exposure; the current geographic breakdown does not isolate regulated-utility revenue from the non-regulated sleeve.
A gate failure does not always send the verdict to SELL. Most of the time it flips STRONG_BUY_NOW to STRONG_BUY_WAIT — the engine is saying “this is still a good company, just not at this price or this moment”.
Entry, take-profit, stop-loss
Take-profit picks the first available of (a) debiased analyst consensus target — raw target multiplied by 1 − haircut, where the haircut is coverage-tiered (8% for ≥30 analysts, 10% for 15-29, 13% for 5-14, 15% for <5) — (b) expected-upside fold of the current price, (c) resistance × 0.98, or (d) a default 15%. Entry for STRONG_BUY_NOW is the current price; for STRONG_BUY_WAIT the engine picks the shallowest of several technical anchors (support-anchored, MA50, MA200, gap-fill, 1×ATR pullback, 5% default) whose risk/reward at a 2×ATR entry-anchored stop satisfies the V9 ASYMMETRY gate (≥1.5). If no anchor clears, entry is solved algebraically at exactly the gate. Stop-loss applies once the entry is fixed: entry − 2×ATR is preferred, falling back to support × 0.97 or a 5% default. Implementation lives in verdict_engine.py on calculate_targets.
Pre-revenue and negative-EPS handling
P/E-driven scoring breaks for several recognizable issuer types, so the engine carves them out rather than substituting fabricated zeros that would skew the Value dimension.
- REITs — depreciation add-backs make GAAP earnings structurally misleading. The Value dimension uses P/OCF as a P/FFO proxy (yfinance does not expose FFO directly; equity-REIT P/OCF tracks P/AFFO within roughly 5-10%). The cyclical-trap warning is exempt for REITs because forward-EPS compression is depreciation-driven, not cyclical.
- Biotech— clinical-stage names with no revenue have many score components flagged “data unavailable” rather than zero. The Risk dimension floor for the Healthcare sector is 2.5 versus the universal 3.0 because clinical-event binary outcomes inflate short interest and realized volatility — a Risk score of 2.7 in biotech is a statistical norm, not a SELL signal.
- Negative-EPS broadly — when trailing earnings are negative, the trailing-P/E input to the Value blend is dropped from the average rather than treated as “extreme cheap”. The 60/40 forward-trailing blend re-weights to 100% forward when only forward is meaningful.
- mREIT structural leverage — Insurance/Mortgage REITs run 7-10× leverage as a business model. The generic D/E > 3 quality penalty is exempt for this industry because the high leverage is structural, not a warning sign.
- Defense contractors — government-revenue concentration is the business model, not a cliff risk. The HEALTHCARE_PAYER gate uses sector + specific-token (Medicare/Medicaid/CMS) filters so defense names with high government revenue do not trip the gate.
The stock-intel layer
Stock-intel is a separate pipeline that reads the 10-K (annual report) for every name in the universe and extracts structured concentrations: supplier dependencies, customer concentration, geographic exposure, regulatory exposure, and counterparty risk. 8-K material events (auditor changes, executive departures, restatements, bankruptcy) come from EDGAR.
Coverage today: 100% of the universe has stock-intel populated. Roughly 34% of stocks (861 of 2,500+) flag at least one HIGH-severity concentration. The data feeds two consumers. The universal Risk dimension takes 2.5 points off for each HIGH-severity concentration. The sector-specific V9 gates (REIT_TENANT_CLIFF, HEALTHCARE_PAYER, GEO_CONCENTRATION) read the same data and fire only when the cliff threshold is crossed inside the relevant sector.
Concrete example: NVIDIA flags TSMC as a MEDIUM-severity supplier concentration. NVDA depends on TSMC for fab capacity, and the 10-K discloses it as a risk factor — that is the kind of fact stock-intel surfaces structurally rather than asking you to read footnotes.
Cadence Policy
The full pipeline runs nightly at 2:30 AM ET. Phase 1 pulls fundamentals; Phase 2 pulls insider transactions and analyst recommendations in parallel; Phase 3 runs the deep analyzer that produces every score, every gate, and every verdict. During market hours, a Phase 3 delta refresh re-runs every 5 minutes against current prices. News-event re-computes feed the hysteresis layer only — they do not flip a verdict by themselves. The verdict label served to a given user has a display-dwell floor of 60 minutes for the currently-served POSITION × MOD persona, so a borderline verdict that oscillates between BUY_NOW and BUY_WAIT does not flicker on the user’s page within the same hour. Every published row is stamped with the algo version (currently v9.4.0) so before-and-after comparisons across engine evolutions stay interpretable.
What each verdict means
- STRONG_BUY_NOW — the score is high, every V9 gate passed, the asymmetry is positive at the entry price, and the recent setup confirms the entry. The model thinks now is a reasonable time to start a position at the current price.
- STRONG_BUY_WAIT — the score is high but at least one entry condition is missing. Most often the price has not pulled back to entry yet, or earnings are within 7 days, or a moving-average gate is firing. Watch the stock; do not chase it.
- HOLD_IF_HOLDING — not a fresh buy candidate. If you already own it there is no urgent reason to sell, but the model would not buy more at this price.
- SELL_IF_HOLDING — the score is weak, a critical gate has failed, or news and filings are flashing red. Consider reducing exposure.
Be honest with yourself about what these labels are. They are educated opinions from a model that reads the same public data you can read, applied consistently across every name. They are not guaranteed outcomes.
What this is not
- Not investment advice. TrendMatrix produces model-generated quantitative analysis for informational purposes only. InsightMatrix LLC is not a registered investment advisor. Consult a qualified financial professional before making investment decisions.
- Not a backtest. The site does not publish historical alpha claims. The model is run forward in time, and the public verdict ledger is the only record of what it said when.
- Not optimized for dividends. The current dimensions weight total-return signals (price, earnings, growth) heavily and yield lightly. A dividend-first version of the score is on the backlog, not in production.
- Not for day-trading. Signals refresh every 5 minutes during market hours, not in real time. Intraday momentum and order-flow signals are out of scope.
- Not a meme-stock detector. The model is conservative by design. It will not catch every breakout in a name with no fundamentals, and it actively downgrades stocks where the only bull case is technical.
Sources
- Piotroski (2000) — “Value Investing: The Use of Historical Financial Statement Information,” Journal of Accounting Research, 38 (Supplement). The 9-point F-score that underlies the Quality dimension.
- Asness, Frazzini and Pedersen (2019) — “Quality Minus Junk,” Review of Accounting Studies. Documents the persistent return premium of high-quality companies.
- Jegadeesh and Titman (1993) — “Returns to Buying Winners and Selling Losers: Implications for Stock Market Efficiency,” Journal of Finance, 48(1). Original cross-sectional momentum evidence in US equities.
- Cohen, Malloy and Pomorski (2012) — “Decoding Inside Information,” Journal of Finance, 67(3). Separates routine from discretionary insider trades; the discretionary subset carries the informational edge.
Where to next
- Today’s BUY list — STRONG_BUY_NOW + STRONG_BUY_WAIT stocks that pass every gate, with entry targets and risk/reward.
- Browse by sector — sector rollups with sector-level BUY counts and average scores; per-sector breakdown of the universe.
- API spec — machine-readable OpenAPI for everything the site renders. No key required.
- About — the founder story, the pricing comparison, and the data sources at a higher level.
- Home — live dashboard with watchlist, top picks, gainers/losers, and verdict changes.