Autonomous 24-hour BTC profit-mining research loop — a long/flat trend base plus an 8h momentum overlay, using the 15-minute Binance archive only. Every number below comes from an engine that reconciles exactly to the project’s reference daily backtester, and every idea is pre-registered before it is run. Killed = failed a pre-registered DEV or control condition, never promoted. Promoted = beat the incumbent on DEV and held up on a VAL look. Click a row’s ▸ for the full reasoning.

Iteration 8 complete · 11.4 h elapsed of 24 · 1 VAL look used · promotion bar: Calmar +0.10 (base bar) · last updated 2026-09-07 09:12 UTC

DEV 2017-01-01–2022-12-31 (archive opens 2017-08-17) · VAL 2023-01-01–2024-12-31 · LOCKBOX 2025-01-01–archive end, opened only at hour 12 and hour 24. All figures 8 bps/side.

Leaderboard

#iddescriptionDEV CAGRDEV DDDEV CalmarDEV SharpeVAL CAGRVAL DDVAL CalmarVAL Sharpestatus
1INCIncumbent: EMA-50 long/flat base (exit close<SMA-50) + 8h momentum overlay, always allowed72.9%-63.2%1.151.14154.1%-29.1%5.292.19Incumbent
2INC-flatSame, overlay only while the base is flat69.9%-62.0%1.131.19————Variant
2=INC-L050Incumbent at the survival leverage (Q04): identical book, every position x0.5040.4%-37.9%1.061.19————Standing decision
3BASEEMA-50 long/flat base, 1x, no overlay (anchor 00:00)56.6%-60.7%0.931.12102.6%-29.2%3.511.95Reference
—MLCMatched-leverage control for INC (1.11x base)53.1%-68.0%0.781.04————Control
—D-001Tranched base 00/08/16 (killed iter 1)62.3%-58.1%1.071.2093.7%-29.3%3.201.85Killed
—D-002Horizon ensemble EMA 20/30/50/75 (killed iter 2)45.9%-58.2%0.791.03————Killed
why
D-002's row is on the warm-up-matched basis (every config forced flat until period 94, common start ~2017-11-19) and is NOT comparable to the rows above it. Its own control, the identical anchor-0 base, scores 39.8% / -60.7% / 0.66 / 0.92 on that basis versus 56.6% / -60.7% / 0.93 / 1.12 on the leaderboard basis. See the start-date standing fact below.
—D-003Overlay-when-flat as its own module, best cell s=1.5 / h=64 (killed iter 3)84.1%-53.4%1.581.20————Killed
—INC-M057Incumbent composite at its continuous survival multiplier m*=0.573 (iter 5; the continuous form of INC-L050)45.3%-42.3%1.071.17————Reference
—D-004Vol-targeted composite s=clip(0.30/vol20d,0,2) at its survival multiplier m*=1.262 (killed iter 5)65.6%-46.7%1.401.31————Killed

All iterations (8)

iterideastatusdetails
8Q39 (+Q15) — does the incumbent overlay clear its own ENTRY null?Passed — certified
expand

Hypothesis: The champion overlay's entry rule (52-bar momentum >= 2.6816% and volume z-score >= 3.7206) carries measurable information about forward returns. If it does, the incumbent composite must score above the 95th percentile of 200 random-entry schedules that are matched on trade count, base-state mix and every other champion mechanic. If it does not, the entry half of the champion genome is, on DEV, indistinguishable from a coin flip — which is what iteration 7's finding 6 already showed for its exit half (the incumbent sits at the 43rd percentile of the exit null it kills challengers with).

