"""CLI for data download phase.""" import click from datetime import date from pipeline.data.downloader import download_minute_universe, download_universe @click.group(name="data") def data(): """Download and manage market data.""" @data.command("download") @click.option( "--universe", default="csi500", help="Which universe: hs300, csi500, all (~5000 A-shares), file path, or comma-separated symbols", ) @click.option("--start-date", default="2017-01-01", help="Start date YYYY-MM-DD") @click.option("--end-date", default=str(date.today()), help="End date YYYY-MM-DD") @click.option("--output-dir", default="data/daily_bars", help="Root for the partitioned dataset") @click.option("--symbols", default=0, type=int, help="Max symbols (0=all)") @click.option("--chunk-size", default=300, type=int, help="Symbols per durability flush") @click.option("--adjust", default="qfq", help="Price adjust: qfq, hfq, or none") def download(universe, start_date, end_date, output_dir, symbols, chunk_size, adjust): """Download daily bars into a month-partitioned parquet dataset. Writes ``{output_dir}/{universe}/month=YYYY-MM/*.pq``. Point ``alpha compute --data-path`` at that dataset directory. """ stats = download_universe( universe=universe, start_date=start_date, end_date=end_date, output_dir=output_dir, max_symbols=symbols, chunk_size=chunk_size, adjust=adjust, ) click.echo( f"\nSummary: {stats['n_symbols']}/{stats['n_requested']} symbols, " f"{stats['n_rows']:,} bars, {stats['date_min']} → {stats['date_max']}" ) click.echo(f"Dataset: {stats['dataset_path']}") @data.command("download-minute") @click.option( "--universe", default="csi500", help="Which universe: hs300, csi500, all (~5000 A-shares), file path, or comma-separated symbols", ) @click.option("--start-date", default="2017-01-01", help="Start date YYYY-MM-DD") @click.option("--end-date", default=str(date.today()), help="End date YYYY-MM-DD") @click.option("--output-dir", default="data/minute_bars", help="Root for the partitioned dataset") @click.option("--symbols", default=0, type=int, help="Max symbols (0=all)") @click.option("--chunk-size", default=100, type=int, help="Symbols per durability flush") @click.option("--frequency", default="5", help="Minute frequency: 5, 15, 30, or 60") def download_minute(universe, start_date, end_date, output_dir, symbols, chunk_size, frequency): """Download raw Baostock minute bars into a partitioned parquet dataset. Writes ``{output_dir}/{universe}/frequency=5m/month=YYYY-MM/*.pq`` for the default 5-minute frequency. """ stats = download_minute_universe( universe=universe, start_date=start_date, end_date=end_date, output_dir=output_dir, max_symbols=symbols, chunk_size=chunk_size, frequency=frequency, ) click.echo( f"\nSummary: {stats['n_symbols']}/{stats['n_requested']} symbols, " f"{stats['n_rows']:,} bars, {stats['date_min']} → {stats['date_max']}, " f"frequency={stats['frequency']}" ) click.echo(f"Dataset: {stats['dataset_path']}")