Sealed firstPoint-in-timeOut-of-sampleSearch counted
QuanterLab is a quantitative research platform. This study was not written up after the fact — the platform ran it: the hypothesis was sealed before any window was scored, the index was reconstructed as it stood on each date, and every attempt is on the record. How the lab works
QuanterLab · Research

ANOTHER DRAFT FOR IMPROVEMENTS TESTING

Universe · Dow 30 (point-in-time constituents)
Method · Comparative — Arm A vs Arm B
Manipulated variable · different signals
Step size · 1 year per forward window
In-sample · 2 years before each anchor
Out-of-sample span · 2011-01-03 → 2025-12-31
Compiled · July 25, 2026
Search record · none (size unknown — see §2.3)
Abstract · author’s wording

We seal a hypothesis and walk a strategy forward across Dow 30 in 1-year steps, each tested out-of-sample on data the strategy had never touched, with survivorship-bias-free constituents reconstructed as of every anchor. This study walks the SAME sealed windows on two arms — Arm A and Arm B — identical in every respect except one declared variable: Signal Module — config — entry · indicator: aroon → rsi; entry · operator: crosses_above → crosses_below; entry · length: 25 → 14; …. Paired date by date inside each window (3751 common out-of-sample observations across 15 windows), Arm A compounds at 12.1% a year against 9.6% for Arm B — a gap of 2.5 pp. A seeded block bootstrap of the paired return differences puts the probability that Arm A genuinely beats Arm B at 81.8%. No search record exists for this design — how many alternatives were tried before it is unknown, which is a different fact from one (§2.3).xxxxxxxxxxxxx

Author’s note

This paper prepared for the control puposes

1  Methodology

xxxxxxxxxxxxxxxxxxxxxxxxxxx

Transaction costs are not modelled in this study; all results are gross of costs.

2  Results

2.1  Headline

Arm A — pooled Sharpe
0.78
3752 OOS bars
Arm B — pooled Sharpe
0.65
3758 OOS bars
P(Arm A beats Arm B)
81.8%
3751 paired bars · CAGR gap +2.5 pp
Out-of-sample equity — normalised growth (1.00x = break even)0.50x3.17x5.85x20112013201520172019202120232025
Figure 1. Both arms stitched through the identical windows —  Arm A (+442.0%),  Arm B (+289.1%), benchmark grey (+425.2%). Dotted verticals mark the step boundaries; the dashed horizontal is break-even.

2.2  Per-step results

Table 1. One row per step — raw out-of-sample results.
#Out-of-sample window Arm A SR Arm B SR
1 2011-01-03 → 2011-12-30 1.39 0.81
2 2012-01-03 → 2012-12-31 0.06 0.03
3 2013-01-02 → 2013-12-31 1.67 2.05
4 2014-01-02 → 2014-12-31 1.85 1.46
5 2015-01-02 → 2015-12-31 0.04 -0.10
6 2016-01-04 → 2016-12-30 0.78 0.42
7 2017-01-03 → 2017-12-29 2.77 2.42
8 2018-01-02 → 2018-12-31 -0.27 -0.17
9 2019-01-02 → 2019-12-31 2.34 2.25
10 2020-01-02 → 2020-12-31 0.97 0.80
11 2021-01-04 → 2021-12-31 1.48 1.49
12 2022-01-03 → 2022-12-30 0.24 0.76
13 2023-01-03 → 2023-12-29 -1.07 1.45
14 2024-01-02 → 2024-12-31 0.34 0.67
15 2025-01-02 → 2025-12-31 1.62 0.67
Out-of-sample equity — normalised growth (1.00x = break even)0.76x1.13x1.49xbars into the window →
Figure 2. Arm A — every step's out-of-sample curve overlaid, each rebased to 1× at its own start. Read alongside Table 1: consistent shape across steps is the walk-forward's evidence; a single lucky leg is not.
Out-of-sample equity — normalised growth (1.00x = break even)0.74x1.03x1.32xbars into the window →
Figure 3. Arm B — the same windows, the other arm. Compare shape-for-shape with the previous figure: the two arms trade the identical out-of-sample legs.

2.3  Search accounting

No search record exists for this design. It was not promoted from a recorded evolving search, so the number of alternatives tried before it — on paper, in another tool, or in the author's head — is unknown. Unknown is a different fact from one: a study with no lineage is not a strategy with one trial, it is a strategy with an unrecorded number of them. Accordingly this paper claims no deflated Sharpe and no trial count; the honest statement is the raw out-of-sample result plus this disclosure. The registered per-step record below (§4) still guarantees each window's hypothesis was sealed before that window was scored.