DEV verdict: **PASS — the champion overlay's entry rule carries measured information, and this is the first positive certification in the loop's history.** The pre-registered PASS branch required the incumbent to clear the null's 95th percentile on both scorings; it cleared on both at the 99.5th percentile, by 13.17 sd of the bar on Calmar and 14.66 sd on CAGR-at-matched-survival, with a match guard that came in at 0.0% and a null that was deliberately built stronger than a pure information-free control (the null's trades still pyramid on the champion's own momentum/volume add rule, so the bar it sets is conservative). Three qualifications travel with the verdict and are not softened: (i) on DEV_H2 alone the incumbent does not clear this bar (0.762 vs 0.823), so what is certified is a full-DEV effect with a 4.69:1 H1 lean; (ii) the null randomises the *initial entry trigger* only — the add rule, stop, hold ceiling and sizing are the champion's, so this certifies the entry trigger in the context of the rest of the genome, not in isolation; (iii) nothing here is a promotion, because Q39 proposed no configuration. Read against iteration 7's finding 6, the two results together are the substantive finding: the champion genome's information is in its entries, not its exits. Same book, same window, same style of null — entry side 99.5th percentile, exit side 43rd percentile (below the median of its own null). The GA found an entry rule and, as far as DEV can measure, a coin flip for an exit.

VAL: not run. No VAL look was taken, under any outcome, exactly as pre-registered. val_looks stays 1; the promotion bar stays at the section-5 base.

Outcome: PASS — the incumbent's entry rule is certified. Q39 done, Q15 done. Nothing was promoted and nothing was killed: DEAD.md is unchanged and no leaderboard row moved, because this iteration tested the incumbent rather than a challenger. Per the pre-registered PASS branch, Q16 stays live (its note is updated with the entry/exit asymmetry, which says what a GA rerun should and should not search). Two standing controls are adopted, both additive and neither touching section 5's thresholds: Q46, the entry-rule null as the entry-side sibling of Q27/Q34, now priced at MDE50 0.350 Calmar; and Q45, percentile-in-own-null reporting with the incumbent included, of which this entry is the first full application. STATE.iteration -> 9, val_looks stays 1, lockbox_opened stays empty.

7Q40 minimum-detectable-effect auditDone — no verdict
expand

Hypothesis: Each of the loop's four standing nulls imposes a minimum detectable effect (MDE) — the smallest true edge an idea must carry before it reliably clears that null's bar — and those floors are larger than the effects most queued ideas can plausibly produce. If so, the iteration-6 synthesis's central claim ("the measurement noise floor exceeds the effects the loop is hunting") stops being a rhetorical summary of three near misses and becomes a number, and the remaining queue can be re-ranked by expected effect against it.

DEV verdict: INCONCLUSIVE — by construction, and the audit is complete. Q40 is a measurement of the loop's instruments, not a strategy test: it cannot promote or kill any configuration, and it did neither. Its deliverables — the MDE table and the mechanical queue re-rank — are both produced. The pre-registered self-falsification test did not fire (answer FALSE), so the iteration-6 synthesis's central claim stands as written.

VAL: not run. No VAL look was taken, under any outcome, exactly as pre-registered. val_looks stays 1; the promotion bar stays at the section-5 base. Queue…

Outcome: Q40 done. Nothing promoted, nothing killed, DEAD.md unchanged, LEADERBOARD.md rows unchanged (standing facts added). STATE.iteration → 8, val_looks stays 1, lockbox_opened stays empty.

6CONSOLIDATION (section 4, step 10)Consolidation
expand

Hypothesis: None — this is the loop's first consolidation pass, not a test. Section 4 step 10 requires that every 6th iteration re-read the full ledger, prune the queue, write five new hypotheses of which at least two are structurally new, and put a 10-line synthesis at the top of LEADERBOARD.md. No engine was run, no grid was scored, no window was opened, and nothing was promoted or killed. The one claim this entry does make is a meta-claim about the loop itself, stated in the DEV verdict below.

