The 2.3 Independent Bets Were a Measurement Artifact - and Fixing Breadth Changed Nothing
Our own idea map said the binding constraint on a 12-spread market-neutral portfolio was effective breadth: 12 alt/BTC spreads amounting to only 2.30 independent bets. We set out to measure that number properly with PCA, then raise it. Both halves worked. The portfolio did not improve, and the original number turned out to be measuring something other than breadth.
Preregistered as hyp_1787735069662_0 before any backtest ran. Verdict: REJECTED.
Sample, stated up front
- 12 alt/BTC 1h ratio spreads: ETH, SOL, XRP, ADA, LTC, DOGE, LINK, DOT, BCH, ETC, AVAX, ATOM
- Window 2020-11-28 → 2026-07-10, the common span where all 12 exist — 49,186 hourly bars per spread, 2,051 daily / 69 monthly / 7 annual independent observations
- The corpus ends 2026-07-10, 47 days before this run. Nothing after that date is tested.
- 5,019 trades (baseline arm) and 3,625 (residual arm) across the 12 sleeves
- Cost on every net number: commission 0.00088088 per side (two legs × 4.404 bps), slippage 0.0002 per fill,
next_openexecution, synthetic TP/SL layer off,position_size0.15
Because the construction is dollar-neutral, its benchmark is cash, not an asset.
The method, adapted
We took the analysis from the Quant Guild Library's Analyzing Stock Returns with Principal Component Analysis in Python: correlation matrix, standardized PCA, cumulative explained variance, loadings read as a market factor, and a rolling-window PCA showing the factors are not stationary. Its practical conclusion is that PCA separates systematic from idiosyncratic risk. We pointed it at the spread panel instead of a stock panel.
PC1 explains 42.6% of the variance, with positive loadings on all 12 spreads (0.196 DOGE to 0.341 LINK) — a clean alt-season factor. PC2 through PC12 are a flat tail of 3.4%–7.9% each. Rolling 720-bar PCA over 2,057 refits puts PC1's share between 31.3% and 74.4% (median 46.1%): strongly non-stationary, exactly as the notebook warns.
That flat eigenvalue tail is the first clue. On the same 12×12 matrix:
| estimator | value |
|---|---|
| participation ratio (Σλ)²/Σλ² | 4.679 |
| n / (1 + (n−1)ρ) | 2.383 |
The intervention
We built a strictly causal residual: rolling PCA fitted on bars [t−720, t) only, refit every 24 bars, loadings and standardization applied forward. Removing the PC1 projection turned a panel with average pairwise correlation +0.3668 into one with −0.0763.
Then a deliberately minimal change: use the residual only for the signal, and keep trading the same two-leg spread, so the cost floor does not rise. Hedging PC1 out in position space would add legs and put cost back up — which is the trap this whole line of work keeps falling into. The rule is otherwise identical to the parent card's: long when 168-bar momentum exceeds 5% and the z-score exceeds 1, mirror short, exit inside ±0.5 z, 336-bar max hold, 20% take-profit, 10% stop.
Results, gross and cost separated
| baseline momentum | PC1-residual momentum | |
|---|---|---|
| trades | 5,019 | 3,625 |
| gross portfolio return | +18.79% (+3.12%/yr) | +13.69% (+2.31%/yr) |
| cost | −14.77 pp = 78.6% of gross | −10.34 pp = 75.5% of gross |
| net portfolio return | +4.02% (+0.70%/yr) | +3.35% (+0.59%/yr) |
| net Sharpe | 0.198 | 0.264 |
| max drawdown | −8.72% | −4.87% |
| ex-2021 annualised | −0.79%/yr | +0.03%/yr |
| years positive | 3/7 | 4/7 |
| BTC yearly correlation | +0.166 | −0.464 |
| breakeven commission | 11.95 bps/side (1.36×) | 12.42 bps/side (1.41×) |
| N_eff, daily (2,051 obs) | 9.506 (ρ +0.133) | 11.519 (ρ −0.003) |
| N_eff, monthly (69 obs) | 8.057 | 8.721 |
| N_eff, annual (7 obs) | 2.914 | 4.018 |
The preregistered falsification condition
| test | measured | threshold | ||
|---|---|---|---|---|
| F1 | N_eff(residual) | 11.519 | ≥ 5.0 | PASS |
| F2 | N_eff gain vs baseline | +2.013 | ≥ +2.0 | PASS (by 0.013) |
| F3 | portfolio breakeven commission | 12.422 bps | ≥ 13.2 bps | FAIL |
Any one failing rejects. Walk-forward and Monte Carlo agree independently: the residual arm's median walk-forward efficiency is 0.470 against a 0.5 gate, 51 of 120 out-of-sample windows are positive, and 0 of 12 spreads have a Monte Carlo 5th-percentile return above zero (median p5 −26.6%, 2,000 bootstrap iterations per spread). The residual arm beats the baseline on every one of those axes — baseline WFE −0.195, 46/120 windows, p5 median −38.1% — and still clears none of them.
Why the rejection is the interesting part
The 2.30 reproduces exactly, and it is not a breadth number. On the parent session's own per-year results, the 8-year × 12-spread annual return matrix gives ρ = +0.3833, the equicorrelation formula 2.301, and the participation ratio 2.303. The two estimators agree, so the estimator was never the problem. The horizon was.
A participation ratio computed from T observations of N series is biased down when T is not much larger than N. For 12 series that are independent by construction:
| observations | median PR | p5 | p95 | truth |
|---|---|---|---|---|
| 7 (annual) | 4.273 | 3.644 | 4.855 | 12 |
| 8 | 4.712 | 4.031 | 5.334 | 12 |
| 24 | 8.144 | 12 | ||
| 69 (monthly) | 10.343 | 9.910 | 10.712 | 12 |
| 2,051 (daily) | 11.936 | 11.916 | 11.954 | 12 |
So 2.30 must be read against a ~4.3 null, not against 12. And this run supplies the direct proof: our residual arm is essentially independent at daily frequency (ρ = −0.003, PR 11.52 against a null median of 11.94), yet the same twelve series read at annual frequency measure PR 4.02 — statistically indistinguishable from the independence null. The annual estimator cannot tell "independent" from "2.3 bets".
At the frequency these strategies actually take risk, the baseline sleeves already had 9.51 effective bets. There is a real effect underneath — 2.30 sits below the 4.27 null, so the sleeves genuinely do share an annual regime — but that is regime dependence, and adding spreads does not fix it.
Breadth was not the binding constraint. We pushed daily breadth from 9.51 to 11.52, essentially the ceiling, and the portfolio moved from +0.70%/yr to +0.59%/yr. Cost still ate 76–79% of gross edge in both arms. Gross edge of 2.3–3.1%/yr cannot pay a ~21.6 bps round trip however many independent ways you slice it.
The residual signal cut turnover without selecting for profit. Trades removed: 27.8%. Gross edge removed: 27.1%. Almost exactly proportional. A filter that cuts turnover only helps if it cuts the unprofitable trades; this one is edge-neutral rather than edge-destroying, which is better than most filters we have tested, and still not selective.
The four screens
- Return — reported, never ranked on: +3.35% total, +0.59%/yr net over 5.61 years.
- Breakeven fee — 12.42 bps/side against 8.808 bps of cost is a 1.41× margin, under the 1.5× bar set in advance. Fails marginally. It clears the raw cost; the failure is thin headroom. 3.6 bps does not survive ±2 bps of slippage variation across four fills per round trip.
- Beats buy-and-hold — against cash, +0.59%/yr clears. Against BTC over the identical window (+26.58%/yr, unlevered daily Sharpe 0.69, max drawdown −76.6%) it does not.
- Market correlation, most years positive — BTC yearly correlation −0.464, so neutrality holds. 4/7 years positive = 57%, under the 60% bar. Fails on the regime half.
How this relates to what we have already published
- Sharpe 10.73, Still Untradeable found a 16-altcoin market-neutral portfolio with enormous gross Sharpe whose turnover cost was 26.6× its alpha. This result is the opposite shape and the same conclusion: modest gross edge, cost at 76–79% of it. There, breadth was added and cost still won. Here, breadth was measured and turned out never to have been short.
- The Momentum Mirage recorded weekly cross-sectional crypto momentum reversing from +106% to −43% out of sample — regime dependence killing a survivor. That is the same phenomenon our annual-horizon 2.30 was actually measuring, which is why we now separate "regime dependence" from "breadth" rather than quoting one number for both.
- Why Profitable Patterns Can Still Fail the Baseline established the buy-and-hold screen this result is measured against. Note that a dollar-neutral construction is benchmarked against cash, not BTC, so screen 3 is applied both ways above.
- Surviving Market Friction narrates the project's move toward zero-correlation ensembles. This result corrects one number in that narrative: the ensemble was already far more diversified than we had recorded.
Nothing here contradicts those results. It corrects a diagnostic we had recorded about our own portfolio.
Two engine notes
The next_open bracket defect is fixed. Our working notes warned that on engine 0.2.9, next_open desynchronised the shadow simulation and left ~49% of trades without a take-profit or stop-loss. On 0.2.17 the same rule and data give identical trade counts under current_close and next_open (245 / 245), with synthetic_brackets_applied at 0.0 across all 24 primary runs. Every figure above used next_open.
A separate phantom re-entry defect was audited, not assumed away. Our notes record a different bug from the one above: under next_open, a stale latched directional state can reopen a position for exactly one bar right after a take-profit or stop-loss exit, with the entry condition false. We checked rather than hoped. Across all 8,644 trades in both arms, 11 matched the shape — one bar long, immediately following a bracket exit — and 0 were genuine: the entry condition was true on both the decision bar and the open bar in every case. That is reassuring for these numbers, not proof of a fix; only 7% of trades here exit on a bracket at all, so the defect had little opportunity to appear.
daily_returns[].return_pct is a fraction, not a percent. Compounding the raw values reproduces the engine's own total_return (49.83% vs 49.79% on SOL/BTC). Dividing by 100 understates every portfolio figure by 100×. We hit this and caught it by cross-checking against total_return; anyone aggregating sleeves into a portfolio should do the same check.
Limitations
- The corpus ends 2026-07-10, 47 days before this run. Nothing after that date is tested.
- The window starts 2020-11-28, not 2019-10, because the panel PCA needs all 12 spreads to exist simultaneously. The parent card's 6.7-year figures are on a longer, unbalanced window and are not directly comparable; the baseline arm was re-run on this window so the two arms are comparable to each other.
- The ratio datasets set high/low to the open–close envelope, because a ratio's true intrabar range cannot be recovered from two OHLC series. Take-profit and stop-loss therefore effectively trigger on closes. Exits here are signal-driven plus max hold, so this bites little, but the brackets are optimistic in principle.
- One rule, one parameterisation, one PCA window (720 bars, refit every 24). No sweep was run — the result turns on cost arithmetic, not on parameters, and a sweep would need its own multiple-testing correction.
- F2 passed by 0.013. Nothing rests on it, since F3 decides the verdict, but it is not a comfortable margin.
- The 12 alts are the parent card's fetched set. It deliberately includes losers — 10 of 12 spreads fell over the sample — but it is not a survivorship-controlled universe draw.
- With 7 annual observations, no annual-horizon statement in this article is separable from noise on its own. The daily and monthly numbers carry the weight.
What would reopen this
- A construction with ≥3× the gross edge per sleeve — portfolio gross above roughly 9%/yr rather than 2–3%/yr. Breadth becomes the limiting term again only once cost is covered.
- Maker-only execution taking the two-leg cost from 8.808 to about 3 bps/side, which would turn the residual arm's 1.41× margin into roughly 4×. The residual construction is a better candidate for that test than the baseline, because it has the lower drawdown and the higher walk-forward efficiency.
- A corpus extended past 2026-07-10 that changes the sign of 2025 (−0.62%) or 2026 (+0.41%).
Research lineage
Where this result came from
Stored hypotheses, reports, sources, contradictions, and the next registered experiment.
Hypotheses
Parent / child hypotheses
Reports
Academic sources
Negative findings
Related / contradicting studies
No related published study
Next experiment
No next experiment is stored.
Comments (0)