diff --git a/scripts/analyze_btc_winners.py b/scripts/analyze_btc_winners.py new file mode 100644 index 0000000..3d8b6a4 --- /dev/null +++ b/scripts/analyze_btc_winners.py @@ -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() diff --git a/scripts/compare_winners.py b/scripts/compare_winners.py new file mode 100644 index 0000000..5b890aa --- /dev/null +++ b/scripts/compare_winners.py @@ -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() diff --git a/state/validation-btc-100-001-thr3.json b/state/validation-btc-100-001-thr3.json new file mode 100644 index 0000000..6c35e37 --- /dev/null +++ b/state/validation-btc-100-001-thr3.json @@ -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 + } + ] +} \ No newline at end of file diff --git a/state/validation-btc-100-001.json b/state/validation-btc-100-001.json new file mode 100644 index 0000000..95fe943 --- /dev/null +++ b/state/validation-btc-100-001.json @@ -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 + } + ] +} \ No newline at end of file diff --git a/state/validation-btc-100-5m-thr3.json b/state/validation-btc-100-5m-thr3.json new file mode 100644 index 0000000..95f13ed --- /dev/null +++ b/state/validation-btc-100-5m-thr3.json @@ -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 + } + ] +} \ No newline at end of file