2.4  The comparison

Both arms trade the same sealed windows, so their returns can be PAIRED: inside each window the two return series are inner-joined date by date and the difference rArm A − rArm B is the object under test. Because this is ONE pre-declared contrast — sealed before any window was scored — the paired statistic needs no multiple-testing deflation; the per-arm pooled numbers above are still deflated by the trial count as usual.

Table 2. Window-by-window paired comparison. Δ is the growth gap (Arm A − Arm B) over the window's paired dates.
#WindowPaired bars Arm AArm B ΔLeader
1 2011-01-04 → 2011-12-30 251 +23.8% +14.7% +9.1 pp Arm A
2 2012-01-04 → 2012-12-31 249 +0.1% -0.1% +0.2 pp Arm A
3 2013-01-03 → 2013-12-31 251 +20.9% +11.1% +9.8 pp Arm A
4 2014-01-03 → 2014-12-31 245 +3.9% +15.5% -11.7 pp Arm B
5 2015-01-05 → 2015-12-31 251 -1.0% -3.4% +2.4 pp Arm A
6 2016-01-05 → 2016-12-30 251 +11.6% +5.3% +6.3 pp Arm A
7 2017-01-04 → 2017-12-29 250 +18.9% +3.3% +15.5 pp Arm A
8 2018-01-03 → 2018-12-31 250 -7.1% -6.2% -1.0 pp Arm B
9 2019-01-03 → 2019-12-31 251 +42.9% +28.0% +14.9 pp Arm A
10 2020-01-03 → 2020-12-31 252 +26.1% +21.9% +4.2 pp Arm A
11 2021-01-05 → 2021-12-31 251 +21.5% +13.5% +8.0 pp Arm A
12 2022-01-04 → 2022-12-30 250 +3.0% +14.6% -11.6 pp Arm B
13 2023-01-04 → 2023-12-29 249 -7.0% +13.5% -20.4 pp Arm B
14 2024-01-03 → 2024-12-31 251 +2.7% +2.8% -0.1 pp Arm B
15 2025-01-03 → 2025-12-31 249 +32.4% +13.3% +19.1 pp Arm A

Paired Sharpe of the difference track: 0.22 · block bootstrap (2000 paths, block 10, seed 1234): P(Arm A beats Arm B) = 81.8%.

3  The circuit

The strategy is a circuit of platform primitives, frozen when the study is registered. Below is the circuit as wired on the canvas, the objective it encodes and how the search runs through it, followed by the mathematics each primitive actually computes — the same formulas the execution engine runs. The complete parameterisation is preserved in the study ledger (Appendix A).

The hypothesis under test

A COMPARATIVE study — Arm A vs Arm B, walked on the same sealed out-of-sample windows. Arm A: Dow Jones 30, selected by statistical / factor criteria, traded via enter long when AROON (length=25) crosses above 0; exit when RSI (length=14) crosses above 70, with parameters tuned in-sample to sharpe, and validated out-of-sample via walk-forward — the rule set is re-optimized on a rolling in-sample window and tested on the unseen window after it. Arm B: Dow Jones 30, selected by statistical / factor criteria, traded via enter long when RSI (length=14) crosses below 30; exit when RSI (length=14) crosses above 70, with parameters tuned in-sample to sharpe, and validated out-of-sample via walk-forward — the rule set is re-optimized on a rolling in-sample window and tested on the unseen window after it. The arms differ in: Signal Module — config (entry · indicator: aroon → rsi; entry · operator: crosses_above → crosses_below; entry · length: 25 → 14; entry · value: 0 → 30). The contrast under test: whether Arm A generates better risk-adjusted returns than Arm B over the identical out-of-sample windows.