DEV verdict: N/A — consolidation pass, nothing promoted and nothing killed. The substantive output is the synthesis now at the top of LEADERBOARD.md. Its two load-bearing claims, both of which are conclusions about the loop rather than about a strategy: 1. The loop's measurement noise floor is larger than the effects it is hunting. Four independent lotteries have now been measured — signal hour 23.1 CAGR pts, start date 16.8 pts, exit timing ~1.8 Calmar, leverage path 11.4%-115.5% CAGR at equal survival — against candidate effects of +0.10 to +0.42 Calmar. That is why three of four ideas died at a null rather than at the incumbent, and why all three deaths were near misses. It is also the honest reason the loop has zero promotions: not that the ideas were bad (D-004 beat constant leverage in 9 cells out of 9 with an edge that grows with cost), but that at n = 200 draws and a 95th-percentile bar, this loop cannot separate a +20-CAGR-point effect from its own timing noise. Q40 is queued to quantify exactly that, because it changes which of the 27 remaining todo items are worth an iteration at all. 2. **Every idea tested so far is a re-timing or a re-sizing of the incumbent's existing position path; none added new information.** Q01 re-timed the base signal, Q02 re-weighted base horizons, Q03 re-timed overlay exits, Q04 and Q08 re-sized the whole book. Tier 3 — the only tier that adds a new signal — is untouched after five iterations. A loop that only ever redistributes one signal's exposure is bounded by that signal, and the four lotteries say the redistribution axis is mostly noise. Corrected by raising Q10-Q13 and by Q42, which measures flat-regime predictability before anything is built on it. A third observation, recorded because it constrains iterations 7-12 rather than because it resolves anything: **the incumbent has never been scored against any of the four nulls it uses to kill challengers. That asymmetry is not defensible on its own terms, and Q39** removes it.

VAL: none (consolidation — no window opened). val_looks stays 1.

Outcome: Consolidation complete. All six pre-registered deliverables met: (a) full ledger re-read (iters 1-5, 1064 lines); (b) queue pruned — Q23/Q27/Q30/Q34 moved todo -> done as adopted standing policy rather than pending tests, Q21 folded into Q07 and Q37 into Q31/Q33, Q25 marked blocked on its own pre-condition Q22, Q14 marked blocked on Q27/Q26, and Q10-Q13 raised (Q11 to pri 1) with Q29 raised to pri 2 because it gates Q20's by-year half; (c) five new hypotheses Q38-Q42 appended, of which **three (Q38, Q39, Q42) are structurally new**, against a requirement of two; (d) the 10-line synthesis is at the top of LEADERBOARD.md; (e) todo stands at 27 of 42 items, far above the floor of 5; (f) nothing removed from DEAD.md or QUEUE.md — every prior entry is still present with its original text. No leaderboard row changed, val_looks unchanged at 1, no engine modified.

5Q08 vol targeting under the survival criterionKilled
expand

Hypothesis: A time-varying leverage path that targets constant realized volatility (the vt50/vt70 family of trend_study test 4, which D-000e killed on Calmar) survives Q04's block-bootstrap criterion at a higher CAGR than flat de-levering does — i.e. at matched survival (bootstrap 95th-percentile DD better than -60%), vol targeting buys back some of the 32.5 CAGR points that constant de-levering to L* = 0.50 costs. If it does not, the "shape" of the leverage path is worth nothing and only its level matters.

