"""CLI for alpha combination.""" import os import click from pipeline.combo.combine import combine_alphas, COMBO_METHODS @click.group(name="combo") def combo(): """Combine multiple alphas into a single combined weight.""" @combo.command("combine") @click.option( "--alpha-paths", required=True, help="Comma-separated paths to alpha parquet files", ) @click.option("--combo-name", required=True, help="Name for this combo") @click.option( "--method", default="equal_weight", type=click.Choice(list(COMBO_METHODS.keys())), help="Combination method", ) @click.option("--output-dir", default="combos", help="Directory to save combo parquet") def combine(alpha_paths, combo_name, method, output_dir): """Combine multiple alphas and save as parquet.""" paths = [p.strip() for p in alpha_paths.split(",") if p.strip()] if len(paths) < 2: click.echo("Error: --alpha-paths requires at least 2 comma-separated paths", err=True) return result = combine_alphas( alpha_paths=paths, combo_name=combo_name, method=method, ) os.makedirs(output_dir, exist_ok=True) out_path = f"{output_dir}/{combo_name}.pq" result.to_parquet(out_path, index=False) click.echo(f"Saved combo: {out_path} ({len(result):,} rows)") click.echo( f"Weight stats — min: {result['weight'].min():.4f}, " f"max: {result['weight'].max():.4f}, " f"mean: {result['weight'].mean():.4f}" )