This is a Draft Document for tesing the report generation capabilities of the platfrom. Static Vs. Per-Regime Threshold Setting on a Mean Reversion Strategy
We seal a hypothesis and walk a strategy forward across Nasdaq 100 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: Regime. Paired date by date inside each window (3758 common out-of-sample observations across 15 windows), Arm A compounds at 17.4% a year against 15.4% for Arm B — a gap of 2.0 pp. A seeded block bootstrap of the paired return differences puts the probability that Arm A genuinely beats Arm B at 69.8%. Every attempt made along the way — 15 registered circuits, pruned candidates included — is counted in the correction, so the headline number reflects the true cost of the search.
1 Methodology
We conduct a sealed walk-forward comparison of two trading arms on Nasdaq 100 constituents over 15 annual steps spanning 2011 to 2025. Each arm operates on identical out-of-sample windows but differs in its optimization regime and signal configuration. Both arms begin with the same universe selection process. We score all Nasdaq 100 constituents across three statistical dimensions: Hurst exponent, Ornstein-Uhlenbeck half-life, and augmented Dickey-Fuller stationarity. We retain the top 10 securities by composite score for each year, ensuring our trading pool reflects mean-reverting candidates with strong statistical evidence. Arm A employs a static optimizer. For each annual step, we fit parameters on a 252-day in-sample training window using a single set of optimal RSI(7) thresholds that maximize Sharpe ratio across the entire lookback period. We sweep entry.value across 20 to 40 in five steps and exit.value across 60 to 80 in five steps, yielding 25 candidate parameter pairs per in-sample fit. The winning pair is then held fixed and applied to the subsequent 63-day out-of-sample test window. The signal rule is: enter long when RSI(7) crosses below 30; exit when RSI(7) crosses above 70. Arm B employs a per-regime optimizer. Using the same in-sample window and training objective, we segment historical data by a Gaussian-mixture regime classifier that detects macro states via volatility and return distributions. Within each regime, we optimize RSI(14) entry and exit thresholds independently, sweeping entry.value across 20 to 40 in six steps and exit.value across 60 to 80 in six steps. This yields 36 candidate parameter pairs per regime per step. The signal rule is: enter long when RSI(14) crosses below 30; exit when RSI(14) crosses above 70. The per-regime parameters are then applied forward into the test window, with regime assignment updated as new data arrives. Both arms follow rolling walk-forward discipline: optimize on year N, test on the following 63 days, step forward by 63 days, and repeat. This process unfolds across 15 consecutive annual anchors, ensuring no look-ahead bias and treating each test window as truly out-of-sample. The contrast under test is whether the added complexity of regime conditioning and RSI(14) tuning in Arm B generates better risk-adjusted returns than Arm A's static, simpler RSI(7) approach when both face the same out-of-sample periods. The walk has not yet been scored; performance metrics will be logged once all 15 steps complete.
Transaction costs are not modelled in this study; all results are gross of costs.
2 Results
2.1 Headline
2.2 Per-step results
| # | Out-of-sample window | N | Arm A SR | defl. | Arm B SR | defl. |
|---|---|---|---|---|---|---|
| 1 | 2011-01-03 → 2011-12-30 | 1 | 0.90 | 83% | 1.01 | 84% |
| 2 | 2012-01-03 → 2012-12-31 | 2 | -0.55 | 13% | 0.62 | 54% |
| 3 | 2013-01-02 → 2013-12-31 | 3 | 2.23 | 94% | 1.57 | 84% |
| 4 | 2014-01-02 → 2014-12-31 | 4 | 0.46 | 28% | -0.03 | 14% |
| 5 | 2015-01-02 → 2015-12-31 | 5 | 1.58 | 66% | 0.55 | 26% |
| 6 | 2016-01-04 → 2016-12-30 | 6 | 1.12 | 46% | 0.27 | 15% |
| 7 | 2017-01-03 → 2017-12-29 | 7 | 1.35 | 49% | 0.89 | 30% |
| 8 | 2019-01-02 → 2019-12-31 | 8 | 2.72 | 90% | 2.35 | 90% |
| 9 | 2019-01-02 → 2019-12-31 | 9 | 2.72 | 89% | 2.35 | 89% |
| 10 | 2020-01-02 → 2020-12-31 | 10 | 1.41 | 44% | 1.06 | 30% |
| 11 | 2021-01-04 → 2021-12-31 | 11 | -0.14 | 4% | -0.64 | 1% |
| 12 | 2022-01-03 → 2022-12-30 | 12 | -0.12 | 4% | -0.60 | 1% |
| 13 | 2023-01-03 → 2023-12-29 | 13 | 2.48 | 79% | 3.24 | 97% |
| 14 | 2024-01-02 → 2024-12-31 | 14 | 1.84 | 55% | 1.23 | 31% |
| 15 | 2025-01-02 → 2025-12-31 | 15 | 0.03 | 4% | 1.11 | 25% |
2.3 Trial accounting
The search registered 15 circuits in total (pruned candidates included); the correction uses this registered-circuit count, N = 15. The pooled deflated Sharpe is the inferential headline; the per-step deflated track in Table 1 is illustrative, since near-identical variants are correlated and per-step deflation over-penalises.
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.
| # | Window | Paired bars | Arm A | Arm B | Δ | Leader |
|---|---|---|---|---|---|---|
| 1 | 2011-01-04 → 2011-12-30 | 251 | +28.2% | +21.0% | +7.3 pp | Arm A |
| 2 | 2012-01-04 → 2012-12-31 | 249 | -37.3% | +9.9% | -47.2 pp | Arm B |
| 3 | 2013-01-03 → 2013-12-31 | 251 | +22.1% | +22.9% | -0.7 pp | Arm B |
| 4 | 2014-01-03 → 2014-12-31 | 251 | +8.4% | -1.7% | +10.1 pp | Arm A |
| 5 | 2015-01-05 → 2015-12-31 | 251 | +35.6% | +7.1% | +28.5 pp | Arm A |
| 6 | 2016-01-05 → 2016-12-30 | 251 | +24.2% | +3.4% | +20.8 pp | Arm A |
| 7 | 2017-01-04 → 2017-12-29 | 250 | +22.9% | +19.1% | +3.8 pp | Arm A |
| 8 | 2019-01-03 → 2019-12-31 | 251 | +45.4% | +12.4% | +33.0 pp | Arm A |
| 9 | 2019-01-03 → 2019-12-31 | 251 | +45.4% | +12.4% | +33.0 pp | Arm A |
| 10 | 2020-01-03 → 2020-12-31 | 252 | +52.5% | +32.9% | +19.7 pp | Arm A |
| 11 | 2021-01-05 → 2021-12-31 | 251 | -16.3% | -29.7% | +13.4 pp | Arm A |
| 12 | 2022-01-04 → 2022-12-30 | 250 | -17.6% | -29.9% | +12.3 pp | Arm A |
| 13 | 2023-01-04 → 2023-12-29 | 249 | +56.8% | +183.1% | -126.3 pp | Arm B |
| 14 | 2024-01-03 → 2024-12-31 | 251 | +49.0% | +39.6% | +9.3 pp | Arm A |
| 15 | 2025-01-03 → 2025-12-31 | 249 | -5.1% | +20.9% | -26.0 pp | Arm B |
Paired Sharpe of the difference track: 0.13 · block bootstrap (2000 paths, block 10, seed 1234): P(Arm A beats Arm B) = 69.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).
A COMPARATIVE study — Arm A vs Arm B, walked on the same sealed out-of-sample windows. Arm A: NASDAQ 100, selected by statistical / factor criteria, traded via enter long when RSI (length=7) crosses below 30; exit when RSI (length=7) 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: NASDAQ 100, selected by statistical / factor criteria, traded via enter long when RSI (length=14) crosses below 30; exit when RSI (length=14) crosses above 70, conditioned on the wired regime classifier, 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: only in Arm A: Static Optimizer; only in Arm B: Per-Regime Optimizer, GMM Regime; parameters differ on: Signal Module, Walk-Forward (Rolling). The contrast under test: whether Arm A generates better risk-adjusted returns than Arm B over the identical out-of-sample windows.
The objective and the search
Arm A — NASDAQ 100, selected by statistical / factor criteria, traded via enter long when RSI (length=7) crosses below 30; exit when RSI (length=7) 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.
| Universe | NASDAQ 100 index constituents. |
|---|---|
| Selection | composite-scored across Hurst exponent, OU half-life, ADF stationarity → top 10 kept by composite score. |
| Signal generation | enter long when RSI (length=7) crosses below 30; exit when RSI (length=7) crosses above 70. |
| In-sample search | In-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-sample | rolling walk-forward (252d optimize / 63d test / 63d step); signal forward test (1y horizon from the anchor). |
Arm B — NASDAQ 100, selected by statistical / factor criteria, traded via enter long when RSI (length=14) crosses below 30; exit when RSI (length=14) crosses above 70, conditioned on the wired regime classifier, 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.
| Universe | NASDAQ 100 index constituents. |
|---|---|
| Selection | composite-scored across Hurst exponent, OU half-life, ADF stationarity → top 10 kept by composite score. |
| Signal generation | enter long when RSI (length=14) crosses below 30; exit when RSI (length=14) crosses above 70. |
| In-sample search | In-sample optimization via per-regime (independent best params per macro state); objective = sharpe; sweeping entry.value ∈ [20, 40] / 6 steps × exit.value ∈ [60, 80] / 6 steps; 252-day in-sample train window. |
| Validation & out-of-sample | rolling walk-forward (252d optimize / 63d test / 63d step); signal forward test (1y horizon from the anchor). |
| Regime layer | macro regime detected via Gaussian-mixture vol/return detector. |
The manipulated variable — the arms differ in: only in Arm A: Static Optimizer; only in Arm B: Per-Regime Optimizer, GMM Regime; parameters differ on: Signal Module, Walk-Forward (Rolling). Everything else is held identical, so any out-of-sample gap between the arms is attributable to this difference.
No transaction-cost elements are wired into this circuit; results are gross of costs.
3.1 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.
\text{signal}_t = \begin{cases} +1 & \text{entry rule true} \\ 0 & \text{exit rule true} \\ \text{hold} & \text{otherwise}\end{cases}3.2 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.
\boldsymbol\theta^* = \arg\max_{\boldsymbol\theta\in\text{grid}} \;\mathcal O\big(\text{backtest}(\boldsymbol\theta)\big)\text{Sharpe} = \frac{\bar r - r_f}{\sigma_r}\,\sqrt{252}3.3 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.
\text{fold}_k:\quad [\,\text{split}_k - W,\;\text{split}_k\,]\ \text{train} \;\to\; [\,\text{split}_k,\;\text{end}_k\,]\ \text{test}3.4 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.
E_t = E_{t-1}\,(1 + r_t),\qquad \text{Sharpe} = \frac{\bar r - r_f}{\sigma_r}\sqrt{252}3.5 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.
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\}3.6 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.
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 } t3.7 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.
\mathbb{E}\!\left[\tfrac{R(n)}{S(n)}\right] \sim c\,n^{H} \;\;\Longrightarrow\;\; H = \frac{\log\!\big(R/S\big)}{\log n}H = \operatorname{clip}\big(\text{slope} - 0.06,\ 0,\ 1\big)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.
3.8 Composite Score
The composite — turn many metrics into one 0–100 score per stock.
Each wired metric is ranked across all stocks into a 0–100 percentile (you choose whether high or low is "good"), then the percentiles are weight-averaged. Ranking instead of raw values means no single unit dominates and outliers can't blow it up. It scores; it does not drop.
\text{pct}_k(i) = 100 \cdot \frac{\operatorname{rank}_k(i)}{N}\text{score}_i = \frac{\sum_k w_k\,\text{pct}_k(i)}{\sum_k w_k} \in [0,100]3.9 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.
\log P_t = a + b\,t + \varepsilon_t \quad\Longrightarrow\quad x_t = \log P_t - (a + b\,t)x_t = \alpha + \beta\,x_{t-1} + \varepsilon_t\text{half-life} = \frac{\ln 2}{\lvert \ln \beta \rvert}3.10 Filter Adf
Augmented Dickey–Fuller — a statistical test for stationarity (mean reversion).
Regress the change in price on its lagged level. If the level coefficient is significantly negative, deviations get pulled back — the series is stationary (mean-reverting). A low p-value rejects the "random walk" null.
\Delta x_t = \gamma\,x_{t-1} + \sum_{i=1}^{p}\delta_i\,\Delta x_{t-i} + \varepsilon_tp < 0.05 → reject the random walk → mean-reverting. The metric carried is the p-value (or the ADF statistic).
3.11 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.
\text{Top-}N = \{\, i : \operatorname{rank}(\text{score}_i) \le N \,\}3.12 Per Regime Optimizer
A separate best parameter set for each regime.
Partitions the in-sample window by a wired regime classifier and optimizes independently within calm, choppy and stressed. The strategy then switches parameters as the regime switches — different behaviour for different weather.
\boldsymbol\theta^*_g = \arg\max_{\boldsymbol\theta}\;\mathcal O\big(\text{backtest}(\boldsymbol\theta)\mid \text{regime}=g\big), \quad g\in\{\text{calm},\text{choppy},\text{stressed}\}3.13 Regime Gmm
Gaussian mixture — cluster days into regimes, count chosen by BIC.
Treats each day as a point in (return, volatility) space and fits a Gaussian mixture; the Bayesian Information Criterion picks how many regimes the data actually support. States are vol-sorted and short runs de-noised. The rigorous detector the Per-Regime and Regression optimizers were designed around.
p(\mathbf x) = \sum_{k=1}^{K}\pi_k\,\mathcal N(\mathbf x\mid\boldsymbol\mu_k,\boldsymbol\Sigma_k), \qquad K^* = \arg\min_K \text{BIC}(K)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.
“NASDAQ 100, selected by statistical / factor criteria, traded via enter long when RSI (length=7) crosses below 30; exit when RSI (length=7) crosses above 70, conditioned on the wired regime classifier, 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, is expected to generate positive risk-adjusted returns over the forward test window.”
The same hypothesis was sealed independently at every step — registered before each step's out-of-sample window was scored:
| # | Anchor | Registered at |
|---|---|---|
| 1 | 2011-01-01 | 2026-07-24 |
| 2 | 2012-01-01 | 2026-07-24 |
| 3 | 2013-01-01 | 2026-07-24 |
| 4 | 2014-01-01 | 2026-07-24 |
| 5 | 2015-01-01 | 2026-07-24 |
| 6 | 2016-01-01 | 2026-07-24 |
| 7 | 2017-01-01 | 2026-07-24 |
| 8 | 2018-01-01 | 2026-07-24 |
| 9 | 2019-01-01 | 2026-07-24 |
| 10 | 2020-01-01 | 2026-07-24 |
| 11 | 2021-01-01 | 2026-07-24 |
| 12 | 2022-01-01 | 2026-07-24 |
| 13 | 2023-01-01 | 2026-07-24 |
| 14 | 2024-01-01 | 2026-07-24 |
| 15 | 2025-01-01 | 2026-07-24 |
5 Discussion
A discussion interprets empirical findings. Until the walk finishes and logs performance numbers for the two arms against their identical validation windows, there are no results to read. To preserve the integrity of the sealed hypothesis and avoid post-hoc narrative, I will wait for the walk to score before drafting how Arm A (static RSI-7 optimizer) and Arm B (per-regime RSI-14 optimizer with GMM regime detection) actually performed relative to each other.
Pooled deflated Sharpe is the inferential number; the per-step DSR track is illustrative (near-identical variants are correlated, so per-step N over-deflates). N is a conservative upper bound on the multiple-testing penalty, frozen at compile time and taken as the larger of the lineage trial count and the explored-runs count so it cannot understate the search. Integrity rests on sealed hypotheses: each step's submitted_at is the order in which its hypothesis was registered, auditable against when its out-of-sample window was scored. The windows themselves are historical.
Motivation
This study examines whether incorporating regime awareness into the optimization process yields more predictive trading systems than static parameter selection. We deploy a walk-forward framework across 15 steps, spanning from 2011 through 2025, to test this question on the Nasdaq 100 universe.
Arm A employs a static optimizer, tuning RSI parameters with length 7 once per in-sample window and applying those fixed parameters across the subsequent out-of-sample test period. Arm B uses the same RSI signal structure but with length 14, conditioned on a Gaussian-mixture regime classifier that segments market states based on volatility and return patterns. Critically, Arm B re-optimizes its entry and exit thresholds independently within each detected regime, rather than seeking a single best parameter set. Both arms select from the same composite-scored pool of top 10 constituents by Hurst exponent, half-life, and stationarity metrics.
The manipulated variable is the optimization regime itself: Arm A holds parameters static across all market conditions in the test window, while Arm B adapts its parameters to the macro state it observes. This design isolates whether regime-aware parameter tuning produces superior predictive validity—that is, whether accounting for shifts in market structure during in-sample fitting leads to more robust performance when those market states recur out-of-sample. We measure this contrast through rolling walk-forward validation: a 252-day in-sample optimization window followed by a 63-day test window, stepped forward by 63 days, repeated across 15 steps. The out-of-sample results have not yet been scored and will reveal whether the regime-aware system's added complexity translates to measurable improvement in risk-adjusted returns.
References
- 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.
- 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.
- Harvey, C. R., Liu, Y., & Zhu, H. (2016). … and the Cross-Section of Expected Returns. Review of Financial Studies, 29(1), 5–68.
- Lo, A. W. (2002). The Statistics of Sharpe Ratios. Financial Analysts Journal, 58(4), 36–52.
Appendix A Reproducibility in QuanterLab
Each step is backed by a frozen run report. The study is re-derivable from the ledger below.
| # | Commit | Report | Anchor | OOS window |
|---|---|---|---|---|
| 1 | 66ff2b275849 | 268 | 2011-01-01 | 2011-01-03 → 2011-12-30 |
| 2 | b62735fc09f0 | 269 | 2012-01-01 | 2012-01-03 → 2012-12-31 |
| 3 | 7aede40fa0dc | 270 | 2013-01-01 | 2013-01-02 → 2013-12-31 |
| 4 | b448d206a540 | 271 | 2014-01-01 | 2014-01-02 → 2014-12-31 |
| 5 | 0c51cee24dce | 272 | 2015-01-01 | 2015-01-02 → 2015-12-31 |
| 6 | bcafb4f5cb51 | 273 | 2016-01-01 | 2016-01-04 → 2016-12-30 |
| 7 | 69b71a995d79 | 274 | 2017-01-01 | 2017-01-03 → 2017-12-29 |
| 8 | caf74981ddf2 | 276 | 2018-01-01 | 2019-01-02 → 2019-12-31 |
| 9 | 403f59583278 | 278 | 2019-01-01 | 2019-01-02 → 2019-12-31 |
| 10 | 23aa21afe954 | 279 | 2020-01-01 | 2020-01-02 → 2020-12-31 |
| 11 | f82540f9abd0 | 280 | 2021-01-01 | 2021-01-04 → 2021-12-31 |
| 12 | a52d694ce260 | 281 | 2022-01-01 | 2022-01-03 → 2022-12-30 |
| 13 | b66d0e51cd52 | 282 | 2023-01-01 | 2023-01-03 → 2023-12-29 |
| 14 | 92bba7cc69e9 | 283 | 2024-01-01 | 2024-01-02 → 2024-12-31 |
| 15 | e6ab5dcff61b | 284 | 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: full_kelly
Step 2 · 2012-01-03 → 2012-12-31
Position sizing — sizing: full_kelly
Step 3 · 2013-01-02 → 2013-12-31
Position sizing — sizing: full_kelly
Step 4 · 2014-01-02 → 2014-12-31
Position sizing — sizing: full_kelly
Step 5 · 2015-01-02 → 2015-12-31
Position sizing — sizing: full_kelly
Step 6 · 2016-01-04 → 2016-12-30
Position sizing — sizing: full_kelly
Step 7 · 2017-01-03 → 2017-12-29
Position sizing — sizing: full_kelly
Step 8 · 2019-01-02 → 2019-12-31
Position sizing — sizing: full_kelly
Step 9 · 2019-01-02 → 2019-12-31
Position sizing — sizing: full_kelly
Step 10 · 2020-01-02 → 2020-12-31
Position sizing — sizing: full_kelly
Step 11 · 2021-01-04 → 2021-12-31
Position sizing — sizing: full_kelly
Step 12 · 2022-01-03 → 2022-12-30
Position sizing — sizing: full_kelly
Step 13 · 2023-01-03 → 2023-12-29
Position sizing — sizing: full_kelly
Step 14 · 2024-01-02 → 2024-12-31
Position sizing — sizing: full_kelly
Step 15 · 2025-01-02 → 2025-12-31
Position sizing — sizing: full_kelly