# train_autogluon.py from autogluon.timeseries import TimeSeriesPredictor, TimeSeriesDataFrame from utils_vol import fetch_close_series, realized_vol, rv_to_autogluon_df def train_bolt_small( ticker="AAPL", start="2015-01-01", interval="1d", prediction_length=30, time_limit=900, # Sekunden (15 Min). Bei Bedarf anpassen. ): """ Trainiert Chronos-Bolt-Small auf CPU via AutoGluon mit CPU-freundlichen Limits. Explizite Business-Day-Frequenz ('B') verhindert Frequency-Fehler. """ print(f"[AutoFT] Lade {ticker} ...") close = fetch_close_series(ticker, start=start, interval=interval) rv = realized_vol(close) # tidy DataFrame: columns = item_id, timestamp, target df = rv_to_autogluon_df(rv) # TimeSeriesDataFrame mit expliziter Frequenz erzeugen tsdf = TimeSeriesDataFrame.from_data_frame( df, id_column="item_id", timestamp_column="timestamp", # KEIN target_column-Argument in AG 1.4.0 – 'target' wird implizit erkannt freq="B", ) # auf reguläres Business-Day-Gitter bringen (Lücken = NaN) tsdf = tsdf.convert_frequency("B") predictor = TimeSeriesPredictor( path="/mnt/data/AutogluonChronosBoltSmall", prediction_length=prediction_length, eval_metric="WQL", freq="B", verbosity=2, ) predictor.fit( train_data=tsdf, enable_ensemble=False, num_val_windows=1, hyperparameters={ "Chronos": { "model_path": "autogluon/chronos-bolt-small", "fine_tune": True, "fine_tune_steps": 200, # klein halten für CPU "fine_tune_lr": 1e-4, "context_length": 128, # klein halten für CPU "quantile_levels": [0.1, 0.5, 0.9], } }, time_limit=time_limit, # harter Cap, damit HF nicht timeoutet ) print("✅ Training abgeschlossen. Modellpfad:", predictor.path) return predictor