Can a price signal beat random ranks?
Synthetic data · no market performance claimsWe compare a 28-day price signal with random ranks on unseen data, using parameters chosen on past data and the same execution delay and costs.
Final holdout: price signal -1.62% versus random ranks -1.31%. This fixture does not support the hypothesis.
Development · walk-forward
29 Jan 2023 — 30 Sep 2024Rolling tests show development performance; the final holdout below is evaluated separately. Value of 1.00 after trading and financing costs; each period starts in cash.
Hover or tap to inspect. Use ← → when focused; Esc to clear.
| Portfolio | Net return | Daily Sharpe × √365 | Max drawdown | Mean daily turnover |
|---|---|---|---|---|
| ● 28-day price signal | +23.37% | 0.86 | 12.24% | 8.09% |
| ● Random ranks | -35.32% | -1.54 | 44.53% | 8.33% |
| ● Equal-weight long | -31.55% | -0.78 | 40.21% | 2.64% |
Final holdout · parameters frozen
01 Oct 2024 — 31 Dec 2024The price signal finished 0.31 percentage points behind random ranks after costs. Value of 1.00 after trading and financing costs; each period starts in cash.
Hover or tap to inspect. Use ← → when focused; Esc to clear.
| Portfolio | Net return | Daily Sharpe × √365 | Max drawdown | Mean daily turnover |
|---|---|---|---|---|
| ● 28-day price signal | -1.62% | -0.34 | 11.37% | 7.94% |
| ● Random ranks | -1.31% | -0.25 | 10.45% | 7.30% |
| ● Equal-weight long | +1.10% | 0.29 | 13.39% | 2.55% |
What was fitted, and when?
Candidate horizons: 1, 7, 14 and 28 calendar days. The largest absolute training IC selects the holding interval; its sign selects momentum or reversal. Ties choose the first candidate. Training label exits must fall on or before the training end date.
| Evaluation | Training window | Test window | Horizon | Direction | Test IC | IC dates |
|---|---|---|---|---|---|---|
| Fold 1 | 2022-01-29 2023-01-28 | 2023-01-29 2023-04-28 | 28 days | Reversal | -0.054 | 61 |
| Fold 2 | 2022-04-29 2023-04-28 | 2023-04-29 2023-07-28 | 28 days | Reversal | 0.204 | 62 |
| Fold 3 | 2022-07-29 2023-07-28 | 2023-07-29 2023-10-28 | 28 days | Reversal | 0.015 | 63 |
| Fold 4 | 2022-10-29 2023-10-28 | 2023-10-29 2024-01-28 | 28 days | Reversal | -0.027 | 63 |
| Fold 5 | 2023-01-29 2024-01-28 | 2024-01-29 2024-04-28 | 28 days | Reversal | 0.026 | 62 |
| Fold 6 | 2023-04-29 2024-04-28 | 2024-04-29 2024-07-28 | 28 days | Reversal | 0.002 | 62 |
| Fold 7 | 2023-07-29 2024-07-28 | 2024-07-29 2024-09-30 | 14 days | Momentum | -0.086 | 49 |
| Holdout | 2023-10-01 2024-09-30 | 2024-10-01 2024-12-31 | 28 days | Reversal | -0.160 | 63 |
IC is a cross-sectional Spearman correlation against lagged forward labels. Labels can overlap; these are descriptive diagnostics, never the return stream used for Sharpe.
Methodology you can inspect
Formation and execution
Trailing 28-day price change becomes a same-day cross-sectional z-score. At close d+1 the model trades the score from close d. The first earned return ends at close d+2. Top and bottom fifths target +50% and −50% of post-cost NAV. Holdings drift between scheduled rebalances.
Costs and daily marks
Every day's P&L comes from held notionals times one-day price changes. Turnover is absolute traded notional divided by prior NAV; a full entry is about 100%, a reversal about 200%. The 10 bps assumption combines fees and slippage. Initial trades, rebalances and final liquidation incur costs. Borrowing/funding is a flat 3% annual charge on prior-close short notional divided by 365.
Separation and baselines
Each development fold starts in cash and liquidates at its end. The final three calendar months are excluded from all development fits and gates; their parameters are frozen on the preceding training window. Random ranks are an independent fixed-seed no-skill control. Equal-weight long shows market exposure, with different net exposure from the long/short book. Both use the same horizon schedule, costs and delay.
Interpretation and limits
Sharpe uses daily net returns and √365, with cash earning zero. Neither IC t-statistics nor sample Sharpe establish significance. This small, complete fixed universe omits delistings, liquidity constraints, variable funding, market impact and exchange-specific fills. Missing or invalid prices stop execution. Caller-provided signals still need point-in-time provenance.
Reproduce and audit
From a checkout with Python 3.11 or 3.12, run ./scripts/demo.sh. It creates an isolated environment, installs locked dependencies and writes this report plus CSV/JSON files. Dependency installation needs internet once; the experiment itself makes no network requests and needs no credentials.
Seed 20260914. Inputs: prices.csv and signals.csv (including the baseline scores). Outputs: daily_returns.csv and results.json. Input SHA-256: de08c5761e9c7ae74f0cd175…. The full hash and engine source hash are in results.json. All displayed figures are generated by the engine.