The frozen circuit — data flows left to rightuniverse — click for detailsuniverseprice loader — click for detailsprice loaderfilter hurst — click for detailsfilter hurstfilter ou halflife — click for detailsfilter ou halflifetop n — click for detailstop nstrategy loader — click for detailsstrategy loadersignal module — click for detailssignal modulestatic optimizer — click for detailsstatic optimizerwalkforward rolling — click for detailswalkforward rollingbacktest validator — click for detailsbacktest validatorsignal forward autopsy — click for detailssignal forward autopsyuniverse — click for detailsuniverseprice loader — click for detailsprice loaderfilter hurst — click for detailsfilter hurstfilter ou halflife — click for detailsfilter ou halflifetop n — click for detailstop nstrategy loader — click for detailsstrategy loadersignal module — click for detailssignal modulestatic optimizer — click for detailsstatic optimizerwalkforward rolling — click for detailswalkforward rollingbacktest validator — click for detailsbacktest validatorsignal forward autopsy — click for detailssignal forward autopsyArm AArm Bshared
Figure 4. The frozen circuit — every node a primitive, every wire a typed data-flow; the two arms are colour-coded (Arm A green, Arm B blue, shared feeds neutral). Each box is one step of the strategy; data flows along the wires left to right, and no box can see data dated later than the box feeding it. The whole diagram was frozen when the hypothesis was registered. Click any node to open what that step ran with and what it produced.

Envelopes show counts, ratios, dates, and the parameters the author chose. Price series and per-name figures are not published: the underlying market data is licensed to QuanterLab, and redistributing it isn't ours to do.

What each part does
Universe — The starting set of tickers — resolved point-in-time so there is no survivorship bias.
Price Loader — Bulk OHLCV fetch for the whole universe — point-in-time, no future bars.
Filter Hurst — The Hurst exponent — is this series trending, random, or mean-reverting?
Filter Ou Halflife — Ornstein–Uhlenbeck half-life — how many days a deviation takes to decay by half.
Top N — Keep the best N — rank, then cut.
Strategy Loader — Deep-history load for the few names you will actually trade.
Signal Module — The entry / exit rule — turn indicators into a per-bar trade signal.
Static Optimizer — Grid-search one best parameter set over the whole in-sample window.
Walkforward Rolling — Walk-forward with a sliding window — fixed-width, always recent.
Backtest Validator — Forward-test the winning rule on unseen, out-of-sample data.

The objective and the search

Arm A — Dow Jones 30, selected by statistical / factor criteria, traded via enter long when AROON (length=25) crosses above 0; exit when RSI (length=14) crosses above 70, with parameters tuned in-sample to sharpe, and validated out-of-sample via walk-forward — the rule set is re-optimized on a rolling in-sample window and tested on the unseen window after it.

UniverseDow Jones 30 index constituents.
Selectionserial-gated across Hurst exponent, OU half-life → top 10 kept by composite score.
Signal generationenter long when AROON (length=25) crosses above 0; exit when RSI (length=14) crosses above 70.
In-sample searchIn-sample optimization via static (single best params across the in-sample); objective = sharpe; sweeping entry.value ∈ [20, 40] / 5 steps × exit.value ∈ [60, 80] / 5 steps; 252-day in-sample train window.
Validation & out-of-samplerolling walk-forward (252d optimize / 63d test / 63d step); signal forward test (1y horizon from the anchor).
Other componentsSignal: Strategy Loader.

Arm B — Dow Jones 30, selected by statistical / factor criteria, traded via enter long when RSI (length=14) crosses below 30; exit when RSI (length=14) crosses above 70, with parameters tuned in-sample to sharpe, and validated out-of-sample via walk-forward — the rule set is re-optimized on a rolling in-sample window and tested on the unseen window after it.

UniverseDow Jones 30 index constituents.
Selectionserial-gated across Hurst exponent, OU half-life → top 10 kept by composite score.
Signal generationenter long when RSI (length=14) crosses below 30; exit when RSI (length=14) crosses above 70.
In-sample searchIn-sample optimization via static (single best params across the in-sample); objective = sharpe; sweeping entry.value ∈ [20, 40] / 5 steps × exit.value ∈ [60, 80] / 5 steps; 252-day in-sample train window.
Validation & out-of-samplerolling walk-forward (252d optimize / 63d test / 63d step); signal forward test (1y horizon from the anchor).
Other componentsSignal: Strategy Loader.

What differs between the arms — one difference; the comparison is clean:

  • paramSignal Module — config
    • · entry · indicator: aroon → rsi
    • · entry · operator: crosses_above → crosses_below
    • · entry · length: 25 → 14
    • · entry · value: 0 → 30

Everything else is held identical, so an out-of-sample gap between the arms is attributable to this one change.

No transaction-cost elements are wired into this circuit; results are gross of costs.

Show the mathematics — 10 primitives, formulas and parity notes

3.1  Universe

The starting set of tickers — resolved point-in-time so there is no survivorship bias.

