- New: libs/backtest/xsmom_cache.py — disk cache for xsmom ranked-universe
per rebalance date; keyed by snapshot fingerprint + param hash; top_n is
NOT in key so v9.3.1 (top20) and v9.3.2c (top10) share one cache file
- libs/backtest/cross_sectional_momentum.py — add cache= param to
build_candidates(); hit path skips 900-symbol scan; miss path writes ranked
rows post-quality-gate to cache buffer
- libs/backtest/snapshot_store.py — expose snapshot_dir attribute; propagate
through slice_by_date_range() so runner always has the path
- apps/backtester/run.py — wire up XsmomRankCache per engine (lazy init,
flush after simulation loop); cache is no-op when snapshot_dir is None
- configs: add return_max_long_v9.3.2b_fc.json (SQS 93.5 champion,
ER days[2,8]); remove all other v9 sweep variants from .index.json
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>