Skip to content

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.

MetricBefore z-scoreAfter z-score
shuffled_target Sharpe5.0 (FAIL)2.5 (still FAIL vs bound 1.0)
mean_pnl_mean0.00080.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:

  1. Real anti-edge in news-driven Indian large-caps (the sign-flip is consistent across this many independent attempts).
  2. 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.

OpenBracket v0.6 — methodology release-ready; v1 forecaster in active build.