from __future__ import annotations import argparse from datetime import datetime from multi_swarm.config import load_settings from multi_swarm.data.ohlcv_loader import OHLCVLoader, OHLCVRequest from multi_swarm.genome.hypothesis import ModelTier from multi_swarm.llm.client import LLMClient from multi_swarm.orchestrator.run import RunConfig, run_phase1 def parse_args() -> argparse.Namespace: p = argparse.ArgumentParser(description="Multi-Swarm Phase 1 runner") p.add_argument("--name", default="phase1-spike-001") p.add_argument("--population-size", type=int, default=20) p.add_argument("--n-generations", type=int, default=10) p.add_argument("--elite-k", type=int, default=2) p.add_argument("--tournament-k", type=int, default=3) p.add_argument("--p-crossover", type=float, default=0.5) p.add_argument("--seed", type=int, default=42) p.add_argument("--symbol", default="BTC/USDT") p.add_argument("--timeframe", default="1h") p.add_argument("--start", default="2024-01-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) return p.parse_args() def main() -> None: args = parse_args() settings = load_settings() loader = OHLCVLoader(cache_dir=settings.series_dir) req = OHLCVRequest( symbol=args.symbol, timeframe=args.timeframe, start=datetime.fromisoformat(args.start), end=datetime.fromisoformat(args.end), ) ohlcv = loader.load(req) print(f"OHLCV loaded: {len(ohlcv)} bars from {ohlcv.index[0]} to {ohlcv.index[-1]}") llm = LLMClient( openrouter_api_key=settings.openrouter_api_key.get_secret_value(), anthropic_api_key=( settings.anthropic_api_key.get_secret_value() if settings.anthropic_api_key else None ), model_tier_s=settings.llm_model_tier_s, model_tier_a=settings.llm_model_tier_a, model_tier_b=settings.llm_model_tier_b, model_tier_c=settings.llm_model_tier_c, model_tier_d=settings.llm_model_tier_d, openrouter_base_url=settings.openrouter_base_url, ) cfg = RunConfig( run_name=args.name, population_size=args.population_size, n_generations=args.n_generations, elite_k=args.elite_k, tournament_k=args.tournament_k, p_crossover=args.p_crossover, seed=args.seed, model_tier=ModelTier.C, symbol=args.symbol, timeframe=args.timeframe, fees_bp=args.fees_bp, n_trials_dsr=args.n_trials_dsr, db_path=settings.db_path, ) run_id = run_phase1(cfg, ohlcv=ohlcv, llm=llm) print(f"Run completed: {run_id}") if __name__ == "__main__": main()