DEV verdict: KILL. Three of the four pre-registered primary conditions pass, two of them by wide margins — (a) +44.7% relative CAGR at matched survival against a +10% bar, (c) a flat parameter surface, (d) same-signed in both halves — and **(b), the scale-alignment null, fails at the 94th percentile against a >95th requirement.** This is the third time in four test iterations (2, 3 and 5) that a pre-registered control, not the incumbent, is the single binding constraint. The reading: - The null is a genuine near-miss, not a formality, and the honest statement cuts both ways. Unlike iter 3 — where the null's median draw (1.19 Calmar) already beat the incumbent (1.15), so the rule was doing nothing — here the null's median draw scores 37.5% against constant leverage's 45.3%: a randomly re-timed leverage path with the identical marginal distribution is, more often than not, worse than not varying leverage at all (only 26% of the 200 draws beat B0). So leverage-path timing clearly carries information. What the test says is narrower and still decisive: **5.5% of random re-timings match or beat the chosen cell**, and the pre-registered bar was 5%. The effect is not separated from the lottery at the confidence level fixed in advance. Section 10 forbids moving the threshold after the run started, and the miss is one percentile. - And the 94th percentile is before any multiple-comparison penalty. The chosen cell is the max of 9, selected after seeing all 9. A null-percentile computed on a max-of-9 statistic is optimistic; correcting for the selection can only push it further below the bar. - *C3's plateau is partly an artefact of the m normalisation, and this is worth more than the verdict.** When the cap does not bind, s_t = target / vol_t, so scaling target by any constant is exactly absorbed by the uniform survival multiplier: target x0.75 came back with m* 1.685 against the chosen cell's 1.262, and 0.225 x 1.685 = 0.379 = 0.300 x 1.262 — the two rows are the same leverage path to 3 decimals, which is why their CAGRs agree to 0.1%. On the chosen cell the cap binds on 0.0% of DEV bars. So of the two "parameters", one is perfectly collinear with m* and the other is inert at the chosen cell: **at matched survival the 9-cell grid is really a one-parameter family, indexed by how often the cap binds**, and the family interpolates between pure 1/vol sizing (cap never binds: 65.6%) and constant leverage (cap always binds: B0's 45.3%). The four "neighbours" of condition (c) were never four independent perturbations, and I am recording that rather than banking the PASS. - C5 passes on the sign and is a 27.6:1 split — worse than iter 3's 10:1. The chosen cell's own survival multiplier is 2.122 in DEV_H1 and 1.087 in DEV_H2; almost the whole measured advantage is the 2017-2019 half. No VAL look taken. val_looks stays 1.

VAL: not run (primary failed). val_looks still = 1.

Outcome: KILL, logged as D-004 — a separate entry from D-000e, which killed vol targeting on the base signal under a Calmar rule. Not promoted to the leaderboard. Post-verdict diagnostics (runs/iter05-Q08/postverdict.py; computed after the verdict above was fixed, used for the queue and the findings, not for the decision): - All 9 cells beat B0, by +6.7 to +20.2 CAGR points at equal survival (median +10.6), with Calmar 1.14-1.40 against B0's 1.07. The family effect is uniform in sign; it is the size that the null cannot separate from noise. - The vol-target scale barely tracks the book's own risk. On DEV, `corr(scale_t, |gross return_t|) = -0.093` — the scale is computed from BTC price volatility, but the composite's realized risk is price vol times an exposure path that moves independently (base long/flat, overlay pyramid). corr(scale_t, exposure_t) = -0.006: the two are simply unrelated. Whatever the family is earning, it is not earning it by accurately anticipating the book's risk — which is the mechanism vol targeting is supposed to have. - corr(scale_t, gross return_t) = +0.019 — no directional luck in the scale path. - Scale distribution on DEV before m*: p05 0.22 / p50 0.47 / p95 0.97, mean 0.51; after m* = 1.262 the mean leverage is 0.642 against B0's 0.567 on the same average basis (+13.2%; +12.1% against B0's constant 0.5731 before the warm-up zeros are averaged in). The vt family is allowed to run 12% more average leverage at the same survival, which is the concrete form of "the risk is better distributed across time".

4Q04 leverage by survivalDone — no verdict
expand

Hypothesis: The incumbent composite's portfolio leverage of 1x was never chosen — it is the engine's default. Choosing it instead by a survival criterion (block-bootstrap 95th-percentile drawdown better than -60%) yields a leverage L* that is defensible out of sample, and if L* != 1 it re-levels every row on the leaderboard.

