The full pairwise matrix — 28 arms at N=100
what you'll learn · What the full 28-arm pairwise correlation matrix shows: the dormancy clusters that group with baseline, the diagnostic-arm anti-correlations, and the three lowest-correlation pairs the matrix flags as composite candidates.
The pairwise rule has been the session's most-iterated discipline. This is the full correlation matrix across all 28 arms at N=100 single-signal — the empirical surface the rule operates on. Surfaces six observations: complete dormancy clusters, sign-flipped diagnostics, the lowest-correlation pair, and three composite candidates the matrix predicts.
The pairwise correlation rule iterated four times this session (PR #710 → #742 → #748 → #770). It’s been the session’s most- refined discipline. The complete empirical surface it operates on — the full 28-arm pairwise correlation matrix at N=100 — has been computed in pieces across the research notes. This note ships the complete matrix and reads it in detail.
Six observations from the matrix
Observation 1: Three high-correlation clusters
Several arms correlate at +0.95+ across seeds — effectively duplicates on this synthetic:
baseline ≈ spread_filter ≈ blackout ≈ damping ≈ ranked_vol_threshold
(5 arms all clustered at +0.95-1.00 with baseline)
three_clock_momentum ≈ three_clock_portfolio_vol ≈ three_clock_vol_weighted
(3 arms all at +0.96+ with each other)
long_only ≡ equal_risk_long_only
(1.00 — identical with different gross_leverage scaling)
drift ≡ reversal-flipped
(-1.00 — perfect anti-correlation; reversal is sign-flipped drift)
These confirm the catalog’s synthetic-equivalence section: many arms catch the same signal on this single-signal synthetic. Real-data should separate them.
Observation 2: ts_momentum is the most-decorrelated leader
ts_momentum (the harness leader at +0.995) is uniquely
decorrelated from the rest:
ts_momentum vs baseline: +0.79 (high, but not 1.00)
ts_momentum vs three_clock_momentum: +0.69
ts_momentum vs vol_weighted: +0.78
ts_momentum vs ma_crossover: +0.62 (lower-mid)
ts_momentum vs ts_active_set: +0.90 (high — both filter on |return| >2%)
Its highest correlation (other than active_set) is +0.79 with baseline — meaning at the leader level, ts_momentum is doing something different from baseline that drives its +0.13 lead.
Observation 3: Multi-factor arms are negative-correlation outliers
All four multi-factor arms (two/three/four_factor + four_factor_tuned) correlate NEGATIVELY with most other arms:
four_factor_tuned vs baseline: -0.66
four_factor vs three_clock: -0.50
three_factor vs ts_momentum: -0.65
two_factor vs vol_weighted: -0.62
The default mean-reversion-dominant weights make these arms trade against the momentum-dominant data signal. Their per-seed sharpe sequence is anti-correlated with everyone else’s because their decision direction is anti-correlated.
Observation 4: The mean_revert diagnostic is anti-correlated with momentum arms
mean_revert vs baseline: -0.49
mean_revert vs three_clock: -0.30
mean_revert vs vol_weighted: -0.42
Confirms the diagnostic property: mean_revert is the sign-flipped version of cross-sectional momentum. When momentum arms lose seeds, mean_revert wins them. Used as a diagnostic for whether data has momentum vs mean-reversion alpha.
Observation 5: The three lowest-correlation pairs (highest stack potential)
The matrix’s lowest non-trivial off-diagonal correlations:
ma_crossover vs vol_penalty: +0.12
ma_crossover vs drift: +0.65 (false-low — both directional)
ts_momentum vs vol_penalty: -0.03 (effectively zero)
ts_momentum vs ma_crossover: +0.62
The truly-low pairs:
ma_crossover × vol_penaltyat +0.12 — both are weak single arms (+0.742 and +0.083 at N=100). Composing two weak arms doesn’t yield a strong arm.ts_momentum × vol_penaltyat -0.03 — ts_momentum is strong (+0.995) and uncorrelated with vol_penalty. The composite COULD stack. But vol_penalty is a per-symbol filter; ts_momentum is sign-based. Composition shape matters per PR #770.
Observation 6: The pairwise rule’s predictions are catalog-shaped
If we threshold the matrix at correlation < 0.5 for stack candidates AND same-stage AND no sign-vs-rank conflict, the matrix flags maybe 6-8 candidate composites. Most of the high-stack-probability arms involve multi-factor or mean_revert (negatively-correlated arms that catch different signals).
The catalog already includes 6 composite arms. The matrix suggests at least 3 more would be testable:
ts_momentum × four_factor_tuned(corr -0.59) — but sign-vs-rank conflict applies. Would need a SAME-stage composition mechanism (both at score-stage). Possible.vol_weighted × mean_revert(corr -0.42) — both score-stage, both score-rank-based, no sign conflict. Predicted to stack on dual-signal.three_clock_momentum × mean_revert(corr -0.30) — same shape as #2 but with multi-horizon score.
All three remain out-of-scope follow-ups.
What this rules out
-
Not “the catalog is complete.” Three candidate composites remain untested. The matrix flags them; the harness can measure them; future operators can ship them.
-
Not “the rule has converged.” Each new strategy adds a new row to the matrix, and the matrix may reveal new edge-cases the rule iteration didn’t capture. The rule is open to a 5th iteration if a future composite confounds it.
-
Not “real markets work like this.” The matrix is a synthetic-data snapshot. Real markets have different correlation structure; the relative rankings would change.
The closing observation
The pairwise rule has been the session’s most-load-bearing discipline. Each iteration was triggered by a composite result. The matrix is the rule’s empirical surface — the territory the rule navigates.
Now that the catalog is at 25 strategies (28 arms), the matrix fills out enough that operators can use it as a composite-shopping tool: scan for low-correlation pairs, check the sign-discipline + same-stage requirements, build the composite that the rule predicts stack.
The session has produced the platform. The next operator picks where to point it.