Before any math, you need a list of stocks. An index preset (S&P 500, Nasdaq-100, Dow 30) is reconstructed as it stood ON your anchor date by replaying the historical add/drop change-log backwards — so a 2018 backtest sees the 2018 membership, not today's winners.

Point-in-time membership

Start from today's constituents and un-apply every membership change after the anchor t:

\mathcal{U}(t) = \mathcal{U}_{\text{now}} \;\ominus\; \{\text{adds after } t\} \;\oplus\; \{\text{drops after } t\}
Constituents resolved from the index change-log; the same point-in-time set the factor + screening modules use.

3.2  Price Loader

Bulk OHLCV fetch for the whole universe — point-in-time, no future bars.

Momentum, volatility, trend — every price-based metric needs history. This loads open/high/low/close/volume for all names in parallel, clipped so nothing after the anchor can leak in. The lookback window is derived automatically from the deepest metric you wired.

The window is derived, not guessed

It loads exactly enough history for the hungriest downstream metric plus a warm-up buffer:

W = \max_k(\text{lookback}_k) + \text{buffer}, \qquad \text{bars} \le \text{anchor } t

3.3  Filter Hurst

The Hurst exponent — is this series trending, random, or mean-reverting?

Rescaled-range (R/S) analysis measures how the spread of a series grows as you look over longer windows. A random walk spreads like √n; trends spread faster, mean-reversion slower. The exponent H captures which.

Rescaled range scales as a power of the window
\mathbb{E}\!\left[\tfrac{R(n)}{S(n)}\right] \sim c\,n^{H} \;\;\Longrightarrow\;\; H = \frac{\log\!\big(R/S\big)}{\log n}
R = range of the cumulative deviation, S = standard deviation, over log-spaced windows n (10 → min(N/4, 200)).
Bias correction
H = \operatorname{clip}\big(\text{slope} - 0.06,\ 0,\ 1\big)
The R/S estimator runs slightly high on finite samples; the −0.06 correction (clamped to [0,1]) matches the Indicator-Strategies scanner exactly — the same ticker reads the same H in both.
Reading it

H < 0.5 → mean-reverting · H ≈ 0.5 → random walk · H > 0.5 → trending. The metric is attached to each stock; ranking + the cut happen in Composite Σ / Top-N.

The exact compute_hurst of the Indicator-Strategies MR scanner (shared scanner_metrics) — same algorithm, same bias correction, same number.

3.4  Filter Ou Halflife

Ornstein–Uhlenbeck half-life — how many days a deviation takes to decay by half.

First remove the long-term drift (an OLS trend line fitted to log-price), then fit an AR(1) to what remains. The autoregressive coefficient β says how fast deviations from trend get pulled back; convert it to a half-life in days. Roughly 5–40 days is the tradeable sweet spot for mean reversion.

Detrend log-price first
\log P_t = a + b\,t + \varepsilon_t \quad\Longrightarrow\quad x_t = \log P_t - (a + b\,t)
Without detrending, a drifting stock looks like it never reverts — the AR(1) must see deviations from trend, not the trend itself.
AR(1) on the detrended residual
x_t = \alpha + \beta\,x_{t-1} + \varepsilon_t
Half-life from the decay rate
\text{half-life} = \frac{\ln 2}{\lvert \ln \beta \rvert}
β close to 1 → very slow reversion (long half-life); small β → fast. No mean reversion detected (β outside (0,1)) reports 999 — it ranks last and fails any "keep below" gate.
The exact compute_halflife of the Indicator-Strategies MR scanner (shared scanner_metrics) — detrended log AR(1), same number in both modules.

3.5  Top N

Keep the best N — rank, then cut.

Sort the survivors by the Composite Σ (or, if none is wired, the last metric in the chain) and keep the top (or bottom) N. The final narrowing from a scored list to a committed basket.

Order statistic cut
\text{Top-}N = \{\, i : \operatorname{rank}(\text{score}_i) \le N \,\}
"Keep highest" for momentum; "keep lowest" for e.g. Hurst (mean reversion).

3.6  Strategy Loader

Deep-history load for the few names you will actually trade.

The efficiency split: screening scans ~1 year across ~500 names, but the lifecycle (signal → optimizer → walk-forward) needs years of history. So this loads that deep window ONLY for the handful of survivors. No new math — the window is derived from the deepest lifecycle lookback (default ~5 years).

