"""Train a baseline next-period stock direction model from exported features.""" from __future__ import annotations import argparse import logging from pathlib import Path import sys from kag.logging import configure_logging from kag.modeling.direction_model import train_direction_model DEFAULT_DATASET_PATH = Path("data/processed/training_features.csv") DEFAULT_MODEL_PATH = Path("models/direction_model.joblib") DEFAULT_METRICS_PATH = Path("models/direction_model_metrics.json") logger = logging.getLogger(__name__) def parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--dataset", type=Path, default=DEFAULT_DATASET_PATH) parser.add_argument("--model-output", type=Path, default=DEFAULT_MODEL_PATH) parser.add_argument("--metrics-output", type=Path, default=DEFAULT_METRICS_PATH) parser.add_argument("--test-size", type=float, default=0.2) parser.add_argument("--random-state", type=int, default=42) parser.add_argument( "--no-lightgbm", action="store_true", help="Use the sklearn fallback model even when LightGBM is installed.", ) return parser.parse_args() def main() -> int: args = parse_args() configure_logging() try: result = train_direction_model( args.dataset, model_path=args.model_output, metrics_path=args.metrics_output, test_size=args.test_size, random_state=args.random_state, prefer_lightgbm=not args.no_lightgbm, ) except Exception: logger.exception("Direction model training failed") return 1 logger.info( "Direction model training succeeded; model_type=%s train_rows=%s test_rows=%s metrics=%s", result.model_type, result.train_rows, result.test_rows, result.metrics, ) logger.info("Saved model=%s metrics=%s", result.model_path, result.metrics_path) return 0 if __name__ == "__main__": sys.exit(main())