Hi Van Weyenbergh,
Three of your four ceilings replicate here by an independent route, on the real-time
edition. I’ve been doing the same thing — measuring what can’t work rather than trying
things — and I have one ceiling you don’t, plus a phenomenon I haven’t seen described
anywhere that I think explains why both of us keep getting zeros.
Setup, so the numbers are comparable. 1,728 features, LightGBM, 12-config ensemble,
61.95 public. Everything below is n=10,000 out-of-fold, 5-fold, paired bootstrap over
series. Paired resolution is ±0.19; absolute resolution is ±0.95, which is why I only quote
paired differences.
1. Six measured defects, six near-zero returns.
This is the part I’d most like a second opinion on. Each defect was located, quantified, and
its worth predicted before a fix was built. Every fix returned approximately nothing.
| defect |
how it was measured |
predicted |
actual |
| null-estimation noise |
split-half: 20–23% of large-window feature variance at w≥320 is estimation error |
+1.4 |
+0.016 |
| ” (second, independent fix) |
same defect, Newey–West shrinkage instead of a simulated universal null |
+1.4 |
−0.20 (cloud) |
| reference-frame drift |
between-series sd 0.332 vs within-series 0.116; benign history→online drift of 0.307 exceeds the median break of 0.194 |
+0.75 |
+0.010 |
| window–elapsed mismatch |
optimal window marches 5→20→40→160 with elapsed, which is unobservable at inference |
+2.8 |
absorbed |
| window-ladder hole |
a single w=5 feature scores 53.44 at elapsed 1–5, beating the whole 1,728-feature bank’s 51.30 |
+2.14 in bucket |
+0.06 |
| the model’s own errors |
a recurrent net given the GBM score + its running max + deviation from running min, trained to correct it |
+0.4 |
+0.095 |
Four fail by absorption, two by weight share. The mechanism for the first four is that the
bank is enormously redundant:
eight features — one channel, one stream, eight window scales — reach 58.77 out-of-fold.
The full 1,728-feature bank reaches 61.51. The marginal value of the other 1,720 features
is +2.74, and the breadth buying it accounts for 31% of the model’s gain across elapsed
(+10.64 for the single channel against +15.35 for the bank). Same 5-fold protocol, same
series, same rows/rounds/leaves — I had an earlier version of this comparison that trained
the small arm on 1,300 series against a bank trained on 8,000, which entangled breadth with
training size and overstated the gap by 3.7 points.
So the span is already wide enough that a single corrected statistic very likely lies inside
it. That predicts the four zeros rather than explaining them afterwards.
The other two are different: the fix worked and landed where the metric wasn’t looking. The
ladder hole is real and repairable — but elapsed 1–5 is 2.9% of the weight, so the repair is
worth six hundredths of a point.
2. Your τ-oracle result, with a caveat on mine.
Mine came out at −1.33: an oracle handed the exact post-break window length, scoring six
moment statistics with segment length matched between positives and negatives, lost to the
model. But that comparison is confounded — six statistics with known τ against 1,728 features
without it conflates τ-knowledge with statistic richness. Your version is the cleaner test and
reaches the same conclusion, which I think strengthens both. Change-point localisation is
worth nothing here.
Related, and possibly useful: the optimal window tracks elapsed (5 → 20 → 40 → 160), and
elapsed is unobservable. But an oracle allowed to pick the elapsed-matched window still loses
to the full bank by 1.97 weighted. The bank routes around the mismatch.
3. A measurement artifact worth knowing if you’re fitting blend weights.
I caught myself choosing a scalar blend weight on the same data I was scoring it on, and it
cost 0.072. Same candidate: +0.215, CI [+0.007, +0.359], both halves positive, when the
weight was picked globally; +0.143, CI [−0.028, +0.344] once the weight was fitted only
on the half it wasn’t scored on. A t-adaptive version with four free parameters was worse
still (+0.067). I retracted the candidate.
Earlier I had one clear at +0.203 with CI [+0.007, +0.398] — the only thing in the project
that ever excluded zero — and I killed it after it flipped sign on disjoint halves
(+0.142 / −0.167). I’d previously “replicated” it at +0.092 by re-running with fresh folds
over the same series, which is worthless: the two estimates share their sampling noise.
Only disjoint samples test replication. Also worth noting the multiplicity — across ~30
candidates at SE≈0.10, the maximum under a global null sits near +0.20, which is exactly
where that one landed.
4. A fifth ceiling: the bank is data-limited, and its limit is below the top.
Training on random subsets, replicated across three independent draws (noise floor ±0.45):
1,000 series -> 59.06 5,000 -> 62.52
2,500 series -> 61.49 7,500 -> 63.20
Regressing on 1/√n gives AUC ≈ 65.6 − 206/√n, predicting the interior points to within
0.03 and 0.14. On a split that reads ~2.2 optimistic against proper cross-validation, that
puts this feature bank’s infinite-data ceiling around 64 in public-leaderboard terms —
below the current top. Not “we need more data”: with unlimited series this representation
still doesn’t get there.
That’s evidence for your closing reading rather than against it. The gap is a class of
information none of these ceilings cover.
5. The question.
You get 0.6263 with 119 features. I get 0.6195 with 1,728, and — importantly — on
substantially the same representation: my bank runs every channel over six parallel streams,
three AR residual orders (2/5/12), a GARCH(1,1)-standardised stream, a normal-score stream
(empirical CDF of the innovations), and raw. Per-series BIC selection of the AR order I tested
directly: −0.002. So the whitening isn’t the difference.
And it isn’t that my good features are buried: cutting my bank by gain importance hurts
monotonically — top-384 −0.09, top-192 −0.55, top-64 −1.34, top-32 −1.84. Every subset is
worse than the whole. So your 119 are not a subset of my 1,728; they’re a different
construction.
So: are your 119 per-(channel × stream × window) cells like mine — a statistic in a window,
quantile-scored against a historical null — or are they aggregated across scales? 119 is
roughly what you’d get by aggregating along an axis instead of enumerating it.
One sentence on that settles in a day what a week of guessing won’t.
Last thing: your +0.0007 across five capacity/model-class probes stopped me pushing a
16-model ensemble I had staged and ready — same family, and my own local estimate for it was
+0.03, already inside noise. It also brackets a diagonal state-space model I’d measured at
+0.143 and couldn’t distinguish from zero. Two dead ends closed by your post before I spent
the submissions, so thanks for writing it up.
Happy to share any of the above in more detail — the absorption table especially, since I
suspect it generalises past this competition.