factor · Quality

Quality factor — explained

Quality picks companies whose unit economics are durable: high gross profit per dollar of assets, conservative accounting, low leverage. The bet is simple — businesses that already make money efficiently keep doing it longer than the market expects.

Where this comes from

Academic anchor

Novy-Marx 2013 — The Other Side of Value
Demonstrates that gross profitability (revenue − COGS, scaled by total assets) is as powerful a return predictor as book-to-market. Quality firms in the top decile earned ~5% annual excess return over decades of US data, and the premium does not collapse after publication. We pair this with Piotroski 2000's F-score, which screens balance-sheet quality across nine binary tests.
Plain English

What it actually measures

Imagine two restaurants on the same street, both profitable. One spends 60% of revenue on food costs; the other spends 40%. Both grow 5% per year on paper, but one is a cash-printing machine and one is barely keeping up with rent. Quality factors look for this difference at scale — companies whose every dollar of revenue throws off more dollars of profit than peers, and whose balance sheets aren't propped up by debt or accruals. The academic finding is that the market chronically under-prices this durability.

No calibration constants

Math sketch

inputs   · gross profitability (Novy-Marx 2013)
         · multi-test fundamental health signal (Piotroski 2000)
         · leverage / financial-flexibility proxy
ideas    · profitability scaled by asset base
         · checklist score from balance sheet + cash flow + income tests
         · leverage component flipped so low debt reads bullish
         · weighted blend, then standardised across the universe
output   · cross-sectional standardised score

Three anchors so the factor doesn't collapse to a single accounting number. Composite weights, the exact lookback for each component, and the leverage transform are calibrated and proprietary. Public: the anchors (Novy-Marx 2013, Piotroski 2000), and that quality reads bullish-when-high like the rest of the engine.

Pipeline

How Framler implements it

The daily 06:00 UTC cron pulls the latest 10-K / 10-Q via SEC EDGAR XBRL, computes gross-profitability and Piotroski F-score per ticker, normalises across the universe, and stores the result in apex_factor_scores. The factor enters the composite score at the per-ticker scoring step, where it gets a regime-conditional weight (Quality dominates in risk-off / late-cycle regimes per Asness-Frazzini-Pedersen 2014).

One coherent posterior

How it composes with Framler

Quality is one of thirteen factors composing the 0–100 Framler score. Its weight is regime-conditional — heavier in risk-off, lighter in risk-on momentum regimes — and its signal interacts with Value (the Novy-Marx 2013 paper explicitly pairs them) and with Accruals (Sloan 1996). When all three fire bullish on the same ticker, the QUALITY COMPOUNDER confluence pattern triggers and applies a small upward delta with academic provenance.

Honest limitations

When it fails

Quality slows down in late-cycle melt-ups when low-quality momentum stocks get bid up faster than fundamentals warrant. Two structural failure modes: (a) book-value erosion — companies aggressively buying back stock can show artificially high gross-profit / asset ratios while their economic moat shrinks; (b) one-time charges — an asset writedown in the trailing four quarters can spike q_raw without representing a real improvement in unit economics. We mitigate (a) by trailing the metric over 8 quarters where data allows, but the failure mode is honest.

Pro depth

Engineering integration

How Quality flows through the production engine
Sign convention
Bullish-when-high. Universal across all 13 factor families — a high Quality score reads as a bullish lean, low as bearish, 50 as neutral. The composite inherits the convention unchanged.
Standardisation
Cross-sectional z-score per scoring day across the 1,000+-ticker universe, then mapped to 0-100. Tickers without sufficient input data surface as null and the composite skip-and-renormalise path takes over (Asness-Frazzini-Pedersen 2014).
Refresh cadence
Recomputed daily via the universe-scoring cron (production runs 06:00 UTC on weekdays via Vercel + GitHub Actions). Factor-specific upstream data refresh is described in the implementation section above.
Composite entry
Enters the Bayesian composite with a regime-conditional weight calibrated weekly by the calibrate-weights cron against accumulated forward-return data. Per-regime weight vectors are proprietary; the architecture is in the math sketch above.
Diagnostic surface
Live structural invariants on /coherence exercise the math stack on every request (factor correlation matrix, BOCPD posterior, Mondrian bin coverage). Coverage and IC accumulate weekly via the accuracy-check cron; the sector-honesty panel on /track-record publishes per-cohort calibration tiers.
Hidden by design
The exact factor weight, regime-conditional multipliers, and any constant inside the math sketch marked «calibrated and proprietary» stay private — that's the engineering moat. Everything above architecture-level is published; everything below stays in the engine.
Read next

Related factors

ValueMomentum

See Quality score on a real ticker

Every ticker page shows the per-factor decomposition. The Quality score is one of thirteen composing the 0–100 the composite score.

Try NVDA →Full methodologyMath coherence live
Quality factor explained | Framler