7 Commits

Author SHA1 Message Date
Adriano Dal Pastro 23b7273e71 feat(paper): ETH a tick 5m + tooling per-year/per-tick analysis
scripts/run_paper_trading.py: AssetConfig ETH ora usa timeframe="5m" invece
del default 1h. Il winner c04dff7086 e' stato trovato dal GA su dati 5m
e a 1h la strategia perde:
- ETH @ 5m (native): +359.50% cum 7y, 77% winrate, max DD/yr 19%
- ETH @ 1h (precedente): -33.03% cum 7y, 67% winrate, max DD 74%
BTC resta a 1h (winner 238e4812 native a 1h, +104% 7y, Sharpe 2+ in 3 anni).

Nuovi script di analisi:
- scripts/yearly_strategies.py: breakdown per anno (2019-2025) di 4
  strategie su tick di discovery (trade/winrate/return/maxDD/Sharpe).
- scripts/multi_tick_strategies.py: confronto cross-tick (5m/15m/1h)
  per i 2 winner correnti. Documenta la divergenza tick-paper di ETH.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 22:10:38 +00:00
Adriano Dal Pastro 9c871d1d86 feat(validation): WFA tooling + multi-fold results phase1-100 runs
Aggiunge 2 script di analisi per validare i top-K genomi cross-fold:

- scripts/analyze_btc_winners.py: per-trade dump (wins/losses/winrate/
  avg_win/avg_loss/return/maxDD/Sharpe) per ogni top-K × 4 fold
  expanding-window WFA. Usato per identificare i winner robusti vs
  i lucky-shot overfit.

- scripts/compare_winners.py: cross-run comparison di 5 winner
  candidate (BTC 1h + ETH 1h + BTC 5m + ETH 5m) sui medesimi 4 fold,
  con totali cumulativi.

Risultati WFA freezati:
- validation-btc-100-001.json: BTC 1h baseline (undertrading=10)
- validation-btc-100-001-thr3.json: BTC 1h con threshold=3 (rilassato
  per strategie ultra-selettive)
- validation-btc-100-5m-thr3.json: BTC 5m con threshold=3

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 21:48:55 +00:00
Adriano Dal Pastro 8b767da5e7 feat(strategy): swap paper a 238e4812 (BTC) + c04dff7086 (ETH) — phase1-100 winners
Risultati phase1-{btc,eth}-100-001 (1h) + phase1-{btc,eth}-100-5m-001 (5m, 770K bars)
con 100-agent GA × 10 generazioni × fitness v2 hardened + WFA 0.7 split.

BTC (238e4812, meteorologist Gen 7 winner del run 1h):
- IS f=0.2604, Sharpe=0.437, 25 trades
- OOS: f=0.4184, Sharpe=1.296, +22.15% return fold 3, DD 7.4%
- WFA 4-fold: cum_ret +31.65%, 58.6% winrate, 2 fold Sharpe 2+

ETH (c04dff7086, mean-reversion oversold del run 5m):
- IS f=0.1881, OOS f=0.1789 (no overfit), Sharpe_OOS=0.171
- WFA 4-fold: cum_ret +23.83%, 77.8% winrate, 2 fold @ 100% winrate
- Primo ETH winner che sopravvive hard-kill v2 in tutta la storia progetto

Archive: btc_9cf506b8.json (precedente winner hardened-001), eth_facd6af85d5d.json.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 21:48:42 +00:00
Adriano Dal Pastro 1c0058ec3b feat(strategy): swap BTC paper strategy a 9cf506b8 (hardened-001 robust winner)
Sostituisce btc_fb63e851 (in produzione dal 13 maggio, net +$9.9k su 7y BTC,
Sharpe medio -0.20) con btc_9cf506b8, vincitore del run phase1-hardened-001
(K=50 G=15 7y, fitness-v2 con hard-kill su fees_eat_alpha + negative_net_pnl).

Performance comparate su 7y BTC continui:
- btc_fb63e851:   Net +$9,951  Sharpe medio -0.20  4/8 anni positivi
- btc_9cf506b8:   Net +$30,538 Sharpe medio +0.31  5/8 anni positivi
                  Best year 2021: +$18,938 (vs prod +$6,835)
                  Best Sharpe annuale: 2023 +1.27 (vs prod 2024 +1.16)
                  Zero adversarial findings su 7y continui.

Performance cross-asset (test su ETH 6.8y):
- btc_fb63e851 su ETH: -$120 (pseudo-flat, nessun segnale)
- btc_9cf506b8 su ETH: +$2,059 (4/7 anni positivi)
La strategia generalizza out-of-asset, indicatore di robustezza non-ETH-overfit.

DSL: physicist style, lookback 150 bar (~6 giorni). Triple-AND condition su
realized_vol + atr_pct + sma_pct per entry (long o short). Exit su sma_pct=0
o vol collasso (<0.1%). Selettivo: 502 trade in 7y = 1.4 trade/giorno medio.

btc_fb63e851 archiviato in strategies/archive/ per consultazione futura.
Il glob loader `btc_*.json` e' non-ricorsivo, quindi archive/ non viene
caricato automaticamente.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 13:21:37 +00:00
Adriano Dal Pastro 220e510d5e fix(orchestrator): escludi prompt_library dal config_dict JSON
PromptLibrary e' un frozen dataclass non JSON-serializable. Quando passata in
cfg.prompt_library e poi spread via **cfg.__dict__ in config_dict, faceva
fallire repo.create_run() con TypeError al primo run dopo refactor.

Fix: filtra cfg.__dict__ escludendo prompt_library, e salva separatamente la
lista degli stili (prompt_library_styles) per reproducibility.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 13:21:08 +00:00
Adriano Dal Pastro 9742df3a1f fix(fitness): hardening anti-overfit post-7y incident — 3 correzioni
Incident: extended run elite (Sharpe IS 1.93) net-negativo su 7y
continuous (fees=101% del gross). Multi-fold validation NON sufficiente:
ogni fold restarta equity, mascherando accumulo fees compound.

Correzioni:

1) Default --start esteso a 2018-09-01 (7.3 anni)
   - Copre bear 2018-19, halving 2020, COVID, ATH 2021, winter 2022,
     ETF rally 2024, regime corrente.
   - Una finestra corta (2y) lasciava il GA libero di overfit single-regime.

2) fees_eat_alpha promosso a hard-kill in fitness v2
   - Da soft-penalty 0.4x a hard-kill 0 fitness.
   - Una strategia con fees > 50% del gross non e' recuperabile via
     selection: il prodotto del GA non puo' deployare con quel cost burden.

3) Nuovo finding negative_net_pnl (HIGH, hard-kill)
   - Fires quando sum(trade.net_pnl) < 0 sul training window.
   - Cattura: gross negativo (no edge direzionale) E gross positivo ma
     fees > gross (edge insufficiente).
   - Sintesi del net-after-fees su finestra continua come "deal-breaker"
     non negoziabile via soft penalty.

CLI:
- --fitness-hard-kill <csv> per override esplicito.
- Default v2: no_trades,degenerate,undertrading,fees_eat_alpha,negative_net_pnl.

Test:
- 252 pass (251 + 1 nuovo: test_negative_net_pnl_fires_on_negative_gross).
- Test e2e WFA aggiornato: passa fitness_hard_kill_findings=('no_trades',)
  perche' il fixture sintetico non produce strategie profittevoli.
- test_no_findings_on_reasonable_strategy rinominato:
  test_rsi_mean_reversion_loses_money_on_synthetic_data (riflette
  semantica reale: RSI mean-rev su synthetic ohlcv ha net negativo).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 11:07:40 +00:00
