Attack item R-1 ยท 2026-07-29 ยท harness
harness/xi_tie_jitter_scaling.py ยท 400 tie-break draws per configuration
ฮพ is a randomized estimator whenever X has ties โ the rearrangement of tied X values is drawn uniformly at random, so calling ฮพ twice on identical data returns different numbers. The research measured sd = 0.0080 at n = 2,000 with a 30.9% tie rate. The cascade's ฮพ PASS line sits at 0.50, justified in-code as "just above certified-orthogonal ceiling 0.494" โ so the PASS moat is 0.006 wide, and 0.0080 would be 1.33ร that.
But 2,000 is not the cascade's n. It feeds ฮพ strided value rows: 80,000 bars, WIN=200, STRIDE=20 โ 3,990. Chatterjee says the randomisation "can be ignored if n is large." Is 3,990 large enough? Research gap #992 calls this "the single most important untested question".
Scaling 0.0080 from n=2,000 to n=3,990 at nโยฝ gives โ0.0057 โ just under the moat with essentially no margin. That was wrong by about 2ร, and the reason is instructive.
tie_f exponent b Rยฒ reading 0.100 -0.465 0.984 ordinary sampling error 0.309 -0.493 0.993 ordinary sampling error 0.500 -0.521 0.997 ordinary sampling error
The tie-break jitter is ordinary sampling error, nโยฝ, Rยฒ 0.98โ0.997. Chatterjee's "ignorable if n is large" is empirically confirmed for this estimator โ the question is only whether 3,990 counts as large relative to the margin being adjudicated.
Jitter depends on where ฮพ sits. Near the null it is roughly twice as large as near the line:
| n = 2,000, tie 0.309 | sd | vs the research's 0.0080 |
|---|---|---|
| near-null arm (ฮพ โ 0.01) | 0.00782 | reproduces it |
| near-line arm (ฮพ โ 0.49) | 0.00348 | less than half |
So the research's 0.0080 was a near-null measurement, independently reproduced here to within 2%. I scaled it as though it applied at the line, which is the regime that actually decides verdicts. Correcting that halves the number.
The real-data arm settled this. Running the committed BTCUSDT bar-close fixture through the probe's own value-row construction:
fixture BTCUSDT-bars-close-sample-10k.csv: 10000 closes -> 490 value rows (WIN=200, STRIDE=20) tie_f=0.000 xi=0.1890 sd=0.00000 spread=0.00000 <-- continuous kernel: ZERO jitter tie_f=0.308 xi=0.1846 sd=0.01151 spread=0.07712
A continuous derived series has no X-ties, so ฮพ is exactly deterministic โ zero jitter, not small jitter. The 30.9% tie rate lives in the raw close series; a rolling-window statistic over it is continuous. So the exposure is not a property of the cell at all. It is a property of the kernel.
Which kernels are exposed? Ones whose output lands on a lattice. A kernel returning a rate over
a WIN=200 window can take at most 201 values, so across 3,990 value rows its tie fraction is โ0.95 by
construction. categorical_recurrence_rate_close_ties is exactly such a kernel โ and it is
exactly the candidate sitting at 0.4992. That arm was added after the fixture result, because
nothing swept beforehand reached that tie fraction:
n levels tie_f xi_mean sd spread sd/moat sd/margin 2000 201 0.899 0.4931 0.00648 0.04185 1.08 8.1 3990 201 0.950 0.4921 0.00436 0.02691 0.73 5.4 8000 201 0.975 0.4841 0.00339 0.02098 0.56 4.2
| Question | Answer |
|---|---|
| Is the jitter under the 0.006 moat at n = 3,990? | yes โ 0.00171โ0.00295 for continuous-ish kernels (0.28โ0.49ร moat), and 0.00436 (0.73ร moat) in the realistic worst case of a rate-valued kernel. The moat is ~1.4 ฯ wide. |
| Is the 0.0008 reported margin resolvable? | no โ that margin is 0.18 ฯ of the jitter (5.4ร smaller than one sd). A re-run with a different seed can flip it either way. |
So categorical_recurrence_rate_close_ties's 0.4992-vs-0.50 verdict is seed noise,
confirmed at the cascade's own n and with the tie structure its own kernel produces. But the band
placement itself is not in danger from jitter.
R-2 (de-randomise by averaging over rearrangements) is still required, and now narrowly scoped: it matters only for lattice-valued kernels adjudicated near a line. Continuous kernels need nothing โ their jitter is identically zero. That is a much cheaper fix than "average everything", and it is the scope R-2 should adopt.
"Alternatively, one can consider taking the average of ฮพโ over all possible increasing rearrangements of the Xแตข's."
โ arXiv:1909.10140, remark (8)
categorical_recurrence_rate_close_ties actually lands on exactly that lattice is inferred
from its definition, not measured.Evidence: harness/xi_tie_jitter_scaling_evidence.json (39 configurations).
Reproduce: VIRTUAL_ENV="" uv run --python 3.13 --no-project --with numpy --with pandas python3
harness/xi_tie_jitter_scaling.py