Signals & Trends Estimate revisions, PE momentum, theme health, peer rankings, and consistency checks

Signals are intermediate computations stored in a unified signal store with TTL-based expiration (typically 7 days). Each signal produces a 0–100 score and a categorical label. Signals feed into the four conviction dimensions as components.

Signal Store

All signals are written to ticker_signals with a valid_days TTL. Expired signals are excluded from conviction scoring. Most signals refresh on a 7-day cycle.

Estimate Revisions

Tracks how consensus NTM (next twelve month) estimates have shifted across three lookback windows. Uses annual-period estimates only.

Lookback Windows

WindowLookbackSource
7-daytoday − 7dNearest estimate_snapshots row on or before cutoff
30-daytoday − 30dSame
90-daytoday − 90dSame

Delta Calculation

rev_pct = (current_estimate − old_estimate) / old_estimate × 100
Computed separately for EPS and Revenue in each window

Composite & Score

composite = average(eps_pct_30d, rev_pct_30d) — whichever are available
score = max(0, min(100, 50 + composite × 10))
+5% revision → 100, 0% → 50, −5% → 0
LabelCondition
Risingcomposite > +1%
Stable−1% to +1%
Fallingcomposite < −1%

Feeds into Fundamental → Estimate Trajectory component.

PE Momentum

Measures the velocity and acceleration of P/E ratio changes to detect valuation compression or expansion trends. Uses COALESCE(forward_pe, trailing_pe) from PE snapshots at four time points.

Velocity (First Derivative)

velocity_30d = (PEnow − PE30d) / PE30d × 100
velocity_90d = (PEnow − PE90d) / PE90d × 100

Acceleration (Second Derivative)

velocity_prior = (PE30d − PE60d) / PE60d × 100
acceleration = velocity_30d − velocity_prior

Scoring

Base: vel_clamped = clamp(velocity_30d, −30, +30)
vel_score = 50 − vel_clamped × 1.5
Compression (−30%) → 95, flat → 50, expansion (+30%) → 5

Acceleration adjusts the base score based on the regime:

RegimeVelocityAccelerationAdjustmentInterpretation
Decelerating compression< 0< 0+up to 10 ptsBottoming signal
Accelerating expansion> 0> 0−up to 10 ptsGetting frothy
Decelerating expansion> 0< 0+up to 8 ptsCooling off (mild positive)
Accelerating compression< 0> 0−up to 8 ptsBearish

Labels

LabelCondition
Compressingvelocity < −3% and accel > 0
Bottomingvelocity < −3% and accel ≤ 0
Expandingvelocity > +3% and accel > 0
Peakingvelocity > +3% and accel ≤ 0
Stable−3% to +3%

Feeds into Valuation → PE Momentum component.

Theme Momentum

Classifies each theme detected for a ticker by its lifecycle stage, then aggregates to produce a health score reflecting the balance of accelerating vs decaying themes.

Theme Classification

Each (ticker, theme) pair is evaluated in priority order:

LabelConditionMeaning
DecayingLast seen > 30 days agoTheme fading from narrative
NewFirst seen ≤ 14 days agoEmerging theme
Accelerating≥2 sources OR ≥3 total occurrencesMulti-source reinforcement
StableDefaultMentioned but not intensifying

Health Score

accel_ratio = accelerating_count / total_themes × 100
decay_ratio = decaying_count / total_themes × 100
momentum_health = max(0, min(100, 50 + accel_ratio − decay_ratio))
All accelerating → 100, all decaying → 0, balanced → ~50

Feeds into Thematic → Theme Health component.

Rating Momentum

Tracks net analyst upgrades and downgrades from rating_changes across 30-day and 90-day windows.

Computation

net_30 = upgrades_30d − downgrades_30d
net_90 = upgrades_90d − downgrades_90d
bullish_pct_90d = upgrades_90d / total_90d × 100

Labels

LabelConditions (any trigger)
Bullishnet_30 ≥ 2, OR net_90 ≥ 3, OR upgrades > 0 with zero downgrades
Bearishnet_30 ≤ −2, OR net_90 ≤ −3, OR downgrades > 0 with zero upgrades
NeutralOtherwise

Scoring

score = max(0, min(100, 50 + net_90d × 5))
+10 net upgrades → 100, 0 → 50, −10 → 0

Feeds into Catalyst → Rating Momentum component.

Peer Rankings

Ranks companies within their peer group across five weighted dimensions. Each dimension is a percentile rank (0–100) computed among peers with ≥3 members.

DimensionWeightRaw MetricDirection
Earnings Quality 30% blended_beat * 0.5 + min(blended_surprise, 15) * (100/15) * 0.5
beat = eps_beat_rate * 0.6 + rev_beat_rate * 0.4
Higher = better
AI Exposure 25% AI composite score (prefers composite > revenue_catalyst > revenue_exposure) Higher = better
Valuation 20% Forward P/E Lower = better
Estimate Momentum 15% 50 + (eps_pct_30d * 0.6 + rev_pct_30d * 0.4) * 5 Higher = better
Price Momentum 10% ytd_pct * 0.4 + qtd_pct * 0.4 + rating_net * 2 * 0.2 Higher = better
composite = Σ(weighti × percentile_ranki) / Σ(available weights)
Missing dimensions excluded, remaining weights renormalized
Alert

A peer_rank_bottom alert fires when a ticker's composite falls below the 25th percentile of its peer group.

Feeds into Thematic → Peer Standing component.

Thesis Consistency

Starts at 100 and deducts penalties for contradictions between thesis conviction and observed signals. Ensures high-conviction calls are supported by data.

CheckTriggerPenaltySeverity
Estimate contradiction Conviction ≥ 7 AND estimates falling −25 High
Price below bear case Price < bear_EPS × bear_PE × 0.9 −20 High
Rating divergence Conviction ≥ 7 AND rating bearish −15 Medium
Price above bull case Price > bull_EPS × bull_PE × 1.1 −15 Medium
Peer rank divergence Conviction ≥ 7 AND peer rank < 30th pct −15 Medium
Stale thesis opportunity Conviction ≤ 4 AND estimates rising −10 Medium
Rating opportunity Conviction ≤ 4 AND rating bullish −10 Medium
Thesis staleness Thesis age > 30 days −1 per 15d, max −15 Low (<60d) / Medium (≥60d)

Labels

LabelScore
Healthy≥80
Warning≥50
Critical<50

Feeds into Catalyst → Thesis Consistency component. Consistency flags also modify the thesis conviction score via cross-signal penalties (see Conviction Score).

AI Theme Concentration

Measures what fraction of a company's detected themes are AI-related, as an indicator of narrative concentration risk or AI exposure depth.

concentration = ai_theme_count / total_theme_count × 100
LabelThresholdInterpretation
High>30%AI-dominant narrative; deep exposure but concentration risk
Moderate15–30%Meaningful AI presence balanced with other themes
Low≤15%AI is peripheral to the investment narrative
Concentration Risk

High AI theme concentration triggers a theme_concentration risk flag (medium severity) in the risk module. This doesn't directly penalize conviction but surfaces in risk reports and alerts.

Used in AI deep-dive reports and risk monitoring. Indirectly influences the Thematic dimension through theme health calculations.