Derived deep window, survivors only
W_{\text{deep}} = \max(\text{lifecycle lookbacks}) \approx 5\text{y}, \quad \text{loaded for } \mathcal{S} \text{ only}

3.7  Signal Module

The entry / exit rule — turn indicators into a per-bar trade signal.

Composes indicators (RSI, moving averages, …) with comparison and logic operators into a rule that says enter, exit, or hold each bar. The rule is emitted as a portable config the optimizer tunes and the walk-forward validates — so what you design is exactly what gets traded.

Boolean rule → position state
\text{signal}_t = \begin{cases} +1 & \text{entry rule true} \\ 0 & \text{exit rule true} \\ \text{hold} & \text{otherwise}\end{cases}
e.g. enter when RSI < 30, exit when RSI > 50.

3.8  Static Optimizer

Grid-search one best parameter set over the whole in-sample window.

Sweeps a grid of parameter combinations, backtests each on the in-sample data, and keeps the single combination that scores best on your objective (Sharpe by default). One rule for the whole period — no time variation.

Argmax over the grid
\boldsymbol\theta^* = \arg\max_{\boldsymbol\theta\in\text{grid}} \;\mathcal O\big(\text{backtest}(\boldsymbol\theta)\big)
Objective 𝒪 ∈ {Sharpe, Calmar, Sortino, total return, profit factor, win rate}.
Default objective — Sharpe
\text{Sharpe} = \frac{\bar r - r_f}{\sigma_r}\,\sqrt{252}

3.9  Walkforward Rolling

Walk-forward with a sliding window — fixed-width, always recent.

Same out-of-sample discipline, but the training window is a fixed width that slides forward — each fold trains on the SAME amount of data, just more recent. Better when old regimes hurt and only recent behaviour matters.

Sliding folds
\text{fold}_k:\quad [\,\text{split}_k - W,\;\text{split}_k\,]\ \text{train} \;\to\; [\,\text{split}_k,\;\text{end}_k\,]\ \text{test}
Fixed train width W slides forward. Non-overlapping tests by default (step = test).

3.10  Backtest Validator

Forward-test the winning rule on unseen, out-of-sample data.

Takes the wired rule config (the Walk-Forward validated config wins, else the optimized config, else the raw signal config) and trades it FORWARD on the out-of-sample window to the right of the anchor — data it never saw during optimization — re-deriving the regime as-of each bar. It produces the true out-of-sample equity curve, trades and statistics: the signal-path twin of the Portfolio Forward Test, not an in-sample replay.

Apply the frozen rule forward (OOS)
E_t = E_{t-1}\,(1 + r_t),\qquad \text{Sharpe} = \frac{\bar r - r_f}{\sigma_r}\sqrt{252}
Config frozen from optimization / walk-forward, then replayed bar-by-bar on the forward window it has never seen, with cost + risk overlays applied.

4  Sealed-hypothesis record

The integrity of a walk-forward rests on registering each hypothesis before its out-of-sample window is scored — the windows themselves are historical. The order below is the order in which the hypotheses were sealed.

Table 3. The registered hypothesis for each step, with its registration timestamp. Where a step re-seals the previous hypothesis unchanged, the row says so instead of repeating it.
#Registered hypothesisAnchorRegistered at
1 “A COMPARATIVE study — Arm A vs Arm B, walked on the same sealed out-of-sample windows. Arm A: S&P 500, selected by statistical / factor criteria, traded via enter long when AROON (length=25) crosses above 0; exit when RSI (length=14) crosses above 70, with parameters tuned in-sample to sharpe, and validated out-of-sample via walk-forward — the rule set is re-optimized on a rolling in-sample window and tested on the unseen window after it. Arm B: S&P 500, selected by statistical / factor criteria, traded via enter long when RSI (length=14) crosses below 30; exit when RSI (length=14) crosses above 70, with parameters tuned in-sample to sharpe, and validated out-of-sample via walk-forward — the rule set is re-optimized on a rolling in-sample window and tested on the unseen window after it. The arms differ in: Signal Module — config: {"direction":"long","entry":{"indicator":"aroon","params":{"length":25},"operator":"crosses_above","value":0},"confirm":null,"exit":{"indicator":"rsi","params":{"length":14},"operator":"crosses_above","value":70},"timeline":{"duration_days":180,"offset_days_from_anchor":0}} → {"direction":"long","entry":{"indicator":"rsi","params":{"length":14},"operator":"crosses_below","value":30},"confirm":null,"exit":{"indicator":"rsi","params":{"length":14},"operator":"crosses_above","value":70},"timeline":{"duration_days":180,"offset_days_from_anchor":0}}. The contrast under test: whether Arm A generates better risk-adjusted returns than Arm B over the identical out-of-sample windows.” 2011-01-01 2026-07-25
2 “A COMPARATIVE study — Arm A vs Arm B, walked on the same sealed out-of-sample windows. Arm A: Dow Jones 30, selected by statistical / factor criteria, traded via enter long when AROON (length=25) crosses above 0; exit when RSI (length=14) crosses above 70, with parameters tuned in-sample to sharpe, and validated out-of-sample via walk-forward — the rule set is re-optimized on a rolling in-sample window and tested on the unseen window after it. Arm B: Dow Jones 30, selected by statistical / factor criteria, traded via enter long when RSI (length=14) crosses below 30; exit when RSI (length=14) crosses above 70, with parameters tuned in-sample to sharpe, and validated out-of-sample via walk-forward — the rule set is re-optimized on a rolling in-sample window and tested on the unseen window after it. The arms differ in: Signal Module — config: {"direction":"long","entry":{"indicator":"aroon","params":{"length":25},"operator":"crosses_above","value":0},"confirm":null,"exit":{"indicator":"rsi","params":{"length":14},"operator":"crosses_above","value":70},"timeline":{"duration_days":180,"offset_days_from_anchor":0}} → {"direction":"long","entry":{"indicator":"rsi","params":{"length":14},"operator":"crosses_below","value":30},"confirm":null,"exit":{"indicator":"rsi","params":{"length":14},"operator":"crosses_above","value":70},"timeline":{"duration_days":180,"offset_days_from_anchor":0}}. The contrast under test: whether Arm A generates better risk-adjusted returns than Arm B over the identical out-of-sample windows.” 2012-01-01 2026-07-25
3 “A COMPARATIVE study — Arm A vs Arm B, walked on the same sealed out-of-sample windows. Arm A: Dow Jones 30, selected by statistical / factor criteria, traded via enter long when AROON (length=25) crosses above 0; exit when RSI (length=14) crosses above 70, with parameters tuned in-sample to sharpe, and validated out-of-sample via walk-forward — the rule set is re-optimized on a rolling in-sample window and tested on the unseen window after it. Arm B: Dow Jones 30, selected by statistical / factor criteria, traded via enter long when RSI (length=14) crosses below 30; exit when RSI (length=14) crosses above 70, with parameters tuned in-sample to sharpe, and validated out-of-sample via walk-forward — the rule set is re-optimized on a rolling in-sample window and tested on the unseen window after it. The arms differ in: Signal Module — config (entry · indicator: aroon → rsi; entry · operator: crosses_above → crosses_below; entry · length: 25 → 14; entry · value: 0 → 30). The contrast under test: whether Arm A generates better risk-adjusted returns than Arm B over the identical out-of-sample windows.” 2013-01-01 2026-07-25
4 — unchanged from step 3 2014-01-01 2026-07-25
5 — unchanged from step 4 2015-01-01 2026-07-25
6 — unchanged from step 5 2016-01-01 2026-07-25
7 — unchanged from step 6 2017-01-01 2026-07-25
8 — unchanged from step 7 2018-01-01 2026-07-25
9 — unchanged from step 8 2019-01-01 2026-07-25
10 — unchanged from step 9 2020-01-01 2026-07-25
11 — unchanged from step 10 2021-01-01 2026-07-25
12 — unchanged from step 11 2022-01-01 2026-07-25
13 — unchanged from step 12 2023-01-01 2026-07-25
14 — unchanged from step 13 2024-01-01 2026-07-25
15 — unchanged from step 14 2025-01-01 2026-07-25

5  Discussion

xxxxxxxxxxxx

No search record exists for this study: the design was not promoted from a recorded evolving search, so the number of alternatives tried before it is UNKNOWN — which is a different fact from one. No deflated Sharpe is claimed; the honest statement is the raw out-of-sample result plus this disclosure. The out-of-sample windows are historical.

References

