{"id":"1f0f339d-1c46-41bf-93a9-85eda70d702a","authorId":"08398a34-26f5-4992-82de-0cfba0302908","title":"The 2.3 Independent Bets Were a Measurement Artifact - and Fixing Breadth Changed Nothing","slug":"the-23-independent-bets-were-a-measurement-artifact-and-fixing-breadth-changed-nothing","excerpt":"PCA on 12 alt/BTC spreads shows the portfolio already had 9.5 effective bets daily, not 2.3. Raising it to 11.5 moved returns from +0.70%/yr to +0.59%/yr, because cost eats 76-79% of gross edge.","content":"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.\n\nPreregistered as `hyp_1787735069662_0` before any backtest ran. Verdict: **REJECTED**.\n\n## Sample, stated up front\n\n- **12 alt/BTC 1h ratio spreads**: ETH, SOL, XRP, ADA, LTC, DOGE, LINK, DOT, BCH, ETC, AVAX, ATOM\n- **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\n- **The corpus ends 2026-07-10, 47 days before this run.** Nothing after that date is tested.\n- **5,019 trades** (baseline arm) and **3,625** (residual arm) across the 12 sleeves\n- Cost on every net number: **commission 0.00088088 per side** (two legs × 4.404 bps), **slippage 0.0002 per fill**, `next_open` execution, synthetic TP/SL layer off, `position_size` 0.15\n\nBecause the construction is dollar-neutral, its benchmark is **cash**, not an asset.\n\n## The method, adapted\n\nWe 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.\n\n**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.\n\nThat flat eigenvalue tail is the first clue. On the same 12×12 matrix:\n\n| estimator | value |\n|---|---|\n| participation ratio (Σλ)²/Σλ² | **4.679** |\n| n / (1 + (n−1)ρ) | 2.383 |\n\n## The intervention\n\nWe 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**.\n\nThen 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.\n\n## Results, gross and cost separated\n\n| | baseline momentum | PC1-residual momentum |\n|---|---:|---:|\n| trades | 5,019 | 3,625 |\n| **gross** portfolio return | **+18.79%** (+3.12%/yr) | **+13.69%** (+2.31%/yr) |\n| **cost** | **−14.77 pp** = 78.6% of gross | **−10.34 pp** = 75.5% of gross |\n| **net** portfolio return | **+4.02%** (+0.70%/yr) | **+3.35%** (+0.59%/yr) |\n| net Sharpe | 0.198 | 0.264 |\n| max drawdown | −8.72% | −4.87% |\n| ex-2021 annualised | −0.79%/yr | +0.03%/yr |\n| years positive | 3/7 | 4/7 |\n| BTC yearly correlation | +0.166 | −0.464 |\n| breakeven commission | 11.95 bps/side (1.36×) | 12.42 bps/side (1.41×) |\n| **N_eff, daily** (2,051 obs) | 9.506 (ρ +0.133) | **11.519** (ρ −0.003) |\n| N_eff, monthly (69 obs) | 8.057 | 8.721 |\n| N_eff, annual (7 obs) | 2.914 | 4.018 |\n\n### The preregistered falsification condition\n\n| | test | measured | threshold | |\n|---|---|---:|---:|---|\n| F1 | N_eff(residual) | 11.519 | ≥ 5.0 | PASS |\n| F2 | N_eff gain vs baseline | +2.013 | ≥ +2.0 | PASS (by 0.013) |\n| F3 | portfolio breakeven commission | 12.422 bps | ≥ 13.2 bps | **FAIL** |\n\nAny 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.\n\n## Why the rejection is the interesting part\n\n**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.\n\nA 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*:\n\n| observations | median PR | p5 | p95 | truth |\n|---:|---:|---:|---:|---:|\n| **7** (annual) | **4.273** | 3.644 | 4.855 | 12 |\n| 8 | 4.712 | 4.031 | 5.334 | 12 |\n| 24 | 8.144 | | | 12 |\n| **69** (monthly) | 10.343 | 9.910 | 10.712 | 12 |\n| **2,051** (daily) | 11.936 | 11.916 | 11.954 | 12 |\n\nSo 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\".\n\nAt 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.\n\n**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.\n\n**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.\n\n## The four screens\n\n1. **Return** — reported, never ranked on: +3.35% total, +0.59%/yr net over 5.61 years.\n2. **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.\n3. **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.\n4. **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.**\n\n## How this relates to what we have already published\n\n- [Sharpe 10.73, Still Untradeable](/articles/sharpe-1073-still-untradeable-the-cross-crypto-experiment-gets-16-more-chances) 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.\n- [The Momentum Mirage](/articles/the-momentum-mirage-106-one-year-43-the-next) 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.\n- [Why Profitable Patterns Can Still Fail the Baseline](/articles/btc-1h-capitulation-bottom-reversal-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.\n- [Surviving Market Friction](/articles/surviving-market-friction-evolving-a-quant-project-on-the-rlxbt-hypothesis-canvas) 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.\n\nNothing here contradicts those results. It corrects a diagnostic we had recorded about our own portfolio.\n\n## Two engine notes\n\n**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`.\n\n**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.\n\n**`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.\n\n## Limitations\n\n- The corpus ends **2026-07-10**, 47 days before this run. Nothing after that date is tested.\n- 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.\n- 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.\n- 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.\n- F2 passed by 0.013. Nothing rests on it, since F3 decides the verdict, but it is not a comfortable margin.\n- 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.\n- 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.\n\n## What would reopen this\n\n- 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.\n- **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.\n- A corpus extended past 2026-07-10 that changes the sign of 2025 (−0.62%) or 2026 (+0.41%).\n","coverImage":null,"status":"published","publishedAt":"2026-08-26T09:24:43.118Z","backtestResults":{"cost":"commission 0.00088088/side (2 legs) + slippage 0.0002/fill, next_open, position_size 0.15","window":"2020-11-28 to 2026-07-10 (5.61y, 2051 daily observations, 49186 hourly bars per spread)","preregistered_checks":{"F1_neff_ge_5":{"pass":true,"value":11.519},"F2_neff_gain_ge_2":{"pass":true,"value":2.013},"F3_breakeven_ge_13_2bps":{"pass":false,"value":12.422}},"baseline_raw_momentum":{"sharpe":0.198,"trades":5019,"annual_pct":0.705,"median_wfe":-0.195,"n_eff_daily":9.506,"n_eff_annual":2.914,"n_eff_monthly":8.057,"net_return_pct":4.02,"years_positive":"3/7","btc_yearly_corr":0.166,"gross_return_pct":18.79,"max_drawdown_pct":-8.72,"annual_ex2021_pct":-0.794,"breakeven_margin_x":1.357,"mc_return_p5_median":-38.065,"oos_windows_positive":"46/120","breakeven_bps_per_side":11.953},"pc1_residual_momentum":{"sharpe":0.264,"trades":3625,"annual_pct":0.589,"median_wfe":0.47,"n_eff_daily":11.519,"n_eff_annual":4.018,"n_eff_monthly":8.721,"net_return_pct":3.35,"years_positive":"4/7","btc_yearly_corr":-0.464,"gross_return_pct":13.69,"max_drawdown_pct":-4.87,"annual_ex2021_pct":0.029,"breakeven_margin_x":1.41,"mc_return_p5_median":-26.585,"oos_windows_positive":"51/120","breakeven_bps_per_side":12.422},"benchmark_btc_same_window":{"total_pct":275.48,"annual_pct":26.58,"daily_sharpe":0.69,"max_drawdown_pct":-76.6},"breadth_estimator_null_12_independent_series":{"7_obs":4.273,"8_obs":4.712,"24_obs":8.144,"69_obs":10.343,"2051_obs":11.936}},"researchManifest":{"assets":["ETHBTC","SOLBTC","XRPBTC","ADABTC","LTCBTC","DOGEBTC","LINKBTC","DOTBTC","BCHBTC","ETCBTC","AVAXBTC","ATOMBTC"],"periods":{"final":"2020-11-28 to 2026-07-10 (corpus ends 2026-07-10, 47 days stale at run time)","train":"no in-sample fitting; the rule is inherited unchanged from the parent card","validation":"walk-forward, 10 rolling windows per spread (train 8000 / test 4000 / step 4000 bars), 120 OOS windows total"},"verdict":{"status":"REJECTED","reasonCode":"COST_EXCEEDS_EDGE"},"evidence":{"bootstrap":true,"oosStatus":"Walk-forward and Monte Carlo run at live cost on all 12 spreads; residual arm median WFE 0.470 (gate 0.5), 51/120 OOS windows positive, 0/12 spreads with Monte Carlo p5 above zero","monteCarlo":true,"sampleSize":3625,"walkForward":true,"independentEvents":2051,"robustnessComplete":true},"execution":{"costs":"commission 0.00088088 per side (two legs x 4.404 bps taker); portfolio breakeven commission bisected with slippage held at the live value","timing":"next_open; synthetic take-profit/stop-loss overlay disabled; position_size 0.15","funding":"not modelled; the spread is dollar-neutral by construction so funding largely offsets between legs, but this is an untested assumption","slippage":"0.0002 per fill (two legs x 1 bp), nonzero throughout"},"reportIds":["rpt_1787736031502_627","rpt_1787736044211_628"],"timeframe":"1h","limitations":["Corpus ends 2026-07-10, 47 days before the run; nothing after that date is tested.","Window starts 2020-11-28 rather than 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.","Ratio datasets set high/low to the open-close envelope because a ratio's intrabar range cannot be recovered from two OHLC series, so take-profit and stop-loss effectively trigger on closes.","One rule, one parameterisation, one PCA window (720 bars, refit every 24 bars). No parameter sweep was run.","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 is not a survivorship-controlled universe draw.","With only 7 annual observations, no annual-horizon statement is separable from noise on its own; the daily (2051 obs) and monthly (69 obs) numbers carry the weight.","Funding costs on the perpetual legs are not modelled."],"hypothesisIds":["hyp_1787735069662_0"],"schemaVersion":1,"nextExperiment":"Re-run the PC1-residual arm under a maker-only cost model (about 3 bps per side, two legs) with an observed fill-rate dropout applied to unfilled signals, since adverse selection means the dropped trades are not a random sample.","relationClaims":[{"type":"tests","reason":"Preregistered three-part falsification condition F1/F2/F3 fixed before any backtest; F3 failed.","targetId":"hyp_1787735069662_0"},{"type":"derived_from","reason":"Same 12 alt/BTC spreads, same momentum rule, same two-leg cost; only the signal columns change to a causal PC1 residual.","targetId":"hyp_1784972600715_10"},{"type":"contradicts","reason":"The parent card records effective breadth 2.30 as the binding constraint. Measured at daily frequency the same 12 sleeves give 9.51, and a null simulation shows the annual-horizon estimator returns ~4.3 even for 12 independent series.","targetId":"hyp_1784972600715_10"},{"type":"failed_due_to","reason":"Portfolio breakeven commission 12.42 bps against 8.808 bps two-leg cost is a 1.41x margin, below the preregistered 1.5x bar; cost consumed 75.5% of gross edge.","targetId":"hyp_1787735069662_0"},{"type":"uses_report","reason":"PC1-residual arm at live two-leg cost.","targetId":"rpt_1787736031502_627"},{"type":"uses_report","reason":"Raw-momentum baseline arm on the identical window and cost.","targetId":"rpt_1787736044211_628"}],"strategyFamily":"market-neutral relative value / cross-sectional PCA residual momentum","academicSources":[{"doi":null,"url":"https://github.com/romanmichaelpaolucci/Quant-Guild-Library","title":"Quant Guild Library - Analyzing Stock Returns with Principal Component Analysis in Python (2025 Video Lectures, notebook 17)"}],"parentHypothesisId":"hyp_1784972600715_10","reopeningConditions":["A construction with at least 3x 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 reducing the two-leg cost from 8.808 to about 3 bps per side, which would turn the residual arm's 1.41x breakeven margin into roughly 4x.","A corpus extended past 2026-07-10 that changes the sign of 2025 (-0.62%) or 2026 (+0.41%)."]},"viewCount":34,"likeCount":0,"metaTitle":null,"metaDescription":null,"createdAt":"2026-08-26T09:24:43.121Z","updatedAt":"2026-09-11T13:02:58.618Z","author":{"id":"08398a34-26f5-4992-82de-0cfba0302908","name":"Serg","picture":"https://lh3.googleusercontent.com/a/ACg8ocKJfy0qxMGacsuTCbRKqF2-Ahj7AqOXwzIJU2wBJye6JmKsh8A=s96-c"},"tags":[{"id":"7c4eb8e4-e15c-4492-a532-bad5a29dab6e","name":"negative-research","slug":"negative-research","color":"#6366f1","createdAt":"2026-08-10T19:54:19.169Z"},{"id":"09106021-7194-45b3-bc58-3964a9b74a05","name":"market-neutral","slug":"market-neutral","color":"#6366f1","createdAt":"2026-08-26T09:24:43.140Z"},{"id":"e0cbfdba-f6f4-4154-bb96-78f81157f62d","name":"pca","slug":"pca","color":"#6366f1","createdAt":"2026-08-26T09:24:43.145Z"},{"id":"a5f16a80-747d-4ab4-abc2-f305e5c87a10","name":"factor-models","slug":"factor-models","color":"#6366f1","createdAt":"2026-08-26T09:24:43.150Z"},{"id":"f6d9659a-67d0-44e8-9896-1ab499b79b9d","name":"transaction-costs","slug":"transaction-costs","color":"#6366f1","createdAt":"2026-08-26T09:24:43.155Z"},{"id":"548ebc89-f20d-4aa6-ba6f-464a23c7a978","name":"agent","slug":"agent","color":"#6366f1","createdAt":"2026-07-02T14:44:23.006Z"}],"comments":[],"isLiked":false,"isAuthor":false}