Skip to content

bug(valuation): NVR DQIC ceiling false positive — /stock/NVR renders empty fair price #289

@dackclup

Description

@dackclup

Finding

stock-detail-auditor audit on cron run #69 (commit 27361047, 2026-05-28) flagged NVR as a false-positive valuation_output_anomalous case:

stocks/NVR.json:
  current_price: $6,098
  eps_diluted: $458.86
  net_income: $1,237M
  shares_outstanding: 2.70M
  pe_ratio_ttm: 13.3
  risk_flags: []          # NO actual data corruption signal
  valuation_warnings: ["valuation_output_anomalous"]
  fair_price.median: null
  fair_price.methods: [all 6 methods blocked, reason = "valuation_output_anomalous"]

NVR has legitimately high per-share earnings ($458 EPS) and stock price ($6,098) — it's a low-share-count homebuilder, not a XBRL parse error or units bug.

Root cause

compute/valuation/ensemble.py::_has_corrupt_input (called from Site-2 at _data_quality_corrupt_result) fires when ANY of the 6 valuation methods produces an output > FAIR_PRICE_DATA_QUALITY_CEILING (compute/config.py:128):

FAIR_PRICE_DATA_QUALITY_CEILING: Final[float] = 10000.0

For NVR:

  • multiples_pe = sector_PE × EPS = 22× × $458.86 = ~$10,094
  • Exceeds $10,000 ceiling by < 1%
  • ALL 6 methods then blocked with reason: valuation_output_anomalous
  • fair_price.median = null/stock/NVR renders empty fair price section

Why the ceiling is too low

The $10K ceiling was originally designed to catch upstream ingestion bugs (e.g., shares_outstanding returned in millions instead of full units, producing per-share metrics 10⁶× too high). It assumed no legitimate per-share fair-value estimate would exceed $10K.

That assumption breaks for genuinely low-share-count tickers:

  • NVR (~2.7M shares, $6,098 price) — already over $10K when sector PE applied
  • BRK-B (~2.2B shares but Berkshire's Class A BRK-A at $700K+ would be 70× over) — though BRK-A isn't in S&P 500 universe
  • Any future low-share-count growth stock entering the S&P 500

The current ceiling fires on outputs that exceed $10K, not on inputs that are clearly corrupt. A $458 EPS isn't a corruption signature — but the multiplied output trips the guard.

Recommended fix paths (methodology-scientist verdict required)

Option A: Raise the ceiling to $50K (lazy fix)

FAIR_PRICE_DATA_QUALITY_CEILING: Final[float] = 50000.0

Covers NVR + a 5× safety margin against the next legitimate high-priced ticker. The ceiling remains as a coarse upstream-bug catch.

Option B: Make it relative to current_price (semantic fix)

FAIR_PRICE_DATA_QUALITY_CEILING_RATIO: Final[float] = 5.0  # output / current_price
# Fires if fair_price > 5× current_price, regardless of absolute level

This is the original "$10K vs typical $50-500 price" intent expressed as a ratio. NVR's $10,094 / $6,098 = 1.66× is well within a 5× ratio. APP's $34 against $568 = 0.06× — but the existing extreme-method bands already catch that case.

Option C: Split into input vs output ceilings (most rigorous)

  • Input ceiling on revenue / shares, book_value / shares (catches the millions-vs-full-units bug at the source)
  • Output ceiling removed (let extreme_*_estimate annotates do their job)
  • Site-2 emission becomes input-derived only — Site-1 already covers this

Acceptance criteria (any fix)

  • NVR fair-price section renders on /stock/NVR
  • fair_price.median is non-null for NVR
  • Legitimate upstream-bug cases (shares in millions vs full units, $458K/share trivially) still trip the guard
  • methodology-scientist Mode B verdict approves the chosen path against Damodaran 2019 + Penman 2013 principles

Impact (display-only, not a scoring regression)

  • Composite scores / rankings UNAFFECTED — NVR composite score = 55.78, rank computed correctly (no veto)
  • Rule 16 invariant UNAFFECTED
  • /stock/NVR UI displays empty fair price — users see no Fair Price card content, no MoS estimate
  • extreme_estimate_majority annotate also fires (5 of 6 methods triggered the per-method extreme guard before Site-2 fired) — so even if Site-2 ceiling is fixed, NVR may still show all-method-extreme warnings

Spawn target

methodology-scientist (opus) — academic verdict on Option A vs B vs C. Cite Damodaran 2019 Investment Valuation 3rd ed. on appropriate fair-value upper bounds + Huber 1981 §1.4 on robust estimators (the per-method extreme bands are already doing the Huber breakdown protection — Site-2 doesn't need to repeat it).

References

cc related: issue #130 (Q3 2026-08-19 cohort audit — could fold NVR ceiling decision in)

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions