Skip to main content

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): 6.8%.

  • BUY NOW5 · 0.20%
  • BUY WAIT168 · 6.57%
  • HOLD572 · 22.36%
  • SELL1,813 · 70.88%

BUY-eligible share over time

20.7%5.8%Apr 20May 6May 23

Avg verdict tenure: 1.4 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.

DimensionWeightWhat it measures
Value15%What you pay vs what the business produces
Quality15%How profitable + well-capitalized the business is
Growth15%How fast top + bottom lines are expanding
Momentum10%Whether price action confirms fundamentals
Sentiment10%News flow + analyst signal (Haiku-classified)
Insider10%Form-4 P/S transactions, C-level amplifier
Peer Rank10%Where the stock sits inside its industry
Technical5%Chart-level entry quality
Risk5%What can blow up the position
Catalyst5%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.

Quality + income facts

Five small data points appear in a hairline strip directly under the price on every stock page. They are facts, not scores — useful especially for income- and quality-oriented investors who want to see the basics without reading the full rating breakdown. Color coding follows documented thresholds; the specific numbers come from verdict_config.py and surface to the page via /api/meta so the colors never drift from what the engine uses.

Piotroski F-score

A 9-point fundamental health checklist (profitability, leverage, efficiency). Each criterion the company passes adds one point. F ≥ 7 indicates strong fundamentals across the board (the cohort that historically outperforms in Piotroski's 1976–1996 backtest); F ≤ 3 indicates the opposite. Source: Piotroski (2000)[1].

Dividend yield

Trailing 12-month dividend per share divided by current price, expressed as a percentage. A raw fact — colored neither green nor red because the right reference is context-dependent (sector, payout sustainability, history). Read the gap between the current yield and the 5-year average yield below to see whether the stock's yield has compressed (price ran ahead of dividend growth) or stretched (price falling faster than the dividend).

Payout ratio

Cash dividends paid as a percentage of net income. Sustainable below ~60%; at-risk above ~80% (a bad quarter or two could force a cut). REITs are exempt — by IRS rule they distribute ≥90% of taxable income to maintain their pass-through status, so a 95% payout is normal for the security type rather than a danger sign. The strip skips color on REIT rows and footnotes the carve-out.

Free cash flow yield

Trailing free cash flow divided by market capitalization. FCF yield ≥ 5% clears the 10-year Treasury baseline — the equity-premium minimum a public-equity holder should demand. Negative FCF yield is the red flag (the business is burning cash at this market cap). Banks and insurers show an em-dash because their cashflow statements are not comparable to non-financials (operating cashflow swings ±$100B by quarter for the largest banks).

5-year average dividend yield

Average trailing dividend yield over the past five years. Useful as context for the current yield: a current yield meaningfully below the 5-year average usually means price has compressed yield (recent rally outpacing dividend growth), while a current yield above the average usually means price has fallen faster than the dividend, raising the question of sustainability. Non-payers and stocks with less than 5 years of dividend history show an em-dash.

Moat classification

Moat is a single label — WIDE, NARROW, or NONE — derived from four yfinance-sourced fundamentals at a single point in time. It is nota qualitative assessment of network effects, switching costs, brand, or IP. We do not measure those. The label is a fast, deterministic shorthand for “the financial signature usually associated with a durable advantage,” and it is best read alongside the score breakdown rather than as a standalone judgment.

What goes in

Each component reads one field from the cached fundamentals snapshot and bins it into a 0–10 component score. Missing inputs fall back to a 5.0 neutral score so a single dropped field doesn't void the classification.

  • Pricing power — gross margin. Above 50% scores 9; above 35% scores 6; otherwise 3.
  • Capital efficiency — return on equity. Above 20% scores 9; above 12% scores 6.5; positive scores 4.5; otherwise 2.
  • Growth consistency — trailing year-over-year revenue growth. Above 10% scores 9; above 5% scores 6.5; positive scores 4.5; otherwise 2.
  • Financial strength — debt-to-equity ratio. Below 0.30x scores 9; below 0.80x scores 6; otherwise 3.

Classification

Average of the four component scores rounds the stock into a band: WIDEat ≥ 7.5, NARROWat ≥ 5.5, otherwise NONE. When the cache returns no data on all four inputs the classification is null (an em-dash on the page) rather than a misleading NONE.

Where it shows up

  • Quality Signals panel on every stock detail page renders a Moat: Wide or Moat: Narrow chip. The chip is hidden when classification is NONE or null.
  • Thesis REWARDS surfaces “Wide economic moat” as a green bullet whenever classification = WIDE.
  • Thesis RISKS surfaces “No competitive moat” as a red bullet whenever classification = NONE (not when null).
  • Path E gates in the V9 expert panel allow a borderline-score stock to keep its STRONG_BUY_NOW verdict when moat = WIDE buffers a structural risk (trade disruption, regulatory pressure, etc.) — see the V9 section.
  • Compounder ✓ chip lights up alongside Moat: Wide when growth consistency is strong/moderate AND capital efficiency is excellent/good.

What this label is not

It is a snapshot of four numeric fundamentals on the most recent cached run. It does not measure ten-year-historical margin durability, customer stickiness, IP defensibility, regulatory moat, network effects, or switching costs. A WIDE classification on a single quarter of strong margins and ROE is suggestive, not proof. Treat it as one of several inputs to a deeper read of the company. The bull/bear case bullets and Path E gates that key on this label inherit the same caveat.

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.

GateScopeStatus
ASYMMETRYUniversallive
MOMENTUMUniversallive
DEATH_CROSSUniversallive
INSIDERUniversallive
8K:CLEANUniversallive
NEWS_EVENTSUniversallive
SEMI_CYCLE_PEAKTech / Semislive
EARNINGS_PROXIMITYUniversallive
Value-trap heuristicUniversallive
REIT_TENANT_CLIFFReal Estateshipped 2026-04-25
HEALTHCARE_PAYERHealthcareshipped 2026-04-25
GEO_CONCENTRATIONFinancial Servicesshipped 2026-04-25
Bank CREBanksdeferred — data shape
Insurance state HHIInsurancedeferred — data shape
Healthcare M&MHealthcaredeferred — data shape
Asset-mgr counterpartyAsset Mgmtdeferred — data shape
Biotech pipelineBiotechdeferred — data shape
Utility regulatoryUtilitiesdeferred — 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 with PIOTROSKI_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.5.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

  1. 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.
  2. Asness, Frazzini and Pedersen (2019) — “Quality Minus Junk,” Review of Accounting Studies. Documents the persistent return premium of high-quality companies.
  3. 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.
  4. 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.