Turtle Report
Real walk-forward results, not a plan -- lives in its own sibling repo, jrodimusprime/BTC-Turtle-Trader. This page mirrors that repo's TURTLE_WHITEPAPER.md.
What is a Turtle Trader?
"Turtle Trading" is a real, famous trend-following system taught to a group of novice traders (the "Turtles") by Richard Dennis and William Eckhardt in 1983, to settle a bet over whether trading could be taught as a rulebook rather than an innate talent. The core idea is simple: don't predict, react. Instead of guessing where price is going, wait for it to prove a real move is underway by breaking out of its own recent range, then ride that move with strict, mechanical risk rules -- and the same rules decide when you're wrong and get you out, no discretion involved.
Three moving parts, all mechanical:
- Entry -- the Donchian channel breakout. Track the highest and lowest close over the last 20 days (and a slower 55-day channel as backup). If price closes above that 20-day high, that's a signal something new is happening -- buy.
- Sizing & pyramiding -- ATR units. Position size is set so a 1-unit adverse move (measured in ATR, Average True Range -- a volatility yardstick) costs a fixed 1% of equity, not a fixed dollar amount -- the same rule sizes down automatically in a wild market and up in a calm one. As the trade moves further in your favor (every 0.5×ATR), add another unit, up to 4 -- winners get more capital committed, not losers.
- Exit -- whichever comes first. A trailing stop 2×ATR below the highest price reached since entry (it only ever moves up, never back down), or price closing back below the shorter 10-day low channel. No target price, no discretion -- the trend either keeps going or one of these two rules gets you out.
Long-only in this build -- short breakouts (price closing below the low channel) are detected but never traded, since BTC perpetual funding costs aren't modeled in this project's data pipeline. Data needed: a live decision never looks back further than 55 days (the slow entry channel; ATR needs 20, the exit channel needs 10) -- the live traders bootstrap from the full ~9-year archive so their channels are correct from the first tick, but the rules themselves are a short-memory, mechanical system by design.
Schematic, not real price data -- illustrates the mechanism. See it running for real on Turtle Traders (Leonardo Conti, plain; Donatello Ferrari, GBT-filtered).
Bottom line
Not with the original 9-feature filter -- but an expanded rigor pass found a specific, real reason why, not just a dead end. The GBT classifier underperformed simply trading every breakout in 4 of 5 blocks where it actually screened anything, and lost to a random filter matched to its own accept rate in 3 of 5 -- worse than randomly thinning trade frequency at the same rate, the exact control this project treats as mandatory before trusting a model result. A follow-up feature-ablation test found the trend/regime features were actively hurting it: dropping them and retraining on the remaining 5 (ATR, channel position, volatility regime, rolling win-rate) improved 5 of 6 blocks, sometimes substantially (2022: -25.7% → -14.4%; 2024: -6.0% → +3.7%, flipping loss to gain) -- see below. Separately, and more strikingly: the entire turtle system, filtered or not, was beaten badly by simple buy-and-hold in every genuine bull-market block tested, only earning its keep during real drawdowns -- the same crash-avoidance-not-alpha signature the main GA project's own WHITEPAPER.md already found, now replicated on a completely different strategy family (daily breakout trend-following) and data representation (real OHLC). Two further experiments: adding shorts (price P&L only, no funding cost modeled) is regime-legible, not free money -- it helps in every down-leg block and hurts in every sustained uptrend block, close to a wash in aggregate. And the same system at 1-minute resolution is a total wipeout in all four regimes tested (9-12% win rate, ~2,000+ trades in 45 days, ~7-minute average hold) -- a clean, dramatic replication of this project's own earlier finding that short holding periods erase the edge entirely. A follow-up hourly-resolution test then surfaced a genuine, previously-invisible gap: turtle position sizing has no cap on implied leverage, and an extended winning streak (2019, hourly) compounded it into a $1.86M peak from $10k starting equity -- not real skill, a sizing-formula artifact now flagged as the single most actionable finding on this page. A follow-up genetic algorithm that evolves the turtle's own PARAMETERS (channel lengths, ATR window, stop distance, pyramid step, risk-per-unit) across 4 separate experiments found genuinely different stories per resolution: at daily resolution the GA's training-set "wins" are mostly inflated by 1-2 outlier blocks and mostly evaporate on a genuinely held-out block (long-only: a wash; long+short: a real edge, +26.4pp vs classic's +4.2pp holdout excess). At minute resolution, evolution cannot rescue the strategy at all -- every genome tested, including ones that evolved toward minimal risk, still lost 92-100% of equity in every regime. See "Turtle-Parameter GA" below. The daily long+short winner is now live as "Michelangelo Bianchi." Repeating that same experiment on gold and oil (real daily data, Plus500's actual 20×/10× retail leverage tiers instead of BTC's 2×) produced a clean negative result: the evolved genome loses to classic parameters on both assets' held-out block, badly -- see "Turtle-Parameter GA on gold and oil" below.
Two systems, one shared backbone
Plain turtle -- every long Donchian breakout (20-day fast / 55-day slow channel) is taken, ATR-based unit sizing (1% equity risk per unit), pyramiding to 4 units on 0.5×ATR favorable moves, 2×ATR trailing stop, opposite 10-day channel exit. This is the actual baseline, not a strawman.
NN/GBT-filtered turtle -- a gradient-boosted-trees classifier gates which breakouts get taken, trained on a binary follow-through label (did price move 2×ATR in the breakout direction before reverting 1×ATR against it, within 10 bars), using 9 price-derived features (ATR, channel position, SMA distances/slope, volatility regime, rolling breakout win-rate). The filter can only ever reject a signal -- sizing, pyramiding, stops, and exits are identical either way, so the model can never touch risk or leverage directly.
Data gap, flagged not hidden: no volume at any resolution, no funding-rate/open- interest/cross-asset data anywhere in this project's pipeline -- the original design doc's feature list included those; this build's 9-feature set does not.
Results by regime block
True walk-forward, not k-fold: each block's classifier trained only on breakout events strictly before that block starts. Bold marks whichever of plain/NN-filtered did better in blocks where the filter actually screened out signals.
| Block | Plain turtle | NN-filtered | Random filter | Buy & hold | NN accept rate |
|---|---|---|---|---|---|
| 2017-2018 mania/bear | +36.9% | +36.9% (no filter yet) | +36.9% | -13.6% | 1.00 |
| 2019 chop | +135.4% | +135.4% | +135.4% | +89.5% | 1.00 |
| 2020 COVID/recovery | +223.5% | +218.1% | +208.9% | +301.7% | 0.71 |
| 2021 bull/crash | +1.7% | -11.2% | -4.1% | +57.6% | 0.25 |
| 2022 bear | -25.7% | -25.7% | -25.7% | -65.3% | 1.00 |
| 2023 recovery | +27.5% | +10.0% | +17.4% | +154.5% | 0.67 |
| 2024 bull | +5.8% | -6.0% | +2.3% | +111.8% | 0.30 |
| 2025-2026 recent | -23.6% | -4.1% | -22.3% | -18.3% | 0.40 |
Expanded rigor pass: 3 gaps closed, one real finding
Multi-seed replication surfaced a methodology gap, not the answer it was meant to give. Varying the GBT's random seed across 10 runs produced zero variance in 6 of 7 blocks -- gradient boosting's default settings make it nearly deterministic given fixed data, so seed alone isn't a meaningful stochasticity source the way population initialization is for a GA. Flagged as a real gap in this test's own design, not hidden.
Threshold sweep (0.45-0.70): modest, block-specific sensitivity, doesn't overturn the headline result even at the most permissive setting tested.
Feature ablation is the real finding. Zeroing the 4 trend/regime features (SMA-distance ×3, SMA50 slope) and retraining on the remaining 5 improved 5 of 6 comparable blocks:
| Block | Full features | Trend features ablated | Δ |
|---|---|---|---|
| 2020 COVID/recovery | +205.9% | +208.2% | +2.3pp, far more stable |
| 2021 bull/crash | -11.2% | -4.4% | +6.8pp |
| 2022 bear | -25.7% | -14.4% | +11.3pp |
| 2023 recovery | +10.0% | +11.6% | +1.6pp |
| 2024 bull | -6.0% | +3.7% | +9.7pp, flips loss to gain |
| 2025-2026 recent | -4.1% | -2.5% | +1.6pp |
The leaner classifier's 2022 and 2025-2026 results now genuinely beat plain turtle (-25.7%/-23.6%) by a wide margin. The trend features weren't neutral padding -- they were actively hurting the classifier, plausibly because they're highly correlated with the same price action the Donchian rule already uses to trigger. This doesn't overturn "the original filter didn't help" -- it explains a real reason why, and points at a specific, testable improvement rather than a dead end.
Long+short: does adding shorts help?
Plain turtle (no NN filter), same 8 blocks, symmetric short-side rules mirroring the long side exactly (short entry on N-day-low breakout, stop ratchets down instead of up, exit on the opposite 10-day-high channel). Price P&L only -- BTC perpetual funding costs still aren't modeled anywhere in this project's pipeline, so this is optimistic for shorts specifically: a real funded short in a structurally-appreciating asset like BTC has historically paid funding more often than it's received it, a headwind this test cannot see.
| Block | Long-only | Long+short | Δ | Trades (long-only → long+short) |
|---|---|---|---|---|
| 2017-2018 mania/bear | +36.9% | +108.7% | +71.8pp | 6 → 13 |
| 2019 chop | +135.4% | +110.8% | -24.6pp | 5 → 11 |
| 2020 COVID/recovery | +223.5% | +265.0% | +41.5pp | 5 → 7 |
| 2021 bull/crash | +1.7% | -6.4% | -8.1pp | 6 → 10 |
| 2022 bear | -25.7% | -19.7% | +6.0pp | 5 → 9 |
| 2023 recovery | +27.5% | +12.9% | -14.6pp | 4 → 10 |
| 2024 bull | +5.8% | +0.4% | -5.4pp | 8 → 12 |
| 2025-2026 recent | -23.6% | -14.2% | +9.4pp | 10 → 19 |
A clean, regime-legible split, not a wash. Shorts helped in every block with a real down-leg (2017-2018's 2018 bear, 2020's COVID crash before the recovery, 2022 bear, 2025-2026) and hurt in every block that was a sustained uptrend (2021, 2023, 2024 -- 2019 "chop" was actually +89.5% buy-and-hold that year, not really chop in hindsight). That's exactly what you'd expect from a trend-following short entering a structurally up-trending asset: it earns its keep capturing real drawdowns, then gives some back whipsawing on failed short breakouts during the next uptrend. Trade count roughly doubles throughout -- part of the cost in trending-up blocks. Net effect across all 8 blocks is close to a wash in aggregate, and the funding-cost gap above means real short performance would likely be worse than shown here, not better.
Minute resolution: does the edge survive at intraday scale?
The same N=20/55/10/ATR-20 parameters, reinterpreted as minutes instead of days, run directly on the native 1-minute archive across four representative ~45-day windows, one per regime already established above. Directly tests whether the same mechanism that mostly held up at daily resolution degrades the way this project's own tick-level GA found short holding periods do (the main btc-ga-trader project's own WHITEPAPER.md: "the population converges to... barely trading at all" once hold length shrinks toward 5 minutes).
Data constraint, flagged not hidden: the 1-minute archive has only one price observation per minute (close), no true intra-minute high/low, so every minute bar here uses high = low = close, and ATR/true-range degenerates to a close-to-close measure -- a real simplification versus the daily version's genuine OHLC reconstruction from 1,440 sub-observations per day.
| Window | Long-only | Long+short | Buy & hold | Trades (long-only) | Win rate | Avg hold |
|---|---|---|---|---|---|---|
| 2019 chop (45d) | -100.0% | -100.0% | +26.7% | 2,103 | 12% | 7 min |
| 2020 COVID crash (45d) | -100.0% | -100.0% | -38.1% | 2,139 | 9% | 7 min |
| 2021 bull (45d) | -100.0% | -100.0% | +32.2% | 2,094 | 12% | 7 min |
| 2022 LUNA bear (45d) | -100.0% | -100.0% | -41.2% | 2,031 | 10% | 7 min |
Total wipeout, in every regime, regardless of long-only or long+short. This isn't a close call the way the daily results were -- it's a clean, dramatic confirmation of the same finding the main GA project already reported, now replicated on a completely different strategy family. ~2,000-2,100 trades fire in just 45 days (46-47/day) at only a 9-12% win rate and a ~7-minute average hold -- the 20/55-minute Donchian channel is narrow enough that ordinary price noise crosses it constantly, so the vast majority of "breakouts" are not real trend continuation, just noise the ATR-based 2× stop then cleanly stops out. Adding shorts roughly doubles trade count (4,185-4,377) without changing the outcome -- more noise-driven entries, not a rescue. At minute resolution, this breakout mechanism has no edge to lose to fees; it's losing to the entry signal itself no longer meaning anything.
Honest caveats
- Small trade counts (4-10 per block at daily resolution) -- each block's numbers carry real sampling noise.
- Simplified ATR (rolling mean, not Wilder-smoothed) and a simplified follow-through label (fixed 10-bar window, fixed thresholds).
- No shorts in the NN-filter walk-forward test above -- the long+short variant below is plain-turtle-only (no NN filter) and price-P&L-only (no funding cost modeled).
- Minute-resolution ATR uses high=low=close (the archive has no true intra-minute range) -- a real simplification, not hidden.
- Position sizing has no leverage cap (see "Second follow-up" below) -- every return figure on this page should be read with that in mind; the effect is small at daily resolution but not zero.
Second follow-up: 3 of 4 gaps closed, one still blocked
1. Bootstrap-resampled multi-seed replication, ablated set -- the 2022 improvement is robust, 2024's mostly wasn't. Unlike the earlier test (varying only GBT's random seed under deterministic settings), this resamples the training set itself per seed -- real stochasticity. Real variance now shows up everywhere (std 3.6-38.5% by block):
| Block | Mean (20 seeds) | Std | Beat plain/random | Single-seed result |
|---|---|---|---|---|
| 2019 chop | +136.3% | 4.3% | 2/20 | +135.4% |
| 2020 COVID/recovery | +182.7% | 38.5% | 2/20 | +223.5% |
| 2021 bull/crash | -6.7% | 3.6% | 2/20 | -4.4% |
| 2022 bear | -19.9% | 4.9% | 15/20 | -14.4% |
| 2023 recovery | +19.0% | 8.6% | 5/20 | +11.6% |
| 2024 bull | +3.6% | 5.9% | 8/20 | +3.7% |
| 2025-2026 recent | -14.9% | 11.6% | 15/20 | -2.5% |
Most single-seed "wins" don't reliably replicate (2019/2020/2021: 2/20; 2024's "flip loss to gain": 8/20, close to a coin flip). But 2022 and 2025-2026 -- the two blocks with the largest original improvement -- genuinely hold up at 15/20 seeds each. The honest version of the ablation finding is narrower than first reported: dropping trend features gives a real, replicable edge specifically in genuine bear/crash regimes, not a general-purpose improvement.
2. A from-scratch NN vs. GBT, ablated set -- no, it doesn't beat GBT, and it's far less stable. "From-scratch" means a genuine backprop-trained feedforward net (scikit-learn's MLPClassifier), not gradient-boosted trees.
| Block | GBT mean (std) | NN mean (std) | Winner |
|---|---|---|---|
| 2019 chop | +135.4% (0.0) | +135.4% (0.0) | tie |
| 2020 COVID/recovery | +208.2% (5.5) | +127.2% (95.1) | GBT, by a lot |
| 2021 bull/crash | -4.4% (0.0) | -0.8% (3.0) | NN |
| 2022 bear | -14.4% (0.0) | -14.2% (10.3) | tie, NN far less stable |
| 2023 recovery | +11.6% (0.0) | +20.4% (11.4) | NN |
| 2024 bull | +3.7% (0.0) | +5.9% (2.7) | NN |
| 2025-2026 recent | -2.5% (0.0) | -12.2% (11.0) | GBT, by a lot |
No clean winner, and every NN result carries real run-to-run variance (up to std 95.1%) GBT simply doesn't have. Per the design doc's own build order -- only justify NN complexity if it beats GBT out-of-sample -- the answer is no.
3. Funding-cost modeling for shorts -- still blocked. No funding-rate data source exists anywhere in this project's pipeline. Not tested; not fabricated.
4. An intermediate resolution (hourly) -- and a real bug this surfaced: turtle position sizing has no leverage cap. Same parameters, reinterpreted as hours, on genuine hourly OHLC (real reconstruction, no high=low=close simplification needed at this resolution).
| Block | Long-only | Long+short | Buy & hold | Trades | Win rate |
|---|---|---|---|---|---|
| 2017-2018 mania/bear | -75.2% | -95.2% | -14.1% | 190 | 21% |
| 2019 chop | +7,889.6% ⚠ | +3,874.5% ⚠ | +94.4% | 128 | 26% |
| 2020 COVID/recovery | +23.6% | -62.6% | +303.0% | 161 | 24% |
| 2021 bull/crash | -45.3% | -91.4% | +59.4% | 153 | 24% |
| 2022 bear | -88.4% | -93.5% | -64.5% | 145 | 14% |
| 2023 recovery | +0.7% | -91.9% | +155.8% | 158 | 18% |
| 2024 bull | +53.1% | -92.7% | +120.3% | 160 | 22% |
| 2025-2026 recent | -89.4% | -98.4% | -18.1% | 264 | 22% |
The headline isn't "hourly works in 2019" -- it's a real gap in the sizing model that hourly was the first thing to expose. Classic turtle unit sizing (equity × 1% ÷ ATR) has no cap on implied leverage -- as equity compounds during a long winning streak, position size grows proportionally with nothing capping notional exposure relative to equity, unlike the main GA project's explicit 2× leverage ceiling. At daily resolution this stayed mostly invisible (fewer trades per block, less room to compound). At hourly resolution, 2019's genuine, sustained uptrend gave the system 128 trades and repeated compounding room to grow position size from ~12 units early in the block to 1,000+ units by the end -- pulled straight from the actual trade log, equity went $10,000 → $27,000 → $927,000 → a peak near $1.86M, all from the same 1%-of-equity risk rule applied to an ever-larger base with no ceiling. Every other hourly block (7 of 8) shows the opposite problem instead -- deep losses (-45% to -95%) at 14-26% win rates, the same noise-dominated signature as the minute-resolution result, just less extreme. Read together, hourly sits exactly where you'd expect on the daily→hourly→minute curve: the signal is already noticeably noise-dominated, and the one block that "worked" only did so via an uncapped-leverage artifact, not real skill -- worth a real leverage cap before trusting any large compounding return from this system again.
Worth testing next: add an explicit leverage/notional cap to
compute_unit_size (mirroring the main GA project's 2× ceiling) --
every result on this page should be treated as potentially inflated by this gap until
it's fixed and re-run, though the effect is far smaller at daily resolution. Then
funding-cost modeling for shorts if data ever gets added, and a genuinely intermediate
resolution (e.g. 4-hour bars) once the sizing gap is fixed.
Turtle-Parameter GA: evolving the turtle's own knobs
Every result above trades the classic Richard Dennis parameters (20/55-day entry, 10-day exit, 20-day ATR, 2×ATR stop, 0.5×ATR pyramid step, 4 units, 1% risk/unit). This asks a different question: which turtle parameterization is actually most profitable, evolved rather than assumed -- an 8-gene genome (entry channel N-fast, N-slow, exit channel M, ATR window, stop distance, pyramid step, max units, risk % per unit), evolved with the same population/cull/breed loop the main GA project uses for its neural nets, just evolving turtle knobs instead of MLP weights. Run as 4 fully separate experiments (daily/minute × long-only/long+short), not one genome that also evolves a buy/sell toggle.
New, self-contained engine (turtle_ga.py, doesn't touch
turtle.py or the live traders) that includes a fix the classic engine
still lacks: a 2× leverage cap, mark-to-market aware so pyramiding room
correctly unlocks as a position runs up profit -- built in from day one so a freely
evolving GA can't rediscover the hourly-resolution leverage bug above as free alpha.
Fitness = mean excess return over buy-and-hold across TRAIN blocks only; one
block/window per resolution is held out entirely from evolution, used only to report
final performance. Cutoff: keep the top 50% each generation, elitism 2, refill via
crossover + mutation. Daily: 60 genomes × 25 generations, 7 training blocks,
held out 2025-2026_recent. Minute: 24 × 12, 3 training windows, held out
2022_luna_bear_45d.
| Experiment | n_fast | n_slow | exit_m | atr_n | stop (×ATR) | pyramid (×ATR) | max units | risk/unit |
|---|---|---|---|---|---|---|---|---|
| Classic (all four rows): 20 / 55 / 10 / 20 / 2.0 / 0.5 / 4 / 1.0% | ||||||||
| 1. Daily, long-only | 29 | 43 | 14 | 5 (min) | 3.69 (near max) | 1.47 (near max) | 6 (max) | 3.0% (max) |
| 2. Daily, long+short | 17 | 30 | 18 | 14 | 1.67 | 0.2 (min) | 5 | 3.0% (max) |
| 3. Minute, long-only | 40 (max) | 50 | 23 | 13 | 4.0 (max) | 0.2 (min) | 5 | 2.6% |
| 4. Minute, long+short | 40 (max) | 74 | 24 | 10 | 4.0 (max) | 1.36 | 1 (min) | 0.47% (near min) |
1. Daily, long-only. Training fitness +114.3pp mean excess -- but 5 of 8 genes sit at or near their bounds (a sign the GA hit the edge of the search space, not a clean interior optimum), and that number is dominated by outliers: 2020 COVID/recovery alone contributed +419.9pp excess from a single trade, while the genome actually lost to buy-and-hold in 2021 (-74.3pp) and 2023 (-93.1pp). On the genuinely held-out 2025-2026 block, evolved and classic are a wash: +1.3pp vs -5.5pp -- both near zero. Reads as overfitting to a couple of lucky trades, not a real improvement.
2. Daily, long+short. Top-5 genomes converge tightly (only 2 of 8 genes at their bounds) -- more genuine convergence than the long-only case. Training fitness (+197.4pp) is again outlier-dominated (2017-2018 mania/bear alone: +1,133pp excess, though from 13 trades, not one), and the genome still lost to buy-and-hold in 4 of 7 train blocks. But on the held-out block, evolved genuinely beats classic by a real margin: +26.4pp vs +4.2pp excess -- the most encouraging of the four GA runs, though still resting on one extreme training block, so "plausibly better," not proven.
3 & 4. Minute, long-only and long+short -- no genome escapes wipeout. Best evolved long-only genome: -92.8% to -96.0% strategy return in every window (softer than classic's ~-99.9%, but still losing nearly all equity everywhere). The long+short GA's own best defense was to evolve toward minimal risk (1 max unit -- the floor, near-minimum risk-per-unit) -- essentially "trade as little and as cautiously as this search space allows" -- and it still lost 99.7-99.9% of equity in every window, statistically indistinguishable from classic. The cleanest possible negative result: it isn't that 20/55/10/20 was a bad minute-resolution choice -- nothing in an 8-dimensional, reasonably wide search space rescues it. Rules out "wrong parameters" as an explanation for the earlier minute-resolution wipeout finding.
Caveats: several evolved genomes sit at or very near their search bounds -- the true optimum, if a better one exists, may lie outside them, not that the search fully converged. Training fitness in both daily experiments is dominated by 1-2 outlier blocks with very few trades -- the same small-sample risk flagged throughout this page, now amplified since evolved risk-per-unit runs up to 3× classic's. Minute GA used a smaller population/generation count purely for compute time -- the result was unambiguous enough that a larger search wasn't pursued. Only one held-out block/window per resolution -- a single data point for "does evolved beat classic out of sample," not a distribution.
Deployed: the daily long+short winning genome is live on Turtle Traders as "Michelangelo Bianchi" -- paper trading, real BTC feed, same leverage-capped mark-to-market-aware sizing engine as the offline GA. Unlike Leonardo/Donatello it trades both directions.
Turtle-Parameter GA on gold and oil: does it generalize past BTC?
Repeats exactly the daily long+short GA experiment above -- same search space, same
cull-and-breed loop, same walk-forward holdout discipline -- on gold and oil daily OHLC
instead of BTC, using the real native daily bars already sitting in the shared
market-data-archive repo (Yahoo GC=F/CL=F, 2000-present). Two deliberate,
asset-specific differences: leverage cap is asset-dependent -- Plus500's actual
published retail tiers, gold 20× (minor-FX/gold/major-index tier), oil 10×
(other-commodities tier), not BTC's 2× crypto convention -- and blocks are
neutral 3-year calendar windows (2000-2003 through 2024-2026, held out), not
regime-labeled, matching market-data-archive's own stated discipline against
a downstream backtester anchoring on someone else's bull/bear/crash threshold choices.
| Asset | Leverage cap | Best evolved (max units, risk/unit) | Training fitness | Holdout: evolved excess | Holdout: classic excess |
|---|---|---|---|---|---|
| Gold | 20× | 6 (max), 3.0% (max) | +209.1pp | -152.9pp | -55.5pp |
| Oil | 10× | 6 (max), 3.0% (max) | +759.8pp | -88.6pp | -3.8pp |
A real, decisive negative result -- on both assets, the evolved genome loses to
classic parameters on the untouched holdout block, and loses badly. A sharp contrast
with the BTC long+short GA's modest-but-real holdout edge above. Every one of the top-5
genomes for both assets pushed max_units and
risk_pct_per_unit to their exact upper bounds -- 5 of 5 for gold, 5 of 5 for
oil, a much more consistent boundary-pinning pattern than BTC showed.
Why: the training-fitness numbers are almost entirely one outlier block, amplified by the higher leverage tier. Both assets' single best training block is 2018-2021 (spanning the COVID crash and recovery) by a huge margin -- gold: +2,112pp excess from that block alone; oil: +6,844pp excess from that block alone -- while every other training block is negative, often severely. The classic-parameter baseline, run through the same leverage cap for a fair comparison, also finds 2018-2021 its best block (gold +144.9pp, oil +92.8pp) -- confirming that block is a genuinely strong trend period, not a GA artifact -- but at a dramatically more modest magnitude: the evolved genome's 2018-2021 numbers are 14× (gold) and 74× (oil) larger than classic's for the same block and same leverage cap, purely from pushing risk-per-unit and unit count to their limits and letting one long compounding trend run under 10-20× leverage instead of 2×. Mean-across-8-blocks fitness gives a genome exactly one way to look outstanding: find the single biggest historical trend, then maximize leverage into it -- exactly what happened, and exactly why it fails to generalize.
This also reveals something about the higher leverage tiers themselves, independent of the GA: even classic parameters are far more block-dominated on gold/oil (at their real Plus500 tiers) than the same parameters are on BTC (2×) -- a higher leverage ceiling doesn't just let a bad genome overfit harder, it makes any single-outlier-block risk in this project's "mean excess return across a handful of blocks" fitness convention worse, mechanically, regardless of what's being evaluated.
Not deployed. Given this result, no gold or oil GA-evolved trader was added to the live site -- deploying a genome that demonstrably loses to classic parameters out-of-sample would contradict the entire point of evidence-based deployment.