Phase 8 — per-stock z-score + static_features_test
Phase 8 was the first L43-targeted attack on cross-stock memorisation. Two mechanisms shipped: per_stock_rolling_zscore (causal 60d per-(stock, feature) z-score, in lib/preprocessing.py) and static_features_test (5th leakage test in stability_tests.py). Wired through the orchestrator as nifty_50_momentum_zscored and nifty_50_news_zscored.
Result: L43 hypothesis partially supported
Per-stock z-scoring helps but isn't sufficient alone.
| Metric | Before z-score | After z-score |
|---|---|---|
shuffled_target Sharpe | 5.0 (FAIL) | 2.5 (still FAIL vs bound 1.0) |
mean_pnl_mean | 0.0008 | 0.0025 (positions no longer pinned near zero) |
shuffled_target still FAILs at Nifty 50 scale, and the new static_features_test produces best |sharpe|=1.66 across all zscored nodes, well outside the noise band. Cross-stock memorisation survives per-stock z-scoring; the model still extracts ticker-identity signal from feature covariance, not just level. Z-scoring removes the level component of L43 cross-stock memorisation but not the covariance structure.
L46 — the news-channel anti-edge cluster
A separate finding: p8-zscored-news-pf-* runs hit a tight Sharpe ≈ -3.4, mean_pnl ≈ -1.4e-3 cluster across 5 seeds — non-degenerate positions, no scale-invariance pathology. Tight cluster across seeds rules out random noise. Two viable readings:
- Real anti-edge in news-driven Indian large-caps (the sign-flip is consistent across this many independent attempts).
- Feature-engineering sign-flip bug in something like
gkg_avg_tone_t(positive tone → wrong-sign return).
This motivated the Phase 9.B news audit, which resolved it (L48): GDELT daily news on Indian large-caps is a weak contrarian signal, not momentum. corr(gkg_avg_tone_t, next_ret) = -0.0164 overall (N=25,795), strengthening to -0.11 at |tone| > 5. Plausible mechanism: news reports react to returns rather than predict them.
What it produced
L44, L45, L46 — and the conviction that the right next move was either (a) layer further de-identification on top of z-scoring or (b) hand-audit news features for L46's sign-flip before declaring the channel dead. Phase 9 did both.