DEV verdict: **the primary question is answered — L* = 0.50 — and the secondary (leaderboard) conditions FAIL, exactly as the pre-registration anticipated.** Condition (b) requires the candidate's CAGR not to be lower than the incumbent's; de-levering to 0.5x takes DEV CAGR from 72.9% to 40.4%, so (b) fails by 32.5 points and (a) fails too (Calmar 1.06 vs the incumbent's 1.15, i.e. -0.09, not +0.10). Conditions (c), (d), (e) and (f) all pass — the drawdown is 25.3 points better, it beats matched leverage 1.06 vs 0.76, the plateau is flat, and both DEV halves de-lever. Per the pre-registered rule this is therefore recorded as a **standing leverage decision and risk statement, NOT a promotion, and no VAL look is taken. val_looks stays 1**.

VAL: none. Not run, by the pre-registered rule.

Outcome: Q04 DONE, deliverable produced. Not a kill (nothing was falsified) and not a promotion. Added to LEADERBOARD.md as the variant row INC-L050 with VAL unlooked, alongside the incumbent, in the same way INC-flat sits there.

3Q03 overlay-when-flat as its own moduleKilled
expand

Hypothesis: The base's LONG periods and its FLAT periods are different regimes for the 8h momentum overlay (section 0: most of the overlay's value arrives while the base is flat, in bear-market rallies), so giving the flat regime its own overlay exit rule — wider stop and a hold ceiling extended from 8h to as much as 24h — raises composite DEV Calmar by at least 0.10 over the incumbent, which uses one config in both regimes.

DEV verdict: KILL. Seven of the eight pre-registered conditions pass — (a) +0.42 vs the +0.10 bar, (b) CAGR +11.2 points, (c) drawdown 9.8 points better, (d) beats matched leverage 1.58 vs 0.77, (e) a real plateau, (f) same-signed in both DEV halves, (h) positive at 4/4 base anchors — and **(g), the exit-rule null, fails: 83rd percentile against a >95th requirement.** That single failure is the whole result, and it is not a technicality: - The null holds every flat-regime overlay trade for a random number of bars with the same mean as the chosen cell and no stop at all. Its median draw scores Calmar 1.19, already above the incumbent's 1.15 — so simply *holding flat-regime overlay trades ~2x longer* recovers most of the story, with no rule at all. And its spread is enormous (0.59 to 2.37): flat-regime exit timing alone moves DEV Calmar by ~1.8 points. A +0.42 edge cannot be distinguished from that noise, which is exactly what section 5's control exists to detect. - Read together with the grid, the surface says the same thing: the effect is driven by the hold ceiling, not by the stop. At a fixed stop, h = 32 -> 64 is worth +0.24 on its own; the stop multiplier adds at most +0.15 by itself; and h = 96 gives most of it back in every stop column (+0.08 / -0.03 / +0.00). "Wider stop AND longer hold" is not the mechanism. - C6 makes it worse: +1.24 Calmar in DEV_H1 versus +0.12 in DEV_H2, where the CAGR delta is actually negative. The condition tests the sign and the sign held, but a 10:1 split is a one-period result wearing a two-period sign. No VAL look taken. val_looks stays 1. Post-verdict diagnostics (computed after the verdict above was fixed; used for the queue, not for the decision): - DEV-window PnL attribution by base state (runs/iter03-Q03/attrib_dev.py, sum of realized PnL / equity-at-entry, DEV only): incumbent — long-regime 178 trades +55.3%, flat-regime 144 trades +103.2%; chosen cell — long-regime 177 trades +57.7%, flat-regime 135 trades +152.7%. So section 0's claim replicates on DEV in this engine: **the overlay earns roughly 2:1 in favour of the flat regime**, and the chosen cell's gain really does land in the flat book (+49.5 points) rather than leaking in from the untouched long book (+2.4 points, a pure equity-path/blocking effect). This is a partial, DEV-only answer to Q20, which stays queued for the by-year and by-trade parts. - Disclosure: composite2's raw pnl_by_state counter aggregates the whole archive, so the copy of it inside dev_results.json contains VAL- and LOCKBOX-period PnL. I saw those two aggregate numbers after the DEV verdict had already been computed and printed; they fed no condition and no cell choice, and they are excluded from every number reported above. The attribution quoted here is recomputed DEV-only from per-trade records. Queued as Q29 so the engine cannot leak a window again.

VAL: not run

Outcome: KILL, logged as D-003. Not promoted to the leaderboard.

2Q02 horizon ensembleKilled
expand

Hypothesis: Replacing the base's single EMA-50 long/flat gate with the equal-weighted mean of four EMA-n long/flat gates (n = 20/30/50/75, continuous 0-1 position) diversifies away part of the single-horizon lottery and raises Calmar without costing CAGR — and, unlike Q01's tranching, does so on the anchor-mean basis Q18 demands, not just at anchor 0.