As provided by QuanterLab
  1. Bailey, D. H., & López de Prado, M. (2014). The Deflated Sharpe Ratio: Correcting for Selection Bias, Backtest Overfitting, and Non-Normality. Journal of Portfolio Management, 40(5), 94–107. doi:10.3905/jpm.2014.40.5.094
  2. Gelman, A., & Loken, E. (2013). The garden of forking paths: Why multiple comparisons can be a problem, even when there is no “fishing expedition.” Working paper, Columbia University.
  3. Harvey, C. R., Liu, Y., & Zhu, H. (2016). … and the Cross-Section of Expected Returns. Review of Financial Studies, 29(1), 5–68. doi:10.1093/rfs/hhv059
  4. Lo, A. W. (2002). The Statistics of Sharpe Ratios. Financial Analysts Journal, 58(4), 36–52. doi:10.2469/faj.v58.n4.2453

Appendix A  Reproducibility in QuanterLab

Each step is backed by a frozen run report. The study is re-derivable from the ledger below.

#CommitReportAnchorOOS window
1 70669d73f0cb 289 2011-01-01 2011-01-03 → 2011-12-30
2 030a4f35a647 290 2012-01-01 2012-01-03 → 2012-12-31
3 9d08811ae672 291 2013-01-01 2013-01-02 → 2013-12-31
4 6694d169ac3c 292 2014-01-01 2014-01-02 → 2014-12-31
5 bfd56236da74 293 2015-01-01 2015-01-02 → 2015-12-31
6 5542d4d03705 294 2016-01-01 2016-01-04 → 2016-12-30
7 5f710caae120 295 2017-01-01 2017-01-03 → 2017-12-29
8 fe83148202b8 296 2018-01-01 2018-01-02 → 2018-12-31
9 180d0f0ebf78 297 2019-01-01 2019-01-02 → 2019-12-31
10 8dd948c848e3 299 2020-01-01 2020-01-02 → 2020-12-31
11 9ecf8cc04e8f 300 2021-01-01 2021-01-04 → 2021-12-31
12 3ab5e5c9bcff 301 2022-01-01 2022-01-03 → 2022-12-30
13 a95a57233536 302 2023-01-01 2023-01-03 → 2023-12-29
14 4d0349b2f538 303 2024-01-01 2024-01-02 → 2024-12-31
15 3055b9a3409c 304 2025-01-01 2025-01-02 → 2025-12-31

Appendix B  Per-step diagnostics

What each step's run actually did beyond its return: capital allocation across lanes and regimes, the portfolio book's rebalancing and cost drag, and how positions were sized. Harvested from the frozen run reports — present where the circuit produced them.

Step 1 · 2011-01-03 → 2011-12-30

Position sizing — sizing: half_kelly

Step 2 · 2012-01-03 → 2012-12-31

Position sizing — sizing: half_kelly

Step 3 · 2013-01-02 → 2013-12-31

Position sizing — sizing: half_kelly

Step 4 · 2014-01-02 → 2014-12-31

Position sizing — sizing: half_kelly

Step 5 · 2015-01-02 → 2015-12-31

Position sizing — sizing: half_kelly

Step 6 · 2016-01-04 → 2016-12-30

Position sizing — sizing: half_kelly

Step 7 · 2017-01-03 → 2017-12-29

Position sizing — sizing: half_kelly

Step 8 · 2018-01-02 → 2018-12-31

Position sizing — sizing: half_kelly

Step 9 · 2019-01-02 → 2019-12-31

Position sizing — sizing: half_kelly

Step 10 · 2020-01-02 → 2020-12-31

Position sizing — sizing: half_kelly

Step 11 · 2021-01-04 → 2021-12-31

Position sizing — sizing: half_kelly

Step 12 · 2022-01-03 → 2022-12-30

Position sizing — sizing: half_kelly

Step 13 · 2023-01-03 → 2023-12-29

Position sizing — sizing: half_kelly

Step 14 · 2024-01-02 → 2024-12-31

Position sizing — sizing: half_kelly

Step 15 · 2025-01-02 → 2025-12-31

Position sizing — sizing: half_kelly

QuanterLab · Study 6b0c5bb3159e · compiled July 25, 2026. Point-in-time constituents and hypothesis-registration timestamps are enforced by the platform; transaction costs are not modelled in this study. This report is generated from the frozen study artifact and is reproducible from the ledger above. Educational research only — not investment advice.

Run a study like this one

Everything above was produced inside QuanterLab — the sealed registration, the walk, the statistics and the paper itself. Build the circuit on a canvas, register the hypothesis before you score it, and the platform keeps you honest about the rest.

Closed beta — request access and we'll also tell you when new studies publish.

All research