The break that cleared neither bar
Asked as: how do you know a detected regime change is real
A joint change-point detector flagged one break across twelve market channels, then tested it against two independent bars and cleared neither.
A joint change-point monitor in my own estate flagged one break across twelve market channels and told me which four series co-moved into it. It looked like a finding. Then the same artifact reported that the break cleared neither of the two bars set for it, and the more interesting of the two failures was in a direction I did not expect.
I call the shape a Surrogate Inversion: a detector firing fewer times on real data than on surrogates built to destroy the structure it detects. The null is not merely unbeaten — it is beaten backwards.
What the monitor watches
Twelve weekly channels, 201 observations each, on a trailing 52-week reference window:
- seven CFTC leveraged-fund net books — AUD, GBP, CAD, EUR, JPY, NZD, CHF
- three volatility paths — AUDUSD, NZDUSD, USDJPY
- one cointegration spread — AUDUSD against NZDUSD
- one triangular residual — AUDJPY
The question is not whether any single series moved. It is whether the joint vector broke — whether the channels stopped relating to each other the way they had been. A Hotelling statistic on each week against the trailing window measures that, with a Ledoit-Wolf shrunk covariance so the estimate stays stable when the channel count is large relative to the window.
The candidate
The CUSUM alarm on the Hotelling trace fired once, at 2024-03-19, and the per-channel decomposition named its co-movers with shares that sum to the break:
| channel | z | share of the statistic |
|---|---|---|
| COT AUD | −2.999 | 0.4038 |
| vol AUDUSD | −2.500 | 0.2044 |
| COT JPY | −2.204 | 0.1421 |
| COT EUR | −1.772 | 0.1078 |
That is a complete and plausible story: leveraged funds cutting an Antipodean book while the volatility path underneath it moved, with the yen and euro books following. It is exactly the sort of narrative that gets published.
Bar one — the control limit
The week’s own Hotelling statistic is 28.92. The control limit, set at the
0.999 quantile, is 33.07. The artifact records the comparison as a field
rather than leaving it to the reader: exceeds_ucl: false.
So the sustained-excursion alarm fired on a week whose single-week statistic does not clear the single-week bar. Those are two different questions — CUSUM asks whether an excursion persisted, the control limit asks whether any one week was extreme — and the honest reading is that one of them said maybe and the other said no.
Bar two — the rotation surrogate, and the inversion
The second bar is not parametric at all. Each channel is circularly rotated by its own random shift, which preserves that channel’s marginal distribution and its autocorrelation exactly while destroying the co-movement between channels. Then the change points are recounted. Two hundred times.
If joint breaks are a real feature of how these channels move together, the real data should produce more of them than the rotated data. The measurement:
- observed joint change points: 1
- surrogate mean: 1.365
- surrogate p: 1.0 — every one of the two hundred rotations produced at least as many as the real data
- resolution floor at this draw count: 0.004975, and the estimate is recorded as not saturated
The real series are not merely indistinguishable from independent channels on this statistic. They are quieter than independent channels.
What the inversion does not establish
I do not know why, and the artifact does not claim to. There is an obvious candidate — a reference window whose covariance is estimated from data that already contains the co-movement would absorb that co-movement into the baseline and lower the detector’s sensitivity to exactly the thing it is looking for — but that is a hypothesis about the mechanism, and this file contains no test of it. The measurement is the count and the direction. The explanation is owed and unpaid, and writing it as though it were established would be the error this whole discipline exists to prevent.
What the inversion does establish is a bound: until the direction is explained, the joint-break count on this panel cannot support a claim that the channels break together more than chance, because measured against chance they break together less.
The offline cross-check disagrees, and that is also published
PELT, run offline over the whole standardised matrix rather than online against a trailing window, segments the panel at three points: 2023-02-21, 2024-06-18 and 2025-12-09. None of them is the online alarm’s 2024-03-19.
Two segmentation methods disagreeing about where a panel breaks is ordinary and informative — one is causal and window-bound, the other sees the whole series at once — but it is the kind of disagreement that quietly disappears from a published chart. Both are in the file.
What is in the artifact
The full result publishes with the page, byte-identical to what the engine wrote, and its digest matches the sidecar the engine produced independently at publication:
51f803eec6bca57fb501c01fa63a691006137b851dc6b68f80cf3c4f9138e5f0
It carries the full Hotelling trace and its timestamps, the channel list, the control-limit and CUSUM parameters, the per-break attribution, the surrogate block with its method described in its own words, the content hash of every input consumed, the producing commit, and the registry revision in force.
It also carries what it could not read. Six inputs were opened and six headers were unreadable, so the tier, source and provenance fields all render UNDECLARED — unanimously, and the unanimity is itself a recorded field. No input declared a bar count, so the grid ceiling reads UNKNOWN rather than being inferred. That is a real gap in a real artifact, published as a gap.
Why this is the product working
A change-point monitor that reports a break is easy to build and impossible to audit. What makes this one worth running is that it carries two bars it can fail, publishes the arithmetic of failing both, records a cross-check that disagrees with its own headline, and names the provenance fields it could not resolve — and none of that required anyone to ask.
No edge is implied by anything on this page. A joint break is a structural co-movement event and an upper bound on opportunity, never a tradeable signal, and the artifact states that in its own banner before any number appears.
The artifact
SHA256: 51f803eec6bca57fb501c01fa63a691006137b851dc6b68f80cf3c4f9138e5f0
Download datasetClaims examined
Claim 01§ claim-55ca33e5
The detector flagged a change point, so the regime changed.
My own monitor flagged one joint change point across twelve channels, dated 2024-03-19, and named the four series that co-moved into it. Everything about that output reads like a finding. It is not one yet, and the artifact says so in two independent places. The week's own Hotelling statistic is 28.92 against a control limit of 33.07 set at the 0.999 quantile, so it does not clear the single-week bar. And the alarm count does not clear the surrogate bar either. A detection is the beginning of the question.
Claim 02§ claim-d055a066
It found nothing, so the instrument does not work.
The reverse is closer to true. A monitor with no measured null has one output — it finds things — and no reader can distinguish that from a monitor calibrated to find things. This one publishes the number it would have had to beat, the number it actually got, and the gap. The negative is the receipt that the positive would have meant something. That is also why the artifact carries no p-value-as-pass, no verdict and no graduation: those are separate bars in the same estate, and this layer is explicitly descriptive.
Claim 03§ claim-681911b2
Run more surrogates and it will cross.
Two hundred rotations put the test's resolution floor at 0.004975, and the artifact records that the estimate is not saturated — so the floor is not what is binding here. The binding fact is the direction. The observed count is 1 and the surrogate mean is 1.365: every one of the two hundred rotated surrogates produced at least as many joint change points as the real data. Adding draws measures that more precisely. It cannot move a statistic that is on the wrong side of the distribution to the right side of it.
Claim 04§ claim-591983d6
You published a receipt whose own provenance fields read UNDECLARED.
The objection is true, and the fact is in the file. The artifact reads six inputs and reports all six headers unreadable, so its tier, source and provenance fields all render UNDECLARED — unanimously, which is itself recorded. The grid block says the same thing about a different quantity: no input declared a bar count, so the grid ceiling is UNKNOWN rather than assumed. What the file does carry is the content hash of every input it consumed, the code commit that produced it, and the registry revision in force. Those are the checkable half, and the unreadable half is named rather than rounded away.
Each claim above has a permanent address — the § link — whose canonical home is the refutation index, where it carries its variant phrasings and the true proposition stated on its own feet; this article is the evidence behind it. If a claim's text ever changes, it becomes a new claim at a new address, and the old one stops resolving rather than silently meaning something else.
Explore further
Instruments
Research
- Does COT positioning predict reversals?Asked as:
does cot positioning predict reversals
- The floor that never firedAsked as:
how do you know a check that never fails is working
- The level that remembered nothingAsked as:
do price levels remember what happened there before