DEV verdict: KILL — six of the seven pre-registered conditions pass, but **(e), the Q18 anchor-mean bar, fails**: +0.079 against a +0.10 requirement. Per section 10 the threshold cannot be moved after the run started, and this condition is the entire reason the iteration was framed this way, so the narrow miss is decisive. No VAL look taken; val_looks stays 1. For the record, the honest reading of the near-miss cuts both ways: - Better than D-001 in kind. Tranching's family mean was +0.03 on 6/8 cells; this is +0.079 on 19/24 cells, same-signed in both DEV halves, on a genuinely flat parameter plateau (1.7% / 4.5%). It is not the anchor-0 lottery reappearing. - But the mechanism is not "averaging helps". At anchor 0 the ensemble's 0.79 exactly matches its best single member (EMA-75, 0.79) and barely beats EMA-20 (0.78) — it beats EMA-50, which is simply a poor horizon here (0.66, worse than three of the four members and worse than the ensemble's own -25% and +25% neighbour sets). The gain may be "EMA-50 is the wrong length" rather than "four lengths beat one". The clean discriminator — every single horizon scored on the 24-anchor mean — is exactly the cell I am not allowed to add after seeing this, so it is queued as Q22, not run here. - The turnover is real: 3.0x the trades and +0.32 points/yr of fee drag, and C6 shows the anchor-mean edge shrinking to +0.04 by 30 bps.

VAL: not run (DEV failed). val_looks still = 1.

Outcome: KILL, logged as D-002. Not promoted to the leaderboard.

1Q01 tranched baseKilled
expand

Hypothesis: Splitting the base's signal timing across three anchors (00/08/16 UTC) at 1/3 weight each removes most of the inherited 13.4-CAGR-point signal-hour lottery and raises Calmar without costing CAGR.

DEV verdict: PROMOTE — all six pre-registered conditions met (a) +0.14 >= +0.10, (b) +5.7 >= 0, (c) DD 2.6 points better, (d) beats matched leverage, (e) same sign in both halves, (f) 6/8 triples. Recorded caveat, written before the VAL look: the chosen triple {0,8,16} is the best of the 8, and the family mean is only +0.03 over anchor-0 — so most of the +0.14 is the anchor-0 lottery reappearing, not a generic tranching effect. The cell was fixed by section 7's seed text before any result was seen, which is the only reason +0.14 is admissible at all.

VAL: run — see table below

configCAGRMax DDCalmarSharpe
anchor-0 base102.6%-29.2%3.511.95
tranched 00/08/1693.7%-29.3%3.201.85
delta-8.8 pts-0.1 pts-0.32-0.10
INCUMBENT (base + overlay), reference154.1%-29.1%5.292.19

Outcome: KILL. The DEV edge (+0.14 Calmar, stable across both DEV halves) reverses on VAL (-0.32) — tranching loses to its own single-anchor control out of sample, and both sit far below the incumbent composite's VAL Calmar of 5.29. Combined with the control-5 family mean of +0.03, the conclusion is that the anchor lottery, not tranching, produced the DEV result. Split-stability across two DEV halves was not sufficient to predict VAL here — worth remembering.

Inherited dead ideas from before this loop started (5) — never retested
idideareason
D-000aAny short-side mechanic (daily or intraday)Inherited: short leg negative in 6/6 up years; Calmar never beat long/flat.
D-000b8h momentum overlay as a standalone strategyInherited: only viable layered on the base.
D-000c3-day trend filtersInherited: no edge.
D-000dHour-of-day filters on the overlayInherited: did not replicate across DEV year halves.
D-000eVol targeting scored on Calmar (vt50/vt70, cap 1.5/2.0)Inherited test 4: best cell Calmar 0.88 vs 1x 0.85, lost to matched-exposure control 0.95. (Queue item 8 revisits ONLY under the bootstrap-survival criterion — different decision rule, not a requeue…