Pairwise correlation predicts composition before you run it
what you'll learn · Why the pairwise per-seed correlation matrix is a stronger predictor of composite stack-vs-interfere outcome than the headline mean Sharpe, and how to read the matrix.
Closes the loop on the session-summary note's `pairwise correlation across the 19 arms` follow-up. The matrix shows ts_momentum and three_clock_momentum at +0.34 correlation across 10 seeds — different signals — and three_clock_momentum and blackout at +0.93 — same signal in different framings. The empirical correlation tells you whether composing two arms will stack OR interfere, before you've built the composite arm.
The session-summary note named “pairwise correlation across the 19 arms” as an open follow-up:
Which arms are catching the same signal vs. different signals?
PR #708 shipped a --pairwise flag on the analysis script. Run
on a 10-seed CSV at --fomc-drift-bps 50:
── pairwise correlation (top 6 arms, 10 seeds) ──
three_ three_ ts_mom vol_we vol_re blacko
three_clock_momentum +1.00 +0.78 +0.34 +0.79 +0.55 +0.93
three_clock_vol_regime +1.00 +0.11 +0.53 +0.78 +0.64
ts_momentum +1.00 +0.72 +0.27 +0.57
vol_weighted +1.00 +0.63 +0.93
vol_regime_filter +1.00 +0.58
blackout +1.00
Three findings worth naming:
Finding 1: ts_momentum is uncorrelated with three_clock_momentum (+0.34)
Both are “momentum” strategies. The catalog puts them in different rows of the score-axis table (one cross-sectional with threshold, one composite-horizon cross-sectional). The +0.34 correlation confirms what the catalog text already names: they’re catching different signals, not the same signal in different framings.
This was the empirical evidence PR #557’s “strategy shape beats factor count” claim needed. Different shape → different per-seed sharpe sequence → different mechanism. The previous evidence was the headline number; this is the seed-by-seed evidence.
Finding 2: three_clock_vol_regime is anti-correlated with most arms
The composite arm (three_clock_vol_regime) shows the lowest
correlations in the matrix:
- vs ts_momentum: +0.11 (effectively zero)
- vs three_clock_momentum: +0.78 (high, but lower than parent pairs)
- vs blackout: +0.64 (much lower than blackout vs three_clock_momentum’s +0.93)
The composite’s low correlation with ts_momentum is the same
shape evidence as Finding 1, but it ALSO confirms the
dual-signal note’s prediction: composites that stack on
dual-signal data look uncorrelated to other arms BECAUSE they’re
catching different signals than the parents — that’s literally
what “catching the second alpha source” means.
The composite-interferes result on single-signal data appears in this matrix as the composite’s correlation with its constituent parents — high (+0.78 vs three_clock, +0.78 vs vol_regime). On dual-signal data the composite breaks correlation with both parents because it picks up the second signal neither parent catches.
Finding 3: three_clock_momentum vs blackout = +0.93 (twins)
The highest correlation in the matrix. Both arms are
single-factor cross-sectional momentum at the 20-bar lookback;
the only difference is blackout flattens around FOMC events.
On data where the events are rare (--fomc-drift-bps 50 has 7
events over 200 days = 3.5% of bars), the blackout window’s
effect on the seed-by-seed sequence is small. Hence the +0.93.
Implication: composing three_clock_momentum + blackout on
this data would interfere — the matrix tells us so before we
build the composite arm. The high correlation says “you can’t
double-count alpha you’re already catching.”
The discipline rule
Pairwise correlation is a cheap PRE-test for composition:
| Correlation between A and B | Composing A and B will… |
|---|---|
| > 0.8 | Almost certainly interfere |
| 0.5 – 0.8 | Marginally stack or be flat |
| 0.3 – 0.5 | Decent chance of stacking |
| < 0.3 | Stack — different mechanisms |
The harness’s composite arm is the measurement of stack-vs- interfere. The correlation matrix is the prediction — cheap to compute, runs against the existing CSV, no new strategy class required.
When considering a composite arm, look at the parents’ pairwise correlation first. If > 0.8, save the work — the composite will almost certainly interfere on this data. If < 0.3, run it — there’s likely a stack waiting.
What this rules out
-
Not a claim that real markets work this way. On a 10-seed synthetic, the correlations are subject to substantial noise. At N=20 or N=100 seeds the matrix tightens; the qualitative ordering (ts_momentum is decorrelated, blackout is correlated with three_clock_momentum, composites have unique correlation patterns) should hold but the specific values will move.
-
Not a substitute for the composite arm. The matrix predicts the direction (stack vs interfere) but not the magnitude or the specific shape (mean lift, stdev change, min Sharpe). For deployment decisions, run the composite arm.
-
Not generalisable to non-synthetic data without caveats. Real-market correlations vary by regime — pairs that were uncorrelated in normal times can correlate during crisis. The synthetic correlation is one snapshot under one data-generation assumption.
The next question
Pairwise correlation tells you whether two arms catch the same signal. It doesn’t tell you which ARMS are catching which SIGNAL. A future analysis could:
- Run the correlation matrix on single-signal vs dual-signal data. Differences reveal which arms catch which alpha source.
- Compute the per-arm “signal share” via PCA on the per-seed matrix. Naming what each arm is doing.
- Identify the catalog’s redundancy — pairs of arms with ≥ 0.95 correlation, where one is keeping the other from composing usefully with anything.
Three follow-ups for future sessions; out of scope here.
Closing
The pairwise correlation matrix is the cheapest test the harness
exposes. It’s already there once --save-csv runs; the analysis
script reads the same data. Operators considering a composite
arm should look at the matrix BEFORE adding code — the empirical
correlation often says “this won’t help” before any tests run.