v0.27 β Calibration honesty + dedup-by-set + 15 model retrains
2026-05-19
- π Calibration honesty fix. When the cron is stalled (prices don't move between snapshots),
pct_moveis exactly 0 for every card β which made BUY signals look like 0% win rate (price didn't go up) and HOLD signals look like 100% win rate (price stayed flat). Both artifacts of stale data, not real signal quality. Fix:learn_signal_outcomes.pyandbuild_past_picks_scoreboard.pynow skip exactly-zero pct_move outcomes (real markets never have $0.00 movement). Past picks BUY win rate jumped from misleading 0.7% to honest 91.7% on 48 real-movement samples. - π§ 15 model retrains. Weights now converged: liquidity +44%, hidden_alpha +14%, accessibility +13% (vs seed); scarcity -27%, momentum_rising -9%. Bayesian smoothing keeps the model stable between retrains.
- π Dedup fix.
auto_data_quality_check.pynow keys duplicate detection on (name, variant, set) instead of (name, variant). This fixes false-positives like "Charizard PSA 9" being flagged as a duplicate across Base 1st Ed vs Base Unlimited (those are different cards). False alerts dropped 12β7 (real dupes remain β Brandon should fix in workbook). - π¨ PPT name-match validation. PokemonPriceTracker auto-matched the WRONG product on 47 watchlist cards (M084 Mega Rayquaza ex SIR was showing N's Zoroark ex's $560 price; M087 Mega Charizard Y ex SIR was showing Fezandipiti ex's $270). Reconciler now compares
ppt.meta.card_nameagainst the watchlist name and rejects PPT entirely on mismatch. 47 cards corrected.