← AI features

Scoring engine — model card

v2.7 · Tier 1-4Live Multi-factor weighted scoring across 14 asset classes.

Purpose

Produces a 0-100 composite score per security with a categorical tier (Strong Buy / Buy / Hold / Sell / Strong Sell). Drives every recommendation surface: /now, /forecast, /signals, /security?ticker=X, /strategies, /heatmap.

Inputs

Outputs

{
  ticker:    "AAPL",
  cls:       "Stocks",
  score:     70.3,                    // 0..100
  tier:      "Buy",                   // categorical
  alpha:     { netBps: 14, gross: 18, drag: 4 },
  regime:    "risk-on",
  topContribs: [                      // factor decomposition (Bible §6.5)
    { factorId: "F05_mom3m",   value: +18, unit: "bps" },
    { factorId: "F12_breadth", value: +6,  unit: "bps" },
    { factorId: "F23_liquidity", value: -2, unit: "bps" },
    // …top 5
  ],
  asof:      1714082400000,
  ts:        1714082400000
}

Architecture

Factor inventory (Bible §6.1)

25-30 factors per asset class, each tagged with tier (1-4) and weight (sums to 1.0 ± 0.05):

TierDomainWeight rangeExamples
Tier 1Macro / cross-asset0.30+F01_macro_mood, F02_dxy, F03_yield_curve
Tier 2Sector / industry0.20+F11_sector_rotation, F12_breadth, F15_vol_regime
Tier 3Instrument fundamentals0.15+F22_earnings, F23_liquidity, F26_insider
Tier 4Sentiment / technical0.05+F05_mom3m, F08_news_velocity, F31_funding

Orthogonalization (Gram-Schmidt)

Before weighting, factors are orthogonalized to remove cross-factor correlation via Gram-Schmidt decomposition. This prevents high-correlation factor pairs from over-weighting their shared signal and ensures each factor contributes independent information. Post-orthogonalization, pairwise correlations ρ are capped: if ρ > 0.7 between two factors, the lower-IC factor's weight is damped by 70%.

Signal-to-Noise Ratio (SNR) audit

Each factor is assigned an SNR from walk-forward out-of-sample Information Coefficient (IC) breakdowns:

Low-SNR factors are deprecated semi-automatically — weights decay over 4 weeks unless fresh OOS validation brings SNR above 0.5.

Information Coefficient (IC) & ICIR

IC: Rank correlation between factor value and forward 1-30d returns. Reported per fold via walk-forward. Positive IC = predictive edge; |IC| > 0.03 is meaningful.

ICIR: IC divided by its standard deviation across folds. ICIR > 0.5 is credible; ICIR < 0.2 is noise. Aggregate verdict gates trust in the model via the Walk-Forward page.

Regime-specific retraining

Factor weights are recomputed monthly, breaking down by regime (risk-on / risk-off / transition) via engine/ensembleRegime.js. When regime-specific IC for any factor drops >20% vs baseline, an alert flags potential regime-dependency. This helps explain "why did my edge disappear?" — often the answer is "market regime changed, and your factor is regime-dependent."

Size factor — F20_marketCap + F37_sizeFactor (Phase F, 2026-04-27)

Two cap-tier-aware factors are now part of the ensemble, both backed by the canonical classifier in engine/cap-tier.js:

Annualized premia (bps, unconditional) per the cap-tier engine:

Regime conditioning per Cooper, Gulen & Schill (2008): risk-on amplifies small/micro premium (×1.3–1.4); risk-off inverts it (×0.4–0.6, flight-to-quality). Mega caps gain a defensive bid in risk-off.

Idiosyncratic-vol multiplier per Bali, Engle & Murray (2016): mega 0.85× → nano 2.4×. Used by engine/prescience.js to widen forecast 95% CI bands for smaller caps so displayed uncertainty reflects tier-aware idio-risk.

Microstructure friction floor per Hasbrouck (2009) and Brogaard, Hendershott & Riordan (post-decimalization update): mega 3 bps → nano 35 bps round-trip. Used by engine/playbook.js Gate 1 (alpha sufficiency) so micro caps require materially higher alpha to clear costs.

Sources cited: Banz (1981), Fama-French (1992, 2015), Cooper-Gulen-Schill (2008), Asness-Frazzini-Israel-Moskowitz-Pedersen (2018), Bali-Engle-Murray (2016), Hasbrouck (2009).

Layer-conditional weighting (LS6 — v76)

Different factors carry different weights at different regimes. Risk-on rewards momentum (F05_mom3m); risk-off rewards quality (F22_earnings, F26_insider). Layer-conditional weighting lives in engine/v76-layer-conditional.js. Weight shifts are logged so you can audit why confidence changed on a single ticker.

14-asset-class profile (LS7 — v77-v95)

Each class has a profile (vol-scale, half-life, day-ceiling, market-days-per-year) plus class-specific factors:

Limitations

What this is NOT:

Known failure modes

Bias considerations

Eval results (Bible §15.112)

Tests
196/196
Brier (1-day)
awaiting
Brier (30-day)
awaiting
Last cal-check
2026-04-26

Calibration scorecard engine (v104) shipped 2026-04-26; populates Brier scores after 30 days of decision data accumulates. Per-factor reliability tracked in engine/calibrationLive.js.

Closed-loop feedback (Bible §14.5)

Versioning

VersionDateChange
v2.72026-04-2614-class profile + alerts wiring fix + decision-replay
v2.62026-04-25Layer-conditional LS6 + 14 per-asset modules
v2.52026-04-24Prescience integration + playbook
v2.42026-04-22Factor extension v33-v45

Source

engine/factors.js, engine/orchestrator.js, engine/regime.js, engine/v76-layer-conditional.js, engine/v77-v95-*.js (per-asset modules)

Reviewed: 2026-04-26 · Next: 2026-07-26 · Per Bible §15.61