Adriano Dal Pastro 21b5cf1eae feat(validation): add validation data for phase1-extended-001 with detailed results 2026-05-16 10:55:35 +00:00
20 changed files with 3561 additions and 19 deletions
+5 -4
View File
@@ -111,7 +111,7 @@ Stack: Python 3.13, uv workspace, hatchling, pytest+pytest-mock+responses, opena
```bash
uv sync # installa entrambi i workspace member come editable
cp .env.example .env # compila CERBERO_*_TOKEN e OPENROUTER_API_KEY
uv run pytest # 250 test attesi (246 core + 4 smoke strategy_crypto)
uv run pytest # 252 test attesi (248 core + 4 smoke strategy_crypto)
```
### Variabili .env richieste
@@ -151,15 +151,16 @@ uv run mypy src/ scripts/
uv run python scripts/smoke_run.py
# Run reale Phase 1/2 (Cerbero + OpenRouter, ~$0.15-0.25 per run K=20 10gen,
# ~$0.40-0.55 per run esteso K=40 20gen con WFA OOS)
# ~$0.40-0.55 per run esteso K=40 20gen con WFA OOS).
# Default --start ora 2018-09-01 (7.3y, copre bear+halving+covid+ATH+winter+ETF).
uv run python scripts/run_phase1.py \
--name run-XXX \
--exchange deribit --symbol BTC-PERPETUAL --timeframe 1h \
--start 2024-01-01T00:00:00+00:00 \
--end 2026-01-01T00:00:00+00:00 \
--population-size 20 --n-generations 10 \
--prompt-mutation-weight 0.30 --fitness-v2 \
--llm-concurrency 8 # 5-8x speedup wall time (default 1)
# fitness-v2 hardened: hard-kill su {no_trades, degenerate, undertrading,
# fees_eat_alpha, negative_net_pnl}. Override via --fitness-hard-kill CSV.
# Default --prompt-library: importlib.resources del package strategy_crypto/prompts.json
# Multi-fold validation di un run esistente (anti-overfit, 7y expanding-window)
+125
View File
@@ -0,0 +1,125 @@
"""Analisi per-trade dei top-K candidate del run BTC.
Per ciascun genome top-K, ri-esegue il backtest su ogni fold WFA e raccoglie:
- n_trades, n_wins, n_losses, win_rate
- max_drawdown
- return, sharpe
- list trade pnl summary
Output stampato a stdout, non scrive su disco.
"""
from __future__ import annotations
import argparse
from datetime import datetime
import pandas as pd # type: ignore[import-untyped]
from multi_swarm_core.agents.hypothesis import _try_parse
from multi_swarm_core.backtest.engine import BacktestEngine
from multi_swarm_core.cerbero.client import CerberoClient
from multi_swarm_core.config import load_settings
from multi_swarm_core.data.cerbero_ohlcv import CerberoOHLCVLoader, OHLCVRequest
from multi_swarm_core.data.splits import expanding_walk_forward
from multi_swarm_core.metrics.basic import max_drawdown, sharpe_ratio, total_return
from multi_swarm_core.persistence.repository import Repository
from multi_swarm_core.protocol.compiler import compile_strategy
def main() -> None:
ap = argparse.ArgumentParser()
ap.add_argument("--run-id", required=True)
ap.add_argument("--top-k", type=int, default=10)
ap.add_argument("--n-folds", type=int, default=4)
ap.add_argument("--train-ratio", type=float, default=0.5)
ap.add_argument("--symbol", default="BTC-PERPETUAL")
ap.add_argument("--timeframe", default="1h")
ap.add_argument("--start", default="2018-09-01T00:00:00+00:00")
ap.add_argument("--end", default="2026-01-01T00:00:00+00:00")
ap.add_argument("--fees-bp", type=float, default=5.0)
args = ap.parse_args()
settings = load_settings()
repo = Repository(settings.ga_db_path)
repo.init_schema()
all_evals = repo.list_evaluations(args.run_id)
parseable = [
e for e in all_evals
if e.get("raw_text") and not e.get("parse_error") and e["fitness"] > 0
]
parseable.sort(key=lambda e: e["fitness"], reverse=True)
seen: set[str] = set()
top: list[dict] = []
for e in parseable:
if e["genome_id"] in seen:
continue
seen.add(e["genome_id"])
top.append(e)
if len(top) >= args.top_k:
break
token = (
settings.cerbero_mainnet_token.get_secret_value()
if settings.cerbero_mainnet_token
else settings.cerbero_testnet_token.get_secret_value()
)
cerbero = CerberoClient(
base_url=settings.cerbero_base_url,
token=token,
bot_tag=settings.cerbero_bot_tag,
)
loader = CerberoOHLCVLoader(client=cerbero, cache_dir=settings.series_dir)
ohlcv = loader.load(OHLCVRequest(
symbol=args.symbol,
timeframe=args.timeframe,
start=datetime.fromisoformat(args.start),
end=datetime.fromisoformat(args.end),
))
splits = expanding_walk_forward(ohlcv.index, train_ratio=args.train_ratio, n_folds=args.n_folds)
engine = BacktestEngine(fees_bp=args.fees_bp)
print(f"\n{'=' * 110}")
print(f"PER-TRADE ANALYSIS — top-{len(top)} genomes × {len(splits)} folds")
print(f"{'=' * 110}")
for ev in top:
strat, err = _try_parse(ev["raw_text"] or "")
if strat is None:
print(f"\n>>> {ev['genome_id'][:16]} — parse error: {err}")
continue
print(f"\n>>> {ev['genome_id']} (fit_IS={ev['fitness']:.4f}, sharpe_IS={ev['sharpe']:.3f})")
print(f"{'fold':<5} {'period':<26} {'trades':>7} {'wins':>5} {'losses':>7} {'win%':>6} {'avg_w':>9} {'avg_l':>9} {'ret':>7} {'maxDD':>7} {'sharpe':>7}")
for s in splits:
test_df = ohlcv.loc[s.test_idx]
try:
signal_fn = compile_strategy(strat)
signals = signal_fn(test_df)
bt = engine.run(test_df, signals)
except Exception as e:
print(f" fold {s.fold}: error {e}")
continue
trades = bt.trades
n_trades = len(trades)
wins = [t.net_pnl for t in trades if t.net_pnl > 0]
losses = [t.net_pnl for t in trades if t.net_pnl <= 0]
n_wins = len(wins)
n_losses = len(losses)
win_rate = (n_wins / n_trades * 100) if n_trades else 0.0
avg_w = (sum(wins) / n_wins) if n_wins else 0.0
avg_l = (sum(losses) / n_losses) if n_losses else 0.0
# Normalize equity for DD/return
if n_trades > 0:
notional = float(test_df["close"].iloc[0])
equity_pos = (bt.equity_curve / notional) + 1.0
ret_pct = total_return(equity_pos)
dd = max_drawdown(equity_pos)
sr = sharpe_ratio(bt.returns, periods_per_year=8760)
else:
ret_pct = dd = sr = 0.0
period = f"{str(s.test_idx[0])[:10]}..{str(s.test_idx[-1])[:10]}"
print(f"{s.fold:<5} {period:<26} {n_trades:>7} {n_wins:>5} {n_losses:>7} {win_rate:>5.1f}% {avg_w:>9.1f} {avg_l:>9.1f} {ret_pct:>6.2%} {dd:>6.2%} {sr:>7.3f}")
if __name__ == "__main__":
main()
+139
View File
@@ -0,0 +1,139 @@
"""Confronto per-trade dei 4 winner cross-run (BTC/ETH × 1h/5m).
Per ogni winner: ri-esegue il backtest su 4 fold WFA expanding-window e raccoglie
trade buoni/non buoni, win-rate, avg PnL, return, max DD, Sharpe.
"""
from __future__ import annotations
import argparse
from datetime import datetime
import pandas as pd # type: ignore[import-untyped]
from multi_swarm_core.agents.hypothesis import _try_parse
from multi_swarm_core.backtest.engine import BacktestEngine
from multi_swarm_core.cerbero.client import CerberoClient
from multi_swarm_core.config import load_settings
from multi_swarm_core.data.cerbero_ohlcv import CerberoOHLCVLoader, OHLCVRequest
from multi_swarm_core.data.splits import expanding_walk_forward
from multi_swarm_core.metrics.basic import max_drawdown, sharpe_ratio, total_return
from multi_swarm_core.persistence.repository import Repository
from multi_swarm_core.protocol.compiler import compile_strategy
# (run_name, genome_id, symbol, timeframe, label)
WINNERS = [
("phase1-btc-100-001", "238e481262c1594c", "BTC-PERPETUAL", "1h", "BTC 1h sharpshooter (Gen 7)"),
("phase1-btc-100-001", "23a24989e2ed0f84", "BTC-PERPETUAL", "1h", "BTC 1h robust (Gen 0 elite)"),
("phase1-eth-100-001", "4b45a72c13acf1d5", "ETH-PERPETUAL", "1h", "ETH 1h best-by-sharpe (killed)"),
("phase1-btc-100-5m-001", "f8ca6642adf7e0cd", "BTC-PERPETUAL", "5m", "BTC 5m robust winner"),
("phase1-eth-100-5m-001", "c04dff7086bb9588", "ETH-PERPETUAL", "5m", "ETH 5m OOS winner"),
]
def analyze_genome(run_id: str, genome_id: str, symbol: str, timeframe: str, label: str,
settings, cerbero, loader) -> None:
repo = Repository(settings.ga_db_path)
repo.init_schema()
evs = [e for e in repo.list_evaluations(run_id) if e["genome_id"] == genome_id]
if not evs:
print(f" no eval for {genome_id} in {run_id}")
return
ev = evs[0]
strat, err = _try_parse(ev.get("raw_text") or "")
if strat is None:
print(f" parse error: {err}")
return
req = OHLCVRequest(
symbol=symbol, timeframe=timeframe,
start=datetime.fromisoformat("2018-09-01T00:00:00+00:00"),
end=datetime.fromisoformat("2026-01-01T00:00:00+00:00"),
)
ohlcv = loader.load(req)
splits = expanding_walk_forward(ohlcv.index, train_ratio=0.5, n_folds=4)
engine = BacktestEngine(fees_bp=5.0)
print(f"\n>>> {label}")
print(f" {genome_id} | fit_IS={ev['fitness']:.4f} sharpe_IS={ev['sharpe']:.3f} trades_IS={ev['n_trades']}")
print(f" {'fold':<5} {'period':<26} {'trades':>7} {'wins':>5} {'losses':>7} {'win%':>6} {'avg_w':>10} {'avg_l':>10} {'ret':>8} {'maxDD':>7} {'sharpe':>7}")
sum_ret = 0.0
sum_trades = 0
sum_wins = 0
for s in splits:
test_df = ohlcv.loc[s.test_idx]
try:
signal_fn = compile_strategy(strat)
signals = signal_fn(test_df)
bt = engine.run(test_df, signals)
except Exception as e:
print(f" fold {s.fold}: error {e}")
continue
trades = bt.trades
n = len(trades)
wins = [t.net_pnl for t in trades if t.net_pnl > 0]
losses = [t.net_pnl for t in trades if t.net_pnl <= 0]
nw, nl = len(wins), len(losses)
wr = (nw / n * 100) if n else 0.0
aw = (sum(wins) / nw) if nw else 0.0
al = (sum(losses) / nl) if nl else 0.0
if n > 0:
notional = float(test_df["close"].iloc[0])
eq = (bt.equity_curve / notional) + 1.0
ret = total_return(eq)
dd = max_drawdown(eq)
sr = sharpe_ratio(bt.returns, periods_per_year=8760)
else:
ret = dd = sr = 0.0
period = f"{str(s.test_idx[0])[:10]}..{str(s.test_idx[-1])[:10]}"
print(f" {s.fold:<5} {period:<26} {n:>7} {nw:>5} {nl:>7} {wr:>5.1f}% {aw:>10.1f} {al:>10.1f} {ret:>7.2%} {dd:>6.2%} {sr:>7.3f}")
sum_ret += ret
sum_trades += n
sum_wins += nw
overall_wr = (sum_wins / sum_trades * 100) if sum_trades else 0.0
print(f" {'='*5} TOTALS: {sum_trades:>7} {sum_wins:>5} {sum_trades-sum_wins:>7} {overall_wr:>5.1f}% cum_ret={sum_ret:+.2%}")
def main() -> None:
settings = load_settings()
repo = Repository(settings.ga_db_path)
repo.init_schema()
name_to_id: dict[str, str] = {}
for w in WINNERS:
run_name = w[0]
if run_name in name_to_id:
continue
runs = repo.list_runs()
for r in runs:
if r["name"] == run_name:
name_to_id[run_name] = r["id"]
break
token = (
settings.cerbero_mainnet_token.get_secret_value()
if settings.cerbero_mainnet_token
else settings.cerbero_testnet_token.get_secret_value()
)
cerbero = CerberoClient(
base_url=settings.cerbero_base_url,
token=token,
bot_tag=settings.cerbero_bot_tag,
)
loader = CerberoOHLCVLoader(client=cerbero, cache_dir=settings.series_dir)
print(f"{'='*120}")
print(f"PER-TRADE COMPARISON — {len(WINNERS)} winner candidates × 4 folds WFA")
print(f"{'='*120}")
for run_name, genome_id, symbol, timeframe, label in WINNERS:
run_id = name_to_id.get(run_name)
if not run_id:
print(f"!!! run not found: {run_name}")
continue
analyze_genome(run_id, genome_id, symbol, timeframe, label, settings, cerbero, loader)
if __name__ == "__main__":
main()
+112
View File
@@ -0,0 +1,112 @@
"""2 winner cross-tick: BTC 238e4812 + ETH c04dff7086 su 5m / 15m / 1h.
Per ogni combinazione strategy × timeframe: backtest year-by-year (2019-2025)
con metriche per-anno e totale 7y.
"""
from __future__ import annotations
from datetime import datetime
from pathlib import Path
from multi_swarm_core.backtest.engine import BacktestEngine
from multi_swarm_core.cerbero.client import CerberoClient
from multi_swarm_core.config import load_settings
from multi_swarm_core.data.cerbero_ohlcv import CerberoOHLCVLoader, OHLCVRequest
from multi_swarm_core.metrics.basic import max_drawdown, sharpe_ratio, total_return
from multi_swarm_core.protocol.compiler import compile_strategy
from multi_swarm_core.protocol.parser import parse_strategy
WINNERS = [
# (label, path, symbol)
("BTC NEW (238e4812, native=1h)", "btc_238e4812.json", "BTC-PERPETUAL"),
("ETH NEW (c04dff7086, native=5m)", "eth_c04dff7086.json", "ETH-PERPETUAL"),
]
TIMEFRAMES = ["5m", "15m", "1h"]
YEARS = [
("2019", "2019-01-01T00:00:00+00:00", "2020-01-01T00:00:00+00:00"),
("2020", "2020-01-01T00:00:00+00:00", "2021-01-01T00:00:00+00:00"),
("2021", "2021-01-01T00:00:00+00:00", "2022-01-01T00:00:00+00:00"),
("2022", "2022-01-01T00:00:00+00:00", "2023-01-01T00:00:00+00:00"),
("2023", "2023-01-01T00:00:00+00:00", "2024-01-01T00:00:00+00:00"),
("2024", "2024-01-01T00:00:00+00:00", "2025-01-01T00:00:00+00:00"),
("2025", "2025-01-01T00:00:00+00:00", "2026-01-01T00:00:00+00:00"),
]
def evaluate(strat, ohlcv, engine, label, tf) -> None:
print(f"\n >>> tick={tf} | {len(ohlcv)} bars")
print(f" {'year':<6} {'trades':>7} {'wins':>5} {'losses':>7} {'win%':>6} {'ret':>8} {'maxDD':>7} {'sharpe':>7}")
sum_ret = 0.0
sum_trades = 0
sum_wins = 0
for year_label, start, end in YEARS:
mask = (ohlcv.index >= datetime.fromisoformat(start)) & (ohlcv.index < datetime.fromisoformat(end))
slice_df = ohlcv[mask]
if len(slice_df) == 0:
continue
try:
signal_fn = compile_strategy(strat)
signals = signal_fn(slice_df)
bt = engine.run(slice_df, signals)
except Exception as e:
print(f" {year_label:<6} ERROR: {e}")
continue
trades = bt.trades
n = len(trades)
wins = [t.net_pnl for t in trades if t.net_pnl > 0]
losses = [t.net_pnl for t in trades if t.net_pnl <= 0]
nw, nl = len(wins), len(losses)
wr = (nw / n * 100) if n else 0.0
if n > 0:
notional = float(slice_df["close"].iloc[0])
eq = (bt.equity_curve / notional) + 1.0
ret = total_return(eq)
dd = max_drawdown(eq)
sr = sharpe_ratio(bt.returns, periods_per_year=8760)
else:
ret = dd = sr = 0.0
print(f" {year_label:<6} {n:>7} {nw:>5} {nl:>7} {wr:>5.1f}% {ret:>7.2%} {dd:>6.2%} {sr:>7.3f}")
sum_ret += ret
sum_trades += n
sum_wins += nw
overall_wr = (sum_wins / sum_trades * 100) if sum_trades else 0.0
print(f" ===== 7y TOT: {sum_trades:>7} {sum_wins:>5} {sum_trades-sum_wins:>7} {overall_wr:>5.1f}% cum_ret={sum_ret:+.2%}")
def main() -> None:
settings = load_settings()
token = (
settings.cerbero_mainnet_token.get_secret_value()
if settings.cerbero_mainnet_token
else settings.cerbero_testnet_token.get_secret_value()
)
cerbero = CerberoClient(
base_url=settings.cerbero_base_url,
token=token,
bot_tag=settings.cerbero_bot_tag,
)
loader = CerberoOHLCVLoader(client=cerbero, cache_dir=settings.series_dir)
engine = BacktestEngine(fees_bp=5.0)
strategies_dir = Path("/app/strategies")
for label, fname, symbol in WINNERS:
path = strategies_dir / fname
strat = parse_strategy(path.read_text())
print(f"\n{'='*100}")
print(f">>> {label} — symbol={symbol}")
for tf in TIMEFRAMES:
try:
ohlcv = loader.load(OHLCVRequest(
symbol=symbol, timeframe=tf,
start=datetime.fromisoformat("2018-09-01T00:00:00+00:00"),
end=datetime.fromisoformat("2026-01-01T00:00:00+00:00"),
))
evaluate(strat, ohlcv, engine, label, tf)
except Exception as e:
print(f"\n >>> tick={tf} FAILED TO LOAD: {e}")
if __name__ == "__main__":
main()
+4 -2
View File
@@ -70,9 +70,11 @@ def load_assets(strategies_dir: Path) -> list[AssetConfig]:
raise FileNotFoundError(
f"Expected btc_*.json and eth_*.json in {strategies_dir}"
)
# ETH winner c04dff7086 e' tunato su 5m: a 1h la strategia perde (cum_ret -33% 7y).
# BTC winner 238e4812 e' tunato su 1h: tick native = paper tick.
return [
AssetConfig(symbol="BTC-PERPETUAL", strategy_file=btc_files[0]),
AssetConfig(symbol="ETH-PERPETUAL", strategy_file=eth_files[0]),
AssetConfig(symbol="BTC-PERPETUAL", strategy_file=btc_files[0], timeframe="1h"),
AssetConfig(symbol="ETH-PERPETUAL", strategy_file=eth_files[0], timeframe="5m"),
]
+43 -6
View File
@@ -19,6 +19,30 @@ def _default_prompt_library_path() -> Path:
return Path(str(importlib.resources.files("strategy_crypto") / "prompts.json"))
# Default v2 hard-kill list: oltre ai degenerate originali, fees_eat_alpha e
# negative_net_pnl sono deal-breaker non recuperabili via soft penalty (vedi
# 7y-overfit incident 2026-05-16: elite IS Sharpe 1.93 -> net -5% su 7y per fees).
_DEFAULT_V2_HARD_KILL: tuple[str, ...] = (
"no_trades",
"degenerate",
"undertrading",
"fees_eat_alpha",
"negative_net_pnl",
)
def _resolve_hard_kill(args) -> tuple[str, ...] | None:
"""Resolve la lista hard-kill da CLI args.
Priority: ``--fitness-hard-kill`` esplicito > default v2 > ``None`` (v1).
"""
if args.fitness_hard_kill:
return tuple(s.strip() for s in args.fitness_hard_kill.split(",") if s.strip())
if args.fitness_v2:
return _DEFAULT_V2_HARD_KILL
return None
def parse_args() -> argparse.Namespace:
p = argparse.ArgumentParser(description="Multi-Swarm Phase 1 runner")
p.add_argument("--name", default="phase1-spike-001")
@@ -35,7 +59,10 @@ def parse_args() -> argparse.Namespace:
)
p.add_argument("--symbol", default="BTC-PERPETUAL")
p.add_argument("--timeframe", default="1h")
p.add_argument("--start", default="2024-01-01T00:00:00+00:00")
# Default esteso a 7.3 anni: copre bear 2018-19, halving 2020, COVID,
# ATH 2021, winter 2022, ETF rally 2024, regime corrente. Una finestra
# corta lascia il GA libero di overfit a un singolo regime.
p.add_argument("--start", default="2018-09-01T00:00:00+00:00")
p.add_argument("--end", default="2026-01-01T00:00:00+00:00")
p.add_argument("--fees-bp", type=float, default=5.0)
p.add_argument("--n-trials-dsr", type=int, default=50)
@@ -67,8 +94,10 @@ def parse_args() -> argparse.Namespace:
"--fitness-v2",
action="store_true",
help=(
"Attiva fitness v2: solo {no_trades, degenerate, undertrading} azzerano; "
"gli altri HIGH applicano soft penalty multiplicativa"
"Attiva fitness v2: hard-kill su {no_trades, degenerate, undertrading, "
"fees_eat_alpha, negative_net_pnl}; gli altri HIGH applicano soft penalty "
"multiplicativa. Versione hardened post 7y-overfit incident: fees + "
"net negativo non sono recuperabili."
),
)
p.add_argument(
@@ -77,6 +106,16 @@ def parse_args() -> argparse.Namespace:
default=0.4,
help="v2: fattore soft penalty per HIGH non-hard (default 0.4 → 1 HIGH → 0.71x)",
)
p.add_argument(
"--fitness-hard-kill",
type=str,
default=None,
help=(
"Override comma-separated della lista di finding name che azzerano la "
"fitness in modalita' v2. Es: 'no_trades,degenerate'. Default v2: "
"no_trades,degenerate,undertrading,fees_eat_alpha,negative_net_pnl."
),
)
p.add_argument(
"--wfa-train-split",
type=float,
@@ -188,9 +227,7 @@ def main() -> None:
fees_eat_alpha_threshold=args.fees_eat_alpha_threshold,
flat_too_long_threshold=args.flat_too_long_threshold,
undertrading_threshold=args.undertrading_threshold,
fitness_hard_kill_findings=(
("no_trades", "degenerate", "undertrading") if args.fitness_v2 else None
),
fitness_hard_kill_findings=_resolve_hard_kill(args),
fitness_adversarial_soft_penalty=args.fitness_soft_penalty,
wfa_train_split=args.wfa_train_split,
wfa_top_k=args.wfa_top_k,
+112
View File
@@ -0,0 +1,112 @@
"""Per-year breakdown delle 4 strategie: 2 NEW (BTC 238e4812 + ETH c04dff7086)
+ 2 OLD freezate (btc_9cf506b8 hardened-001 + eth_facd6af85d5d).
Backtest anno-per-anno (2019-2025) sul tick di discovery di ciascuna strategia.
Output: trade, wins/losses, win%, return%, max DD%, Sharpe per ogni anno.
"""
from __future__ import annotations
from datetime import datetime
from pathlib import Path
from multi_swarm_core.backtest.engine import BacktestEngine
from multi_swarm_core.cerbero.client import CerberoClient
from multi_swarm_core.config import load_settings
from multi_swarm_core.data.cerbero_ohlcv import CerberoOHLCVLoader, OHLCVRequest
from multi_swarm_core.metrics.basic import max_drawdown, sharpe_ratio, total_return
from multi_swarm_core.protocol.compiler import compile_strategy
from multi_swarm_core.protocol.parser import parse_strategy
STRATEGIES = [
# (label, path, symbol, timeframe)
("BTC NEW (238e4812, paper attuale)", "btc_238e4812.json", "BTC-PERPETUAL", "1h"),
("BTC OLD (9cf506b8, hardened-001 prev paper)", "archive/btc_9cf506b8.json", "BTC-PERPETUAL", "1h"),
("ETH NEW (c04dff7086, paper attuale)", "eth_c04dff7086.json", "ETH-PERPETUAL", "5m"),
("ETH OLD (facd6af85d5d, prev paper)", "archive/eth_facd6af85d5d.json", "ETH-PERPETUAL", "1h"),
]
YEARS = [
("2019", "2019-01-01T00:00:00+00:00", "2020-01-01T00:00:00+00:00"),
("2020", "2020-01-01T00:00:00+00:00", "2021-01-01T00:00:00+00:00"),
("2021", "2021-01-01T00:00:00+00:00", "2022-01-01T00:00:00+00:00"),
("2022", "2022-01-01T00:00:00+00:00", "2023-01-01T00:00:00+00:00"),
("2023", "2023-01-01T00:00:00+00:00", "2024-01-01T00:00:00+00:00"),
("2024", "2024-01-01T00:00:00+00:00", "2025-01-01T00:00:00+00:00"),
("2025", "2025-01-01T00:00:00+00:00", "2026-01-01T00:00:00+00:00"),
]
def main() -> None:
settings = load_settings()
token = (
settings.cerbero_mainnet_token.get_secret_value()
if settings.cerbero_mainnet_token
else settings.cerbero_testnet_token.get_secret_value()
)
cerbero = CerberoClient(
base_url=settings.cerbero_base_url,
token=token,
bot_tag=settings.cerbero_bot_tag,
)
loader = CerberoOHLCVLoader(client=cerbero, cache_dir=settings.series_dir)
engine = BacktestEngine(fees_bp=5.0)
strategies_dir = Path("/app/strategies")
for label, fname, symbol, timeframe in STRATEGIES:
path = strategies_dir / fname
strat = parse_strategy(path.read_text())
# Carica intero range una volta sola
ohlcv = loader.load(OHLCVRequest(
symbol=symbol, timeframe=timeframe,
start=datetime.fromisoformat("2018-09-01T00:00:00+00:00"),
end=datetime.fromisoformat("2026-01-01T00:00:00+00:00"),
))
print(f"\n{'=' * 110}")
print(f">>> {label}")
print(f" symbol={symbol} timeframe={timeframe} | {len(ohlcv)} bars total")
print(f" {'year':<6} {'bars':>6} {'trades':>7} {'wins':>5} {'losses':>7} {'win%':>6} {'avg_w':>10} {'avg_l':>10} {'ret':>8} {'maxDD':>7} {'sharpe':>7}")
sum_ret = 0.0
sum_trades = 0
sum_wins = 0
for year_label, start, end in YEARS:
mask = (ohlcv.index >= datetime.fromisoformat(start)) & (ohlcv.index < datetime.fromisoformat(end))
slice_df = ohlcv[mask]
if len(slice_df) == 0:
continue
try:
signal_fn = compile_strategy(strat)
signals = signal_fn(slice_df)
bt = engine.run(slice_df, signals)
except Exception as e:
print(f" {year_label:<6} ERROR: {e}")
continue
trades = bt.trades
n = len(trades)
wins = [t.net_pnl for t in trades if t.net_pnl > 0]
losses = [t.net_pnl for t in trades if t.net_pnl <= 0]
nw, nl = len(wins), len(losses)
wr = (nw / n * 100) if n else 0.0
aw = (sum(wins) / nw) if nw else 0.0
al = (sum(losses) / nl) if nl else 0.0
if n > 0:
notional = float(slice_df["close"].iloc[0])
eq = (bt.equity_curve / notional) + 1.0
ret = total_return(eq)
dd = max_drawdown(eq)
sr = sharpe_ratio(bt.returns, periods_per_year=8760)
else:
ret = dd = sr = 0.0
print(f" {year_label:<6} {len(slice_df):>6} {n:>7} {nw:>5} {nl:>7} {wr:>5.1f}% {aw:>10.1f} {al:>10.1f} {ret:>7.2%} {dd:>6.2%} {sr:>7.3f}")
sum_ret += ret
sum_trades += n
sum_wins += nw
overall_wr = (sum_wins / sum_trades * 100) if sum_trades else 0.0
print(f" {'='*5} TOTALS 7y: {sum_trades:>7} {sum_wins:>5} {sum_trades-sum_wins:>7} {overall_wr:>5.1f}% cum_ret={sum_ret:+.2%}")
if __name__ == "__main__":
main()
@@ -172,10 +172,11 @@ class AdversarialAgent:
)
)
# Fees-eat-alpha: gross_pnl > 0 ma fees > 50% del lordo.
# Fees-eat-alpha: gross_pnl > 0 ma fees > soglia del lordo.
# La strategia ha edge teorico ma il margine viene mangiato dai
# costi di transazione: non sostenibile in produzione.
# Se gross_pnl <= 0 il check non si applica (gia' perdente).
# Se gross_pnl <= 0 il check non si applica (la condizione e' coperta
# da ``negative_net_pnl`` sotto).
gross_pnl = sum(t.gross_pnl for t in result.trades)
total_fees = sum(t.fees for t in result.trades)
if gross_pnl > 0 and total_fees / gross_pnl > self._fees_eat_alpha_threshold:
@@ -190,4 +191,22 @@ class AdversarialAgent:
)
)
# Negative-net-pnl: somma di ``trade.net_pnl`` < 0 sul training.
# Cattura sia il caso "gross negativo" (no edge direzionale) sia il
# caso "gross positivo ma fees superiori a gross" (edge insufficiente).
# Sintesi del net-after-fees su finestra continua: deal-breaker, non
# negoziabile via soft penalty.
net_pnl = gross_pnl - total_fees
if net_pnl < 0:
report.findings.append(
Finding(
name="negative_net_pnl",
severity=Severity.HIGH,
detail=(
f"Net PnL ${net_pnl:.2f} < 0 after fees over {n_bars} bars; "
f"gross ${gross_pnl:.2f}, fees ${total_fees:.2f}"
),
)
)
return report
@@ -112,10 +112,16 @@ def run_phase1(
repo = Repository(cfg.db_path)
repo.init_schema()
# Escludi prompt_library (PromptLibrary dataclass non e' JSON-serializable);
# salva solo i nomi degli stili per reproducibility.
config_dict = {
**cfg.__dict__,
**{k: v for k, v in cfg.__dict__.items() if k != "prompt_library"},
"db_path": str(cfg.db_path),
"model_tier": cfg.model_tier.value,
"prompt_library_styles": (
list(cfg.prompt_library.cognitive_styles)
if cfg.prompt_library is not None else None
),
}
run_id = repo.create_run(name=cfg.run_name, config=config_dict)
@@ -108,7 +108,13 @@ def test_e2e_wfa_populates_fitness_oos(
fake_llm,
mocker,
):
"""WFA: train_split=0.7 → top genomi devono avere fitness_oos popolato."""
"""WFA: train_split=0.7 → top genomi devono avere fitness_oos popolato.
Usa fitness v2 con hard-kill minimale (solo no_trades): il fixture sintetico
non produce strategie profittevoli, quindi i check aggressivi
fees_eat_alpha/negative_net_pnl azzererebbero tutti i genomi rendendo
inverificabile il wiring WFA.
"""
cfg = RunConfig(
run_name="e2e-wfa-test",
population_size=5,
@@ -125,6 +131,7 @@ def test_e2e_wfa_populates_fitness_oos(
db_path=tmp_path / "runs.db",
wfa_train_split=0.7,
wfa_top_k=3,
fitness_hard_kill_findings=("no_trades",),
)
run_id = run_phase1(cfg, ohlcv=synthetic_ohlcv, llm=fake_llm)
repo = Repository(db_path=tmp_path / "runs.db")
@@ -3,7 +3,6 @@ import json
import numpy as np
import pandas as pd
import pytest
from multi_swarm_core.agents.adversarial import (
AdversarialAgent,
AdversarialReport,
@@ -54,7 +53,10 @@ def test_degenerate_always_long_flagged(ohlcv: pd.DataFrame) -> None:
assert any(f.name == "degenerate" and f.severity == Severity.HIGH for f in report.findings)
def test_no_findings_on_reasonable_strategy(ohlcv: pd.DataFrame) -> None:
def test_rsi_mean_reversion_loses_money_on_synthetic_data(ohlcv: pd.DataFrame) -> None:
"""RSI mean-reversion sul fixture sintetico ha net negativo: deve firare
negative_net_pnl (deal-breaker). Conferma che il check cattura strategie
che perdono sul training, indipendentemente dal motivo (no edge / fees)."""
src = json.dumps(
{
"rules": [
@@ -84,8 +86,59 @@ def test_no_findings_on_reasonable_strategy(ohlcv: pd.DataFrame) -> None:
ast = parse_strategy(src)
agent = AdversarialAgent()
report = agent.review(ast, ohlcv)
assert any(
f.name == "negative_net_pnl" and f.severity == Severity.HIGH
for f in report.findings
)
def test_profitable_strategy_no_high_findings(
monkeypatch: pytest.MonkeyPatch, ohlcv: pd.DataFrame
) -> None:
"""Sanity test: una strategia con gross > 0 e fees << gross + n_trades ragionevole
+ signal misto non deve produrre nessun finding HIGH."""
n = 15
# entry=100 exit=110 gross=10 per trade, fees a 5bp -> 0.105 per trade
# totali: gross=150, fees=1.575 -> net=+148.4
fake_trades = [
_make_trade(
ohlcv.index[i * 30],
ohlcv.index[i * 30 + 1],
entry_price=100.0,
exit_price=110.0,
)
for i in range(n)
]
# 50/50 LONG/FLAT per evitare degenerate/flat_too_long/time_in_market.
fake_signals = pd.Series(
[Side.LONG if i % 2 == 0 else Side.FLAT for i in range(len(ohlcv))],
index=ohlcv.index,
dtype=object,
)
def fake_run(self, ohlcv: pd.DataFrame, signals: pd.Series) -> BacktestResult: # type: ignore[no-untyped-def]
return BacktestResult(
equity_curve=pd.Series([0.0] * len(ohlcv), index=ohlcv.index, name="equity"),
returns=pd.Series([0.0] * len(ohlcv), index=ohlcv.index, name="returns"),
trades=fake_trades,
)
def fake_compile(strategy): # type: ignore[no-untyped-def]
return lambda df: fake_signals
monkeypatch.setattr(
"multi_swarm_core.agents.adversarial.BacktestEngine.run", fake_run
)
monkeypatch.setattr(
"multi_swarm_core.agents.adversarial.compile_strategy", fake_compile
)
ast = parse_strategy(_MINIMAL_STRATEGY_SRC)
report = AdversarialAgent().review(ast, ohlcv)
high_findings = [f for f in report.findings if f.severity == Severity.HIGH]
assert len(high_findings) == 0
assert high_findings == [], (
f"expected no HIGH findings, got: {[f.name for f in high_findings]}"
)
def test_zero_trade_strategy_flagged(ohlcv: pd.DataFrame) -> None:
@@ -383,6 +436,55 @@ def test_fees_eat_alpha_flagged(monkeypatch: pytest.MonkeyPatch,
)
def test_negative_net_pnl_fires_on_negative_gross(
monkeypatch: pytest.MonkeyPatch, ohlcv: pd.DataFrame
) -> None:
"""gross_pnl < 0 (perdente direzionale) -> HIGH negative_net_pnl.
fees_eat_alpha NON deve firare perche' la sua condizione richiede gross > 0.
"""
n = 15
# entry=100 exit=95 gross=-5 per trade (LONG perdente)
fake_trades = [
_make_trade(
ohlcv.index[i * 30],
ohlcv.index[i * 30 + 1],
entry_price=100.0,
exit_price=95.0,
)
for i in range(n)
]
fake_signals = pd.Series(
[Side.LONG if i % 2 == 0 else Side.FLAT for i in range(len(ohlcv))],
index=ohlcv.index,
dtype=object,
)
def fake_run(self, ohlcv, signals): # type: ignore[no-untyped-def]
return BacktestResult(
equity_curve=pd.Series([0.0] * len(ohlcv), index=ohlcv.index, name="equity"),
returns=pd.Series([0.0] * len(ohlcv), index=ohlcv.index, name="returns"),
trades=fake_trades,
)
def fake_compile(strategy): # type: ignore[no-untyped-def]
return lambda df: fake_signals
monkeypatch.setattr(
"multi_swarm_core.agents.adversarial.BacktestEngine.run", fake_run
)
monkeypatch.setattr(
"multi_swarm_core.agents.adversarial.compile_strategy", fake_compile
)
ast = parse_strategy(_MINIMAL_STRATEGY_SRC)
report = AdversarialAgent().review(ast, ohlcv)
assert any(
f.name == "negative_net_pnl" and f.severity == Severity.HIGH
for f in report.findings
)
assert not any(f.name == "fees_eat_alpha" for f in report.findings)
def test_time_in_market_too_high_flagged(monkeypatch: pytest.MonkeyPatch,
ohlcv: pd.DataFrame) -> None:
"""Signal LONG per >80% delle bar -> HIGH time_in_market_too_high."""
@@ -0,0 +1,140 @@
{
"rules": [
{
"condition": {
"op": "and",
"args": [
{
"op": "gt",
"args": [
{
"kind": "indicator",
"name": "realized_vol",
"params": [150]
},
{
"kind": "literal",
"value": 0.01
}
]
},
{
"op": "lt",
"args": [
{
"kind": "indicator",
"name": "atr_pct",
"params": [150]
},
{
"kind": "literal",
"value": 0.02
}
]
},
{
"op": "gt",
"args": [
{
"kind": "indicator",
"name": "sma_pct",
"params": [150]
},
{
"kind": "literal",
"value": 0.05
}
]
}
]
},
"action": "entry-long"
},
{
"condition": {
"op": "and",
"args": [
{
"op": "lt",
"args": [
{
"kind": "indicator",
"name": "realized_vol",
"params": [150]
},
{
"kind": "literal",
"value": 0.005
}
]
},
{
"op": "gt",
"args": [
{
"kind": "indicator",
"name": "atr_pct",
"params": [150]
},
{
"kind": "literal",
"value": 0.03
}
]
},
{
"op": "lt",
"args": [
{
"kind": "indicator",
"name": "sma_pct",
"params": [150]
},
{
"kind": "literal",
"value": -0.05
}
]
}
]
},
"action": "entry-short"
},
{
"condition": {
"op": "or",
"args": [
{
"op": "eq",
"args": [
{
"kind": "indicator",
"name": "sma_pct",
"params": [150]
},
{
"kind": "literal",
"value": 0.0
}
]
},
{
"op": "lt",
"args": [
{
"kind": "indicator",
"name": "realized_vol",
"params": [150]
},
{
"kind": "literal",
"value": 0.001
}
]
}
]
},
"action": "exit"
}
]
}
@@ -0,0 +1,84 @@
{
"rules": [
{
"condition": {
"op": "and",
"args": [
{
"op": "gt",
"args": [
{
"kind": "indicator",
"name": "realized_vol",
"params": [
150
]
},
{
"kind": "literal",
"value": 0.007
}
]
},
{
"op": "lt",
"args": [
{
"kind": "indicator",
"name": "atr_pct",
"params": [
150
]
},
{
"kind": "literal",
"value": 0.0042
}
]
}
]
},
"action": "entry-long"
},
{
"condition": {
"op": "or",
"args": [
{
"op": "crossunder",
"args": [
{
"kind": "indicator",
"name": "rsi",
"params": [
14
]
},
{
"kind": "literal",
"value": 70.0
}
]
},
{
"op": "gt",
"args": [
{
"kind": "indicator",
"name": "atr_pct",
"params": [
150
]
},
{
"kind": "literal",
"value": 0.007
}
]
}
]
},
"action": "exit"
}
]
}
@@ -0,0 +1,120 @@
{
"rules": [
{
"condition": {
"op": "and",
"args": [
{
"op": "lt",
"args": [
{
"kind": "indicator",
"name": "rsi",
"params": [
14
]
},
{
"kind": "literal",
"value": 30.0
}
]
},
{
"op": "gt",
"args": [
{
"kind": "indicator",
"name": "atr_pct",
"params": [
14
]
},
{
"kind": "literal",
"value": 0.01
}
]
},
{
"op": "lt",
"args": [
{
"kind": "indicator",
"name": "macd_pct",
"params": [
12,
26,
9
]
},
{
"kind": "literal",
"value": -0.005
}
]
}
]
},
"action": "entry-long"
},
{
"condition": {
"op": "or",
"args": [
{
"op": "gt",
"args": [
{
"kind": "indicator",
"name": "rsi",
"params": [
14
]
},
{
"kind": "literal",
"value": 70.0
}
]
},
{
"op": "lt",
"args": [
{
"kind": "indicator",
"name": "atr_pct",
"params": [
14
]
},
{
"kind": "literal",
"value": 0.005
}
]
},
{
"op": "gt",
"args": [
{
"kind": "indicator",
"name": "macd_pct",
"params": [
12,
26,
9
]
},
{
"kind": "literal",
"value": 0.005
}
]
}
]
},
"action": "exit"
}
]
}
+634
View File
@@ -0,0 +1,634 @@
{
"run_id": "0392aa1c2d644459afa5a23f43c38ac6",
"run_name": "phase1-btc-100-001",
"n_folds": 4,
"top_k_requested": 10,
"top_k_evaluated": 10,
"symbol": "BTC-PERPETUAL",
"timeframe": "1h",
"start": "2018-09-01T00:00:00+00:00",
"end": "2026-01-01T00:00:00+00:00",
"ohlcv_bars": 64297,
"results": [
{
"genome_id": "23a24989e2ed0f84",
"fitness_is": 0.25047738452013774,
"sharpe_is": 0.5152551943136504,
"folds": [
{
"fold": 0,
"fitness": 0.4454407113532186,
"sharpe": 0.940612398713799,
"dsr": 0.09856838950479485,
"dsr_pvalue": 0.9014316104952051,
"return": 0.12691347502077277,
"max_dd": 0.08467873586477132,
"n_trades": 50,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.33651846595831003,
"sharpe": 0.6297236131089199,
"dsr": 0.05704792862404472,
"dsr_pvalue": 0.9429520713759553,
"return": 0.16916039262594973,
"max_dd": 0.2420995418754207,
"n_trades": 61,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.08496628060413243,
"sharpe": -0.291593157960215,
"dsr": 0.006828013272159182,
"dsr_pvalue": 0.9931719867278408,
"return": -0.06496567446731383,
"max_dd": 0.1933746053658072,
"n_trades": 72,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.10029133262703777,
"sharpe": -0.08634860278039096,
"dsr": 0.01165220864726802,
"dsr_pvalue": 0.988347791352732,
"return": -0.007636913661893563,
"max_dd": 0.061872083556258554,
"n_trades": 29,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.2418041976356747,
"fitness_oos_min": 0.08496628060413243,
"fitness_oos_max": 0.4454407113532186,
"fitness_oos_std": 0.15416115393045135,
"sharpe_oos_mean": 0.2980985627705282,
"sharpe_oos_min": -0.291593157960215,
"robust_score": 0.08496628060413243
},
{
"genome_id": "ddda3a5d7fcf95d8",
"fitness_is": 0.24345612215631274,
"sharpe_is": 0.4859910845049414,
"folds": [
{
"fold": 0,
"fitness": 0.38630034957174436,
"sharpe": 0.6292230751631145,
"dsr": 0.05660411470808308,
"dsr_pvalue": 0.9433958852919169,
"return": 0.0808908197444953,
"max_dd": 0.08123461559976199,
"n_trades": 44,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.3444344428619903,
"sharpe": 0.670768621640302,
"dsr": 0.06172291934756436,
"dsr_pvalue": 0.9382770806524356,
"return": 0.1769344040247678,
"max_dd": 0.24038922925189188,
"n_trades": 46,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.08496628060413243,
"sharpe": -0.291593157960215,
"dsr": 0.006828013272159182,
"dsr_pvalue": 0.9931719867278408,
"return": -0.06496567446731383,
"max_dd": 0.1933746053658072,
"n_trades": 72,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.10134367585820397,
"sharpe": -0.25028965416710486,
"dsr": 0.0070613574740692985,
"dsr_pvalue": 0.9929386425259307,
"return": -0.01793962898000656,
"max_dd": 0.05380115145734951,
"n_trades": 18,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.22926118722401778,
"fitness_oos_min": 0.08496628060413243,
"fitness_oos_max": 0.38630034957174436,
"fitness_oos_std": 0.13703109785336132,
"sharpe_oos_mean": 0.18952722116902415,
"sharpe_oos_min": -0.291593157960215,
"robust_score": 0.08496628060413243
},
{
"genome_id": "75fffb926a15ff30",
"fitness_is": 0.2317839302261713,
"sharpe_is": 0.5074946608465971,
"folds": [
{
"fold": 0,
"fitness": 0.06821040478798467,
"sharpe": -0.42408026342979865,
"dsr": 0.004964388516380099,
"dsr_pvalue": 0.9950356114836199,
"return": -0.004117833402575766,
"max_dd": 0.01551842276077859,
"n_trades": 12,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.30367484453258525,
"sharpe": 0.7648008345130556,
"dsr": 0.0596988345287043,
"dsr_pvalue": 0.9403011654712957,
"return": 0.040989700605122525,
"max_dd": 0.036878373324561994,
"n_trades": 31,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.014172300674502565,
"sharpe": -1.443859476065376,
"dsr": 9.400808942425867e-05,
"dsr_pvalue": 0.9999059919105757,
"return": -0.02894431062955649,
"max_dd": 0.036019686142963456,
"n_trades": 7,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.15455497647301103,
"sharpe": 0.11384980407793575,
"dsr": 0.018924861238402986,
"dsr_pvalue": 0.981075138761597,
"return": 0.004017688385377749,
"max_dd": 0.034520559216801125,
"n_trades": 21,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.1351531316170209,
"fitness_oos_min": 0.014172300674502565,
"fitness_oos_max": 0.30367484453258525,
"fitness_oos_std": 0.1094231344810833,
"sharpe_oos_mean": -0.24732227522604583,
"sharpe_oos_min": -1.443859476065376,
"robust_score": 0.014172300674502565
},
{
"genome_id": "1cba64abfb67fd63",
"fitness_is": 0.24779915639787098,
"sharpe_is": 0.686744434641618,
"folds": [
{
"fold": 0,
"fitness": 0.23623418911693914,
"sharpe": 0.3904002210885913,
"dsr": 0.03526702699157904,
"dsr_pvalue": 0.964732973008421,
"return": 0.04525398577066886,
"max_dd": 0.09020089585606307,
"n_trades": 71,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.018226313030461766,
"sharpe": -1.287441608051841,
"dsr": 0.0005995136178100196,
"dsr_pvalue": 0.99940048638219,
"return": -0.08712458661694344,
"max_dd": 0.08774369104277313,
"n_trades": 23,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.005524367416662587,
"sharpe": -1.78701596924334,
"dsr": 2.01452172810692e-05,
"dsr_pvalue": 0.9999798547827189,
"return": -0.338652173037419,
"max_dd": 0.3725940753872713,
"n_trades": 60,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.0633884962634609,
"sharpe": -0.551177699295004,
"dsr": 0.003506443748025072,
"dsr_pvalue": 0.9964935562519749,
"return": -0.05484487559184925,
"max_dd": 0.10783012035662387,
"n_trades": 53,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.0808433414568811,
"fitness_oos_min": 0.005524367416662587,
"fitness_oos_max": 0.23623418911693914,
"fitness_oos_std": 0.09225620203631806,
"sharpe_oos_mean": -0.8088087638753985,
"sharpe_oos_min": -1.78701596924334,
"robust_score": 0.005524367416662587
},
{
"genome_id": "238e481262c1594c",
"fitness_is": 0.2604059091373716,
"sharpe_is": 0.4370965264203703,
"folds": [
{
"fold": 0,
"fitness": 0.7584616560730608,
"sharpe": 2.414722662010953,
"dsr": 0.5606058252346415,
"dsr_pvalue": 0.43939417476535847,
"return": 0.0933177386269215,
"max_dd": 0.023570677223421994,
"n_trades": 3,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.16218807661575446,
"sharpe": 0.012873968372421442,
"dsr": 0.015091968754361085,
"dsr_pvalue": 0.9849080312456389,
"return": 0.0016924869828314204,
"max_dd": 0.14842112455963283,
"n_trades": 15,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.6516189601780499,
"sharpe": 2.0590304959441346,
"dsr": 0.41524419503560983,
"dsr_pvalue": 0.5847558049643902,
"return": 0.22153641670021273,
"max_dd": 0.0736556977759442,
"n_trades": 11,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.3930671732167163,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.7584616560730608,
"fitness_oos_std": 0.3194405713707209,
"sharpe_oos_mean": 1.1216567815818772,
"sharpe_oos_min": 0.0,
"robust_score": 0.0
},
{
"genome_id": "9d484d1d7154e3d8",
"fitness_is": 0.24281082171633084,
"sharpe_is": 0.5383459590297983,
"folds": [
{
"fold": 0,
"fitness": 0.0,
"sharpe": -0.17966776746614493,
"dsr": 0.010596058628339637,
"dsr_pvalue": 0.9894039413716603,
"return": -0.00014822652679680193,
"max_dd": 0.00043372790281119014,
"n_trades": 1,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.03510752668391289,
"sharpe": -0.9516408190993537,
"dsr": 2.2816330745239768e-07,
"dsr_pvalue": 0.9999997718366925,
"return": -0.022264081410075964,
"max_dd": 0.026510937718929387,
"n_trades": 3,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.0,
"sharpe": -1.2370529718735044,
"dsr": 3.550540879152349e-10,
"dsr_pvalue": 0.9999999996449459,
"return": -0.005011777500302128,
"max_dd": 0.005011777500302128,
"n_trades": 1,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.009397695173924475,
"sharpe": -1.662121842926161,
"dsr": 6.564863915519434e-10,
"dsr_pvalue": 0.9999999993435136,
"return": -0.023018388061418094,
"max_dd": 0.02710730869264358,
"n_trades": 3,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.011126305464459342,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.03510752668391289,
"fitness_oos_std": 0.014367292814669608,
"sharpe_oos_mean": -1.0076208503412911,
"sharpe_oos_min": -1.662121842926161,
"robust_score": 0.0
},
{
"genome_id": "e1f8b425fec3b95e",
"fitness_is": 0.23502719247621787,
"sharpe_is": 0.49764640014032885,
"folds": [
{
"fold": 0,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.0,
"sharpe": -1.3160615555061568,
"dsr": 2.0480110912755528e-14,
"dsr_pvalue": 0.9999999999999796,
"return": -0.004197667464114874,
"max_dd": 0.004197667464114874,
"n_trades": 1,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.0,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.0,
"fitness_oos_std": 0.0,
"sharpe_oos_mean": -0.3290153888765392,
"sharpe_oos_min": -1.3160615555061568,
"robust_score": 0.0
},
{
"genome_id": "de4c3cce96bc6233",
"fitness_is": 0.22983732104518312,
"sharpe_is": 0.3042292766075092,
"folds": [
{
"fold": 0,
"fitness": 0.7099634427811606,
"sharpe": 2.175438924887508,
"dsr": 0.4516683289747405,
"dsr_pvalue": 0.5483316710252595,
"return": 0.05162527264229322,
"max_dd": 0.013388106636764294,
"n_trades": 5,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.11214839774268798,
"sharpe": -0.09717412830030508,
"dsr": 0.011407831629063609,
"dsr_pvalue": 0.9885921683709364,
"return": -0.010810784900084469,
"max_dd": 0.146727446687109,
"n_trades": 17,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.48948263578942797,
"sharpe": 1.2111587578615337,
"dsr": 0.15099566068576153,
"dsr_pvalue": 0.8490043393142385,
"return": 0.09392150449517889,
"max_dd": 0.09248924622174504,
"n_trades": 17,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.32789861907831913,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.7099634427811606,
"fitness_oos_std": 0.28554710047880966,
"sharpe_oos_mean": 0.8223558886121842,
"sharpe_oos_min": -0.09717412830030508,
"robust_score": 0.0
},
{
"genome_id": "14711c6816c009bb",
"fitness_is": 0.2231252597460312,
"sharpe_is": 0.5100989455793494,
"folds": [
{
"fold": 0,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.041279942400821015,
"sharpe": -0.7516739863723977,
"dsr": 0.0003109810948998818,
"dsr_pvalue": 0.9996890189051001,
"return": -0.002913092808893847,
"max_dd": 0.003336150788066372,
"n_trades": 3,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.010319985600205254,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.041279942400821015,
"fitness_oos_std": 0.017874739392934696,
"sharpe_oos_mean": -0.18791849659309942,
"sharpe_oos_min": -0.7516739863723977,
"robust_score": 0.0
},
{
"genome_id": "c7f6f7c415a8c1df",
"fitness_is": 0.2231252597460312,
"sharpe_is": 0.5100989455793494,
"folds": [
{
"fold": 0,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.041279942400821015,
"sharpe": -0.7516739863723977,
"dsr": 0.0003109810948998818,
"dsr_pvalue": 0.9996890189051001,
"return": -0.002913092808893847,
"max_dd": 0.003336150788066372,
"n_trades": 3,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.010319985600205254,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.041279942400821015,
"fitness_oos_std": 0.017874739392934696,
"sharpe_oos_mean": -0.18791849659309942,
"sharpe_oos_min": -0.7516739863723977,
"robust_score": 0.0
}
]
}
+634
View File
@@ -0,0 +1,634 @@
{
"run_id": "0392aa1c2d644459afa5a23f43c38ac6",
"run_name": "phase1-btc-100-001",
"n_folds": 4,
"top_k_requested": 10,
"top_k_evaluated": 10,
"symbol": "BTC-PERPETUAL",
"timeframe": "1h",
"start": "2018-09-01T00:00:00+00:00",
"end": "2026-01-01T00:00:00+00:00",
"ohlcv_bars": 64297,
"results": [
{
"genome_id": "23a24989e2ed0f84",
"fitness_is": 0.25047738452013774,
"sharpe_is": 0.5152551943136504,
"folds": [
{
"fold": 0,
"fitness": 0.4454407113532186,
"sharpe": 0.940612398713799,
"dsr": 0.09856838950479485,
"dsr_pvalue": 0.9014316104952051,
"return": 0.12691347502077277,
"max_dd": 0.08467873586477132,
"n_trades": 50,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.33651846595831003,
"sharpe": 0.6297236131089199,
"dsr": 0.05704792862404472,
"dsr_pvalue": 0.9429520713759553,
"return": 0.16916039262594973,
"max_dd": 0.2420995418754207,
"n_trades": 61,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.08496628060413243,
"sharpe": -0.291593157960215,
"dsr": 0.006828013272159182,
"dsr_pvalue": 0.9931719867278408,
"return": -0.06496567446731383,
"max_dd": 0.1933746053658072,
"n_trades": 72,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.10029133262703777,
"sharpe": -0.08634860278039096,
"dsr": 0.01165220864726802,
"dsr_pvalue": 0.988347791352732,
"return": -0.007636913661893563,
"max_dd": 0.061872083556258554,
"n_trades": 29,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.2418041976356747,
"fitness_oos_min": 0.08496628060413243,
"fitness_oos_max": 0.4454407113532186,
"fitness_oos_std": 0.15416115393045135,
"sharpe_oos_mean": 0.2980985627705282,
"sharpe_oos_min": -0.291593157960215,
"robust_score": 0.08496628060413243
},
{
"genome_id": "ddda3a5d7fcf95d8",
"fitness_is": 0.24345612215631274,
"sharpe_is": 0.4859910845049414,
"folds": [
{
"fold": 0,
"fitness": 0.38630034957174436,
"sharpe": 0.6292230751631145,
"dsr": 0.05660411470808308,
"dsr_pvalue": 0.9433958852919169,
"return": 0.0808908197444953,
"max_dd": 0.08123461559976199,
"n_trades": 44,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.3444344428619903,
"sharpe": 0.670768621640302,
"dsr": 0.06172291934756436,
"dsr_pvalue": 0.9382770806524356,
"return": 0.1769344040247678,
"max_dd": 0.24038922925189188,
"n_trades": 46,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.08496628060413243,
"sharpe": -0.291593157960215,
"dsr": 0.006828013272159182,
"dsr_pvalue": 0.9931719867278408,
"return": -0.06496567446731383,
"max_dd": 0.1933746053658072,
"n_trades": 72,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.10134367585820397,
"sharpe": -0.25028965416710486,
"dsr": 0.0070613574740692985,
"dsr_pvalue": 0.9929386425259307,
"return": -0.01793962898000656,
"max_dd": 0.05380115145734951,
"n_trades": 18,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.22926118722401778,
"fitness_oos_min": 0.08496628060413243,
"fitness_oos_max": 0.38630034957174436,
"fitness_oos_std": 0.13703109785336132,
"sharpe_oos_mean": 0.18952722116902415,
"sharpe_oos_min": -0.291593157960215,
"robust_score": 0.08496628060413243
},
{
"genome_id": "1cba64abfb67fd63",
"fitness_is": 0.24779915639787098,
"sharpe_is": 0.686744434641618,
"folds": [
{
"fold": 0,
"fitness": 0.23623418911693914,
"sharpe": 0.3904002210885913,
"dsr": 0.03526702699157904,
"dsr_pvalue": 0.964732973008421,
"return": 0.04525398577066886,
"max_dd": 0.09020089585606307,
"n_trades": 71,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.018226313030461766,
"sharpe": -1.287441608051841,
"dsr": 0.0005995136178100196,
"dsr_pvalue": 0.99940048638219,
"return": -0.08712458661694344,
"max_dd": 0.08774369104277313,
"n_trades": 23,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.005524367416662587,
"sharpe": -1.78701596924334,
"dsr": 2.01452172810692e-05,
"dsr_pvalue": 0.9999798547827189,
"return": -0.338652173037419,
"max_dd": 0.3725940753872713,
"n_trades": 60,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.0633884962634609,
"sharpe": -0.551177699295004,
"dsr": 0.003506443748025072,
"dsr_pvalue": 0.9964935562519749,
"return": -0.05484487559184925,
"max_dd": 0.10783012035662387,
"n_trades": 53,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.0808433414568811,
"fitness_oos_min": 0.005524367416662587,
"fitness_oos_max": 0.23623418911693914,
"fitness_oos_std": 0.09225620203631806,
"sharpe_oos_mean": -0.8088087638753985,
"sharpe_oos_min": -1.78701596924334,
"robust_score": 0.005524367416662587
},
{
"genome_id": "238e481262c1594c",
"fitness_is": 0.2604059091373716,
"sharpe_is": 0.4370965264203703,
"folds": [
{
"fold": 0,
"fitness": 0.0,
"sharpe": 2.414722662010953,
"dsr": 0.5606058252346415,
"dsr_pvalue": 0.43939417476535847,
"return": 0.0933177386269215,
"max_dd": 0.023570677223421994,
"n_trades": 3,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.16218807661575446,
"sharpe": 0.012873968372421442,
"dsr": 0.015091968754361085,
"dsr_pvalue": 0.9849080312456389,
"return": 0.0016924869828314204,
"max_dd": 0.14842112455963283,
"n_trades": 15,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.6516189601780499,
"sharpe": 2.0590304959441346,
"dsr": 0.41524419503560983,
"dsr_pvalue": 0.5847558049643902,
"return": 0.22153641670021273,
"max_dd": 0.0736556977759442,
"n_trades": 11,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.2034517591984511,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.6516189601780499,
"fitness_oos_std": 0.2670869559600687,
"sharpe_oos_mean": 1.1216567815818772,
"sharpe_oos_min": 0.0,
"robust_score": 0.0
},
{
"genome_id": "9d484d1d7154e3d8",
"fitness_is": 0.24281082171633084,
"sharpe_is": 0.5383459590297983,
"folds": [
{
"fold": 0,
"fitness": 0.0,
"sharpe": -0.17966776746614493,
"dsr": 0.010596058628339637,
"dsr_pvalue": 0.9894039413716603,
"return": -0.00014822652679680193,
"max_dd": 0.00043372790281119014,
"n_trades": 1,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.0,
"sharpe": -0.9516408190993537,
"dsr": 2.2816330745239768e-07,
"dsr_pvalue": 0.9999997718366925,
"return": -0.022264081410075964,
"max_dd": 0.026510937718929387,
"n_trades": 3,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.0,
"sharpe": -1.2370529718735044,
"dsr": 3.550540879152349e-10,
"dsr_pvalue": 0.9999999996449459,
"return": -0.005011777500302128,
"max_dd": 0.005011777500302128,
"n_trades": 1,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.0,
"sharpe": -1.662121842926161,
"dsr": 6.564863915519434e-10,
"dsr_pvalue": 0.9999999993435136,
"return": -0.023018388061418094,
"max_dd": 0.02710730869264358,
"n_trades": 3,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.0,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.0,
"fitness_oos_std": 0.0,
"sharpe_oos_mean": -1.0076208503412911,
"sharpe_oos_min": -1.662121842926161,
"robust_score": 0.0
},
{
"genome_id": "e1f8b425fec3b95e",
"fitness_is": 0.23502719247621787,
"sharpe_is": 0.49764640014032885,
"folds": [
{
"fold": 0,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.0,
"sharpe": -1.3160615555061568,
"dsr": 2.0480110912755528e-14,
"dsr_pvalue": 0.9999999999999796,
"return": -0.004197667464114874,
"max_dd": 0.004197667464114874,
"n_trades": 1,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.0,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.0,
"fitness_oos_std": 0.0,
"sharpe_oos_mean": -0.3290153888765392,
"sharpe_oos_min": -1.3160615555061568,
"robust_score": 0.0
},
{
"genome_id": "75fffb926a15ff30",
"fitness_is": 0.2317839302261713,
"sharpe_is": 0.5074946608465971,
"folds": [
{
"fold": 0,
"fitness": 0.06821040478798467,
"sharpe": -0.42408026342979865,
"dsr": 0.004964388516380099,
"dsr_pvalue": 0.9950356114836199,
"return": -0.004117833402575766,
"max_dd": 0.01551842276077859,
"n_trades": 12,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.30367484453258525,
"sharpe": 0.7648008345130556,
"dsr": 0.0596988345287043,
"dsr_pvalue": 0.9403011654712957,
"return": 0.040989700605122525,
"max_dd": 0.036878373324561994,
"n_trades": 31,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.0,
"sharpe": -1.443859476065376,
"dsr": 9.400808942425867e-05,
"dsr_pvalue": 0.9999059919105757,
"return": -0.02894431062955649,
"max_dd": 0.036019686142963456,
"n_trades": 7,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.15455497647301103,
"sharpe": 0.11384980407793575,
"dsr": 0.018924861238402986,
"dsr_pvalue": 0.981075138761597,
"return": 0.004017688385377749,
"max_dd": 0.034520559216801125,
"n_trades": 21,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.13161005644839524,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.30367484453258525,
"fitness_oos_std": 0.11343884193961566,
"sharpe_oos_mean": -0.24732227522604583,
"sharpe_oos_min": -1.443859476065376,
"robust_score": 0.0
},
{
"genome_id": "de4c3cce96bc6233",
"fitness_is": 0.22983732104518312,
"sharpe_is": 0.3042292766075092,
"folds": [
{
"fold": 0,
"fitness": 0.0,
"sharpe": 2.175438924887508,
"dsr": 0.4516683289747405,
"dsr_pvalue": 0.5483316710252595,
"return": 0.05162527264229322,
"max_dd": 0.013388106636764294,
"n_trades": 5,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.11214839774268798,
"sharpe": -0.09717412830030508,
"dsr": 0.011407831629063609,
"dsr_pvalue": 0.9885921683709364,
"return": -0.010810784900084469,
"max_dd": 0.146727446687109,
"n_trades": 17,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.48948263578942797,
"sharpe": 1.2111587578615337,
"dsr": 0.15099566068576153,
"dsr_pvalue": 0.8490043393142385,
"return": 0.09392150449517889,
"max_dd": 0.09248924622174504,
"n_trades": 17,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.150407758383029,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.48948263578942797,
"fitness_oos_std": 0.20104759307710415,
"sharpe_oos_mean": 0.8223558886121842,
"sharpe_oos_min": -0.09717412830030508,
"robust_score": 0.0
},
{
"genome_id": "14711c6816c009bb",
"fitness_is": 0.2231252597460312,
"sharpe_is": 0.5100989455793494,
"folds": [
{
"fold": 0,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.0,
"sharpe": -0.7516739863723977,
"dsr": 0.0003109810948998818,
"dsr_pvalue": 0.9996890189051001,
"return": -0.002913092808893847,
"max_dd": 0.003336150788066372,
"n_trades": 3,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.0,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.0,
"fitness_oos_std": 0.0,
"sharpe_oos_mean": -0.18791849659309942,
"sharpe_oos_min": -0.7516739863723977,
"robust_score": 0.0
},
{
"genome_id": "c7f6f7c415a8c1df",
"fitness_is": 0.2231252597460312,
"sharpe_is": 0.5100989455793494,
"folds": [
{
"fold": 0,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.0,
"sharpe": -0.7516739863723977,
"dsr": 0.0003109810948998818,
"dsr_pvalue": 0.9996890189051001,
"return": -0.002913092808893847,
"max_dd": 0.003336150788066372,
"n_trades": 3,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.0,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.0,
"fitness_oos_std": 0.0,
"sharpe_oos_mean": -0.18791849659309942,
"sharpe_oos_min": -0.7516739863723977,
"robust_score": 0.0
}
]
}
+634
View File
@@ -0,0 +1,634 @@
{
"run_id": "1b3ac5a72ade4eeca96f63af1c692529",
"run_name": "phase1-btc-100-5m-001",
"n_folds": 4,
"top_k_requested": 10,
"top_k_evaluated": 10,
"symbol": "BTC-PERPETUAL",
"timeframe": "5m",
"start": "2018-09-01T00:00:00+00:00",
"end": "2026-01-01T00:00:00+00:00",
"ohlcv_bars": 771553,
"results": [
{
"genome_id": "f8ca6642adf7e0cd",
"fitness_is": 0.18938156615467444,
"sharpe_is": 0.30869023048836236,
"folds": [
{
"fold": 0,
"fitness": 0.2352965252827188,
"sharpe": 0.3693814228315177,
"dsr": 1.683506715156222e-10,
"dsr_pvalue": 0.9999999998316493,
"return": 0.04254736022830463,
"max_dd": 0.027161767758352023,
"n_trades": 22,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:55:00+00:00"
},
{
"fold": 1,
"fitness": 0.225344374241631,
"sharpe": 0.2966596569312926,
"dsr": 1.0070583060973712e-10,
"dsr_pvalue": 0.9999999998992942,
"return": 0.0323635859324094,
"max_dd": 0.020860357367648123,
"n_trades": 4,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:55:00+00:00"
},
{
"fold": 2,
"fitness": 0.22012851949138668,
"sharpe": 0.2582559733706436,
"dsr": 6.7095779615621785e-12,
"dsr_pvalue": 0.9999999999932904,
"return": 0.024874816913196707,
"max_dd": 0.01617874217143948,
"n_trades": 6,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:55:00+00:00"
},
{
"fold": 3,
"fitness": 0.10824559047403624,
"sharpe": -0.19939596313642038,
"dsr": 4.446294307701592e-18,
"dsr_pvalue": 1.0,
"return": -0.012815761172245588,
"max_dd": 0.030585031985383666,
"n_trades": 4,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:55:00+00:00"
}
],
"fitness_oos_mean": 0.1972537523724432,
"fitness_oos_min": 0.10824559047403624,
"fitness_oos_max": 0.2352965252827188,
"fitness_oos_std": 0.05167698584229592,
"sharpe_oos_mean": 0.18122527249925838,
"sharpe_oos_min": -0.19939596313642038,
"robust_score": 0.10824559047403624
},
{
"genome_id": "44e4031ccb1dc02a",
"fitness_is": 0.22571210498548258,
"sharpe_is": 0.3821051381739021,
"folds": [
{
"fold": 0,
"fitness": 0.2750172552747618,
"sharpe": 0.6074693455147703,
"dsr": 1.1545160457503457e-26,
"dsr_pvalue": 1.0,
"return": 0.043108172266182354,
"max_dd": 0.001458755248422002,
"n_trades": 10,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:55:00+00:00"
},
{
"fold": 1,
"fitness": 0.0,
"sharpe": 0.06258366543576925,
"dsr": 2.937538417346168e-13,
"dsr_pvalue": 0.9999999999997062,
"return": 0.005830222073507807,
"max_dd": 0.020860357367648123,
"n_trades": 2,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:55:00+00:00"
},
{
"fold": 2,
"fitness": 0.18648515967821389,
"sharpe": 0.06128925460246632,
"dsr": 1.8274259811076416e-13,
"dsr_pvalue": 0.9999999999998173,
"return": 0.004414468283732154,
"max_dd": 0.01617874217143948,
"n_trades": 3,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:55:00+00:00"
},
{
"fold": 3,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:55:00+00:00"
}
],
"fitness_oos_mean": 0.11537560373824392,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.2750172552747618,
"fitness_oos_std": 0.11954610588306011,
"sharpe_oos_mean": 0.18283556638825146,
"sharpe_oos_min": 0.0,
"robust_score": 0.0
},
{
"genome_id": "662816b63c4feadf",
"fitness_is": 0.20828744896100454,
"sharpe_is": 0.20788153582834326,
"folds": [
{
"fold": 0,
"fitness": 0.0,
"sharpe": 0.09737359146830797,
"dsr": 2.4288846142332667e-14,
"dsr_pvalue": 0.9999999999999757,
"return": 0.0030306913996627216,
"max_dd": 0.007271637996670698,
"n_trades": 2,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:55:00+00:00"
},
{
"fold": 1,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:55:00+00:00"
},
{
"fold": 2,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:55:00+00:00"
},
{
"fold": 3,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:55:00+00:00"
}
],
"fitness_oos_mean": 0.0,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.0,
"fitness_oos_std": 0.0,
"sharpe_oos_mean": 0.024343397867076993,
"sharpe_oos_min": 0.0,
"robust_score": 0.0
},
{
"genome_id": "cf698463450b5daf",
"fitness_is": 0.20181196371847498,
"sharpe_is": 0.3623641433398033,
"folds": [
{
"fold": 0,
"fitness": 0.2266655258766632,
"sharpe": 0.2999909794832819,
"dsr": 6.8141661859725965e-12,
"dsr_pvalue": 0.9999999999931858,
"return": 0.018823783888960888,
"max_dd": 0.01731422516010631,
"n_trades": 4,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:55:00+00:00"
},
{
"fold": 1,
"fitness": 0.0,
"sharpe": 0.44955543499020745,
"dsr": 9.481303288744627e-40,
"dsr_pvalue": 1.0,
"return": 0.049849479597766866,
"max_dd": 0.004685656497556025,
"n_trades": 1,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:55:00+00:00"
},
{
"fold": 2,
"fitness": 0.0,
"sharpe": 0.04410712874184496,
"dsr": 4.2725586842847596e-14,
"dsr_pvalue": 0.9999999999999573,
"return": 0.004410420254631564,
"max_dd": 0.01996463311196068,
"n_trades": 2,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:55:00+00:00"
},
{
"fold": 3,
"fitness": 0.0,
"sharpe": 0.4450404801682897,
"dsr": 1.4117362531214693e-27,
"dsr_pvalue": 1.0,
"return": 0.0526088849839641,
"max_dd": 0.005792329453230141,
"n_trades": 1,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:55:00+00:00"
}
],
"fitness_oos_mean": 0.0566663814691658,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.2266655258766632,
"fitness_oos_std": 0.09814905178567468,
"sharpe_oos_mean": 0.30967350584590597,
"sharpe_oos_min": 0.04410712874184496,
"robust_score": 0.0
},
{
"genome_id": "ddbfbef72f07d76a",
"fitness_is": 0.2007403940095307,
"sharpe_is": 0.3527941850815434,
"folds": [
{
"fold": 0,
"fitness": 0.25816377963939535,
"sharpe": 0.5144509577982044,
"dsr": 8.645767195175167e-13,
"dsr_pvalue": 0.9999999999991355,
"return": 0.07304433130107668,
"max_dd": 0.01915225360494227,
"n_trades": 5,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:55:00+00:00"
},
{
"fold": 1,
"fitness": 0.0,
"sharpe": 0.44955543499020745,
"dsr": 9.481303288744627e-40,
"dsr_pvalue": 1.0,
"return": 0.049849479597766866,
"max_dd": 0.004685656497556025,
"n_trades": 1,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:55:00+00:00"
},
{
"fold": 2,
"fitness": 0.23195306903928886,
"sharpe": 0.32337815238365364,
"dsr": 8.912615856501225e-14,
"dsr_pvalue": 0.9999999999999108,
"return": 0.033935014244555584,
"max_dd": 0.010486324211451901,
"n_trades": 3,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:55:00+00:00"
},
{
"fold": 3,
"fitness": 0.0,
"sharpe": 0.35283933132790596,
"dsr": 6.658494490709348e-14,
"dsr_pvalue": 0.9999999999999334,
"return": 0.05344386510725729,
"max_dd": 0.022762761145810856,
"n_trades": 1,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:55:00+00:00"
}
],
"fitness_oos_mean": 0.12252921216967105,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.25816377963939535,
"fitness_oos_std": 0.12287913982320425,
"sharpe_oos_mean": 0.41005596912499287,
"sharpe_oos_min": 0.32337815238365364,
"robust_score": 0.0
},
{
"genome_id": "2e49f8e8e6cec686",
"fitness_is": 0.19435604112910157,
"sharpe_is": 0.3713282033185845,
"folds": [
{
"fold": 0,
"fitness": 0.26072350293525676,
"sharpe": 0.5284128848027025,
"dsr": 2.486680252274251e-13,
"dsr_pvalue": 0.9999999999997513,
"return": 0.05881454144506426,
"max_dd": 0.016516772761264658,
"n_trades": 5,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:55:00+00:00"
},
{
"fold": 1,
"fitness": 0.0,
"sharpe": 0.44955543499020745,
"dsr": 9.481303288744627e-40,
"dsr_pvalue": 1.0,
"return": 0.049849479597766866,
"max_dd": 0.004685656497556025,
"n_trades": 1,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:55:00+00:00"
},
{
"fold": 2,
"fitness": 0.21422619151698888,
"sharpe": 0.2269482258874523,
"dsr": 3.6571308232390715e-13,
"dsr_pvalue": 0.9999999999996343,
"return": 0.02568538444204793,
"max_dd": 0.019558622265454236,
"n_trades": 3,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:55:00+00:00"
},
{
"fold": 3,
"fitness": 0.0,
"sharpe": 0.4450404801682897,
"dsr": 1.4117362531214693e-27,
"dsr_pvalue": 1.0,
"return": 0.0526088849839641,
"max_dd": 0.005792329453230141,
"n_trades": 1,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:55:00+00:00"
}
],
"fitness_oos_mean": 0.11873742361306142,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.26072350293525676,
"fitness_oos_std": 0.11987003696674377,
"sharpe_oos_mean": 0.412489256462163,
"sharpe_oos_min": 0.2269482258874523,
"robust_score": 0.0
},
{
"genome_id": "9852e8e4e480ef21",
"fitness_is": 0.1922948882127238,
"sharpe_is": 0.15925760158030436,
"folds": [
{
"fold": 0,
"fitness": 0.1494822926244717,
"sharpe": 0.0804180937424291,
"dsr": 2.443102889370683e-16,
"dsr_pvalue": 0.9999999999999998,
"return": 0.0014913672331040573,
"max_dd": 0.003691144778103467,
"n_trades": 3,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:55:00+00:00"
},
{
"fold": 1,
"fitness": 0.021783719225659744,
"sharpe": -1.222169028737873,
"dsr": 2.0819357051846864e-80,
"dsr_pvalue": 1.0,
"return": -0.018262798724970497,
"max_dd": 0.018262798724970497,
"n_trades": 16,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:55:00+00:00"
},
{
"fold": 2,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:55:00+00:00"
},
{
"fold": 3,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:55:00+00:00"
}
],
"fitness_oos_mean": 0.042816502962532865,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.1494822926244717,
"fitness_oos_std": 0.06222233226062855,
"sharpe_oos_mean": -0.285437733748861,
"sharpe_oos_min": -1.222169028737873,
"robust_score": 0.0
},
{
"genome_id": "16a1761c8da604e7",
"fitness_is": 0.19121238216295305,
"sharpe_is": 0.15255013590499958,
"folds": [
{
"fold": 0,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:55:00+00:00"
},
{
"fold": 1,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:55:00+00:00"
},
{
"fold": 2,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:55:00+00:00"
},
{
"fold": 3,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:55:00+00:00"
}
],
"fitness_oos_mean": 0.0,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.0,
"fitness_oos_std": 0.0,
"sharpe_oos_mean": 0.0,
"sharpe_oos_min": 0.0,
"robust_score": 0.0
},
{
"genome_id": "add18cb7382296fd",
"fitness_is": 0.1879996666147147,
"sharpe_is": 0.28550736974923013,
"folds": [
{
"fold": 0,
"fitness": 0.0,
"sharpe": 0.0,
"dsr": 0.0,
"dsr_pvalue": 1.0,
"return": 0.0,
"max_dd": 0.0,
"n_trades": 0,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:55:00+00:00"
},
{
"fold": 1,
"fitness": 0.0,
"sharpe": 0.44955543499020745,
"dsr": 9.481303288744627e-40,
"dsr_pvalue": 1.0,
"return": 0.049849479597766866,
"max_dd": 0.004685656497556025,
"n_trades": 1,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:55:00+00:00"
},
{
"fold": 2,
"fitness": 0.0,
"sharpe": 0.150691158813143,
"dsr": 4.263193477728488e-17,
"dsr_pvalue": 1.0,
"return": 0.009379645576139906,
"max_dd": 0.008611115582095263,
"n_trades": 1,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:55:00+00:00"
},
{
"fold": 3,
"fitness": 0.0,
"sharpe": 0.46456569507517853,
"dsr": 9.733950727895419e-26,
"dsr_pvalue": 1.0,
"return": 0.056366295538783584,
"max_dd": 0.005792329453230141,
"n_trades": 1,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:55:00+00:00"
}
],
"fitness_oos_mean": 0.0,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.0,
"fitness_oos_std": 0.0,
"sharpe_oos_mean": 0.26620307221963224,
"sharpe_oos_min": 0.0,
"robust_score": 0.0
},
{
"genome_id": "4ee566eb5e132d8c",
"fitness_is": 0.18745393246665415,
"sharpe_is": 0.31006907324235156,
"folds": [
{
"fold": 0,
"fitness": 0.2166522335961314,
"sharpe": 0.23875257586420637,
"dsr": 4.3199206915491695e-12,
"dsr_pvalue": 0.9999999999956801,
"return": 0.01599067972499668,
"max_dd": 0.01736213317014228,
"n_trades": 3,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:55:00+00:00"
},
{
"fold": 1,
"fitness": 0.0,
"sharpe": 0.44955543499020745,
"dsr": 9.481303288744627e-40,
"dsr_pvalue": 1.0,
"return": 0.049849479597766866,
"max_dd": 0.004685656497556025,
"n_trades": 1,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:55:00+00:00"
},
{
"fold": 2,
"fitness": 0.0,
"sharpe": 0.04410712874184496,
"dsr": 4.2725586842847596e-14,
"dsr_pvalue": 0.9999999999999573,
"return": 0.004410420254631564,
"max_dd": 0.01996463311196068,
"n_trades": 2,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:55:00+00:00"
},
{
"fold": 3,
"fitness": 0.0,
"sharpe": 0.46456569507517853,
"dsr": 9.733950727895419e-26,
"dsr_pvalue": 1.0,
"return": 0.056366295538783584,
"max_dd": 0.005792329453230141,
"n_trades": 1,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:55:00+00:00"
}
],
"fitness_oos_mean": 0.05416305839903285,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.2166522335961314,
"fitness_oos_std": 0.09381316904044511,
"sharpe_oos_mean": 0.2992452086678593,
"sharpe_oos_min": 0.04410712874184496,
"robust_score": 0.0
}
]
}
+634
View File
@@ -0,0 +1,634 @@
{
"run_id": "e263651598894da688d95fda90a34a96",
"run_name": "phase1-extended-001",
"n_folds": 4,
"top_k_requested": 10,
"top_k_evaluated": 10,
"symbol": "BTC-PERPETUAL",
"timeframe": "1h",
"start": "2018-09-01T00:00:00+00:00",
"end": "2026-01-01T00:00:00+00:00",
"ohlcv_bars": 64297,
"results": [
{
"genome_id": "fe6e01eb690d3960",
"fitness_is": 0.3513762485888574,
"sharpe_is": 0.9011072752402621,
"folds": [
{
"fold": 0,
"fitness": 0.18429629882863333,
"sharpe": 0.18578971215949266,
"dsr": 0.022696217108110216,
"dsr_pvalue": 0.9773037828918898,
"return": 0.03138679502492736,
"max_dd": 0.19089436189057732,
"n_trades": 90,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.5261711065682141,
"sharpe": 1.875154815895858,
"dsr": 0.34945842578669783,
"dsr_pvalue": 0.6505415742133022,
"return": 0.684094224950746,
"max_dd": 0.26051011671170043,
"n_trades": 108,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.29904777517998976,
"sharpe": 0.45027968136531676,
"dsr": 0.040236883094469954,
"dsr_pvalue": 0.9597631169055301,
"return": 0.16192920610625539,
"max_dd": 0.25615601205401484,
"n_trades": 87,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.06652893772008044,
"sharpe": -0.7859068293026578,
"dsr": 0.0016949251764253048,
"dsr_pvalue": 0.9983050748235747,
"return": -0.1801701961968295,
"max_dd": 0.3050931306970407,
"n_trades": 89,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.2690110295742294,
"fitness_oos_min": 0.06652893772008044,
"fitness_oos_max": 0.5261711065682141,
"fitness_oos_std": 0.16971232602043682,
"sharpe_oos_mean": 0.43132934502950243,
"sharpe_oos_min": -0.7859068293026578,
"robust_score": 0.06652893772008044
},
{
"genome_id": "d98739b2ba8d65e8",
"fitness_is": 0.3581811122056351,
"sharpe_is": 1.5316294902683918,
"folds": [
{
"fold": 0,
"fitness": 0.03897301517910094,
"sharpe": -1.1213338499931884,
"dsr": 0.0007106609032094727,
"dsr_pvalue": 0.9992893390967905,
"return": -0.18358503193809717,
"max_dd": 0.24053109269341416,
"n_trades": 65,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.13868820192362147,
"sharpe": 0.1139203144076397,
"dsr": 0.018885390702584475,
"dsr_pvalue": 0.9811146092974156,
"return": 0.019694298831973045,
"max_dd": 0.1528666578131679,
"n_trades": 21,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.43784574830368517,
"sharpe": 1.922993791724599,
"dsr": 0.36463909799020594,
"dsr_pvalue": 0.6353609020097941,
"return": 0.31046814355338936,
"max_dd": 0.09604869735695161,
"n_trades": 48,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.377910610011883,
"sharpe": 1.3313322991701542,
"dsr": 0.17322722607861918,
"dsr_pvalue": 0.8267727739213808,
"return": 0.12021252899342505,
"max_dd": 0.04712452925993322,
"n_trades": 32,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.24835439385457264,
"fitness_oos_min": 0.03897301517910094,
"fitness_oos_max": 0.43784574830368517,
"fitness_oos_std": 0.1647414807695958,
"sharpe_oos_mean": 0.5617281388273011,
"sharpe_oos_min": -1.1213338499931884,
"robust_score": 0.03897301517910094
},
{
"genome_id": "0dd6619fdcbe37f4",
"fitness_is": 0.3765498201912705,
"sharpe_is": 0.9388498977535525,
"folds": [
{
"fold": 0,
"fitness": 0.03550929012857722,
"sharpe": -1.1093436310362703,
"dsr": 0.0005959199839818188,
"dsr_pvalue": 0.9994040800160182,
"return": -0.24600377155172415,
"max_dd": 0.38950670401585935,
"n_trades": 122,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.049414033104104804,
"sharpe": -0.9995738302518242,
"dsr": 0.0007695523975576842,
"dsr_pvalue": 0.9992304476024423,
"return": -0.15162579158457645,
"max_dd": 0.21485725923368693,
"n_trades": 79,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.4634730710112187,
"sharpe": 1.2076100738049764,
"dsr": 0.15231462029944348,
"dsr_pvalue": 0.8476853797005566,
"return": 0.3072592298707053,
"max_dd": 0.15464658494822137,
"n_trades": 153,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.1215451856323226,
"sharpe": -0.22288474503734051,
"dsr": 0.00830898358713792,
"dsr_pvalue": 0.9916910164128621,
"return": -0.035113534418310444,
"max_dd": 0.17145164314561556,
"n_trades": 74,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.16748539496905585,
"fitness_oos_min": 0.03550929012857722,
"fitness_oos_max": 0.4634730710112187,
"fitness_oos_std": 0.17398113830545858,
"sharpe_oos_mean": -0.28104803313011467,
"sharpe_oos_min": -1.1093436310362703,
"robust_score": 0.03550929012857722
},
{
"genome_id": "00545b157923dc6b",
"fitness_is": 0.34960092770407836,
"sharpe_is": 0.9785144736247469,
"folds": [
{
"fold": 0,
"fitness": 0.027180640826810924,
"sharpe": -1.26345444662059,
"dsr": 0.00030602669379661417,
"dsr_pvalue": 0.9996939733062034,
"return": -0.2411006699210636,
"max_dd": 0.36676673786660746,
"n_trades": 79,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.5208756815430423,
"sharpe": 1.770946043023605,
"dsr": 0.3128216779179025,
"dsr_pvalue": 0.6871783220820975,
"return": 0.60240576625387,
"max_dd": 0.2331907909757441,
"n_trades": 45,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.2959791903863346,
"sharpe": 0.3683437692731339,
"dsr": 0.033871432018897314,
"dsr_pvalue": 0.9661285679811027,
"return": 0.134452978611995,
"max_dd": 0.19964940601028408,
"n_trades": 58,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.15883382666451054,
"sharpe": 0.031160944245222175,
"dsr": 0.015769276637227145,
"dsr_pvalue": 0.9842307233627728,
"return": 0.006899603676653765,
"max_dd": 0.1947452948903118,
"n_trades": 36,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.2507173348551746,
"fitness_oos_min": 0.027180640826810924,
"fitness_oos_max": 0.5208756815430423,
"fitness_oos_std": 0.1826508968673572,
"sharpe_oos_mean": 0.2267490774803428,
"sharpe_oos_min": -1.26345444662059,
"robust_score": 0.027180640826810924
},
{
"genome_id": "eea882db55f8dd5e",
"fitness_is": 0.3181543783162782,
"sharpe_is": 1.3214317725559044,
"folds": [
{
"fold": 0,
"fitness": 0.02689139923003529,
"sharpe": -1.3020990219857191,
"dsr": 0.00036878360260577075,
"dsr_pvalue": 0.9996312163973943,
"return": -0.22280992288117984,
"max_dd": 0.28735423155244094,
"n_trades": 69,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.1064185213723357,
"sharpe": -0.3110958507357913,
"dsr": 0.006879713400940769,
"dsr_pvalue": 0.9931202865990593,
"return": -0.057958925555868235,
"max_dd": 0.19529025657454543,
"n_trades": 33,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.37938211463073945,
"sharpe": 1.490827385000592,
"dsr": 0.2224878866287407,
"dsr_pvalue": 0.7775121133712593,
"return": 0.2563445845249124,
"max_dd": 0.1053935530975972,
"n_trades": 59,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.4175480977898098,
"sharpe": 1.6336803280087653,
"dsr": 0.260079721684657,
"dsr_pvalue": 0.739920278315343,
"return": 0.157201259896103,
"max_dd": 0.04639072483391873,
"n_trades": 43,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.23256003325573005,
"fitness_oos_min": 0.02689139923003529,
"fitness_oos_max": 0.4175480977898098,
"fitness_oos_std": 0.16881097094204098,
"sharpe_oos_mean": 0.3778282100719617,
"sharpe_oos_min": -1.3020990219857191,
"robust_score": 0.02689139923003529
},
{
"genome_id": "24a3e592397d4bda",
"fitness_is": 0.3181543783162782,
"sharpe_is": 1.3214317725559044,
"folds": [
{
"fold": 0,
"fitness": 0.02689139923003529,
"sharpe": -1.3020990219857191,
"dsr": 0.00036878360260577075,
"dsr_pvalue": 0.9996312163973943,
"return": -0.22280992288117984,
"max_dd": 0.28735423155244094,
"n_trades": 69,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.1064185213723357,
"sharpe": -0.3110958507357913,
"dsr": 0.006879713400940769,
"dsr_pvalue": 0.9931202865990593,
"return": -0.057958925555868235,
"max_dd": 0.19529025657454543,
"n_trades": 33,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.37938211463073945,
"sharpe": 1.490827385000592,
"dsr": 0.2224878866287407,
"dsr_pvalue": 0.7775121133712593,
"return": 0.2563445845249124,
"max_dd": 0.1053935530975972,
"n_trades": 59,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.4175480977898098,
"sharpe": 1.6336803280087653,
"dsr": 0.260079721684657,
"dsr_pvalue": 0.739920278315343,
"return": 0.157201259896103,
"max_dd": 0.04639072483391873,
"n_trades": 43,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.23256003325573005,
"fitness_oos_min": 0.02689139923003529,
"fitness_oos_max": 0.4175480977898098,
"fitness_oos_std": 0.16881097094204098,
"sharpe_oos_mean": 0.3778282100719617,
"sharpe_oos_min": -1.3020990219857191,
"robust_score": 0.02689139923003529
},
{
"genome_id": "7d6636945c3fdee5",
"fitness_is": 0.4143633094822953,
"sharpe_is": 1.0518304581395579,
"folds": [
{
"fold": 0,
"fitness": 0.024065408548587387,
"sharpe": -1.362275778196952,
"dsr": 0.0002459819911643212,
"dsr_pvalue": 0.9997540180088357,
"return": -0.27317643202118824,
"max_dd": 0.283710961847723,
"n_trades": 76,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.10523269843210308,
"sharpe": -0.32050989428963983,
"dsr": 0.006397259401103736,
"dsr_pvalue": 0.9936027405988963,
"return": -0.058925951660568465,
"max_dd": 0.19264026914858506,
"n_trades": 115,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.37331175980311637,
"sharpe": 0.6268880704230287,
"dsr": 0.05821057212982157,
"dsr_pvalue": 0.9417894278701784,
"return": 0.13285431586579133,
"max_dd": 0.11992643530986899,
"n_trades": 66,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.058003508089270274,
"sharpe": -0.9065054278150867,
"dsr": 0.0011919907667399207,
"dsr_pvalue": 0.9988080092332601,
"return": -0.11553575296643481,
"max_dd": 0.21946607715577302,
"n_trades": 108,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.14015334371826926,
"fitness_oos_min": 0.024065408548587387,
"fitness_oos_max": 0.37331175980311637,
"fitness_oos_std": 0.13766562991922562,
"sharpe_oos_mean": -0.4906007574696624,
"sharpe_oos_min": -1.362275778196952,
"robust_score": 0.024065408548587387
},
{
"genome_id": "94413564f2f6c03e",
"fitness_is": 0.4504680245893446,
"sharpe_is": 1.931509193896414,
"folds": [
{
"fold": 0,
"fitness": 0.1454684156938894,
"sharpe": -0.1847503153026734,
"dsr": 0.010432618759993285,
"dsr_pvalue": 0.9895673812400068,
"return": -0.006041376713751601,
"max_dd": 0.028928093840880797,
"n_trades": 10,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.0,
"sharpe": 0.7414755036663777,
"dsr": 0.032908166066855475,
"dsr_pvalue": 0.9670918339331446,
"return": 0.024390796509991652,
"max_dd": 0.01848789755136504,
"n_trades": 3,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.6298210284045589,
"sharpe": 2.8227093941852077,
"dsr": 0.783195485997482,
"dsr_pvalue": 0.216804514002518,
"return": 0.1153800539734966,
"max_dd": 0.009172322853563938,
"n_trades": 13,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.0,
"sharpe": -0.3705731110916588,
"dsr": 0.005298299731142135,
"dsr_pvalue": 0.9947017002688578,
"return": -0.01618834464316521,
"max_dd": 0.050704690156295765,
"n_trades": 8,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.1938223610246121,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.6298210284045589,
"fitness_oos_std": 0.2586344704657744,
"sharpe_oos_mean": 0.7522153678643133,
"sharpe_oos_min": -0.3705731110916588,
"robust_score": 0.0
},
{
"genome_id": "9deb48ad9a1d6a01",
"fitness_is": 0.38499883511982724,
"sharpe_is": 1.7309660717184492,
"folds": [
{
"fold": 0,
"fitness": 0.11865902601061347,
"sharpe": -0.33840465028379796,
"dsr": 0.006577366557928182,
"dsr_pvalue": 0.9934226334420718,
"return": -0.012941050841296264,
"max_dd": 0.03402877313520886,
"n_trades": 17,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.0,
"sharpe": 0.5508017623316874,
"dsr": 0.028490827818300125,
"dsr_pvalue": 0.9715091721816999,
"return": 0.01831303651843519,
"max_dd": 0.017308885097101046,
"n_trades": 7,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.0,
"sharpe": 2.1433702644761987,
"dsr": 0.4071948898247041,
"dsr_pvalue": 0.5928051101752959,
"return": 0.10827348451282881,
"max_dd": 0.008755897100329497,
"n_trades": 8,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.0,
"sharpe": 1.0955591683486918,
"dsr": 0.07909942404164044,
"dsr_pvalue": 0.9209005759583595,
"return": 0.01372945300669004,
"max_dd": 0.006329669977511941,
"n_trades": 5,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.029664756502653367,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.11865902601061347,
"fitness_oos_std": 0.05138086545675487,
"sharpe_oos_mean": 0.862831636218195,
"sharpe_oos_min": -0.33840465028379796,
"robust_score": 0.0
},
{
"genome_id": "1bb0f36ae3f178ae",
"fitness_is": 0.3289012666358953,
"sharpe_is": 1.2144322416340778,
"folds": [
{
"fold": 0,
"fitness": 0.03325222099260249,
"sharpe": -1.0706470661093082,
"dsr": 0.0007248785745670455,
"dsr_pvalue": 0.999275121425433,
"return": -0.09901039935604483,
"max_dd": 0.13711458096989376,
"n_trades": 27,
"test_start": "2022-05-02 12:00:00+00:00",
"test_end": "2023-04-02 08:00:00+00:00"
},
{
"fold": 1,
"fitness": 0.0,
"sharpe": 0.12138335573748249,
"dsr": 0.018713173174332784,
"dsr_pvalue": 0.9812868268256673,
"return": 0.00555346714044469,
"max_dd": 0.02724874190208475,
"n_trades": 7,
"test_start": "2023-04-02 09:00:00+00:00",
"test_end": "2024-03-02 05:00:00+00:00"
},
{
"fold": 2,
"fitness": 0.32995249837249846,
"sharpe": 0.9733164430116448,
"dsr": 0.07297295015940324,
"dsr_pvalue": 0.9270270498405968,
"return": 0.05047188141942249,
"max_dd": 0.02617799182077058,
"n_trades": 13,
"test_start": "2024-03-02 06:00:00+00:00",
"test_end": "2025-01-31 02:00:00+00:00"
},
{
"fold": 3,
"fitness": 0.0,
"sharpe": 1.3421850442772436,
"dsr": 0.05521595540810741,
"dsr_pvalue": 0.9447840445918926,
"return": 0.06121506651714692,
"max_dd": 0.00995276327591354,
"n_trades": 3,
"test_start": "2025-01-31 03:00:00+00:00",
"test_end": "2025-12-31 23:00:00+00:00"
}
],
"fitness_oos_mean": 0.09080117984127524,
"fitness_oos_min": 0.0,
"fitness_oos_max": 0.32995249837249846,
"fitness_oos_std": 0.13873981434768828,
"sharpe_oos_mean": 0.34155944422926565,
"sharpe_oos_min": -1.0706470661093082,
"robust_score": 0.0
}
]
}