import pandas as pd import xgboost as xgb import joblib import os TIME_MODEL_FILE = "time_model.pkl" def prepare_time_features(df): """ Génère la Target. Les features (Lags, Momentum, Volume) sont DÉJÀ calculées par app.py ! """ df = df.copy() # 🎯 Target (Ce qu'on veut prédire : la prochaine bougie sera-t-elle verte ?) # 1 = Hausse, 0 = Baisse df['target'] = (df['close'].shift(-1) > df['close']).astype(int) # Nettoyage de la toute dernière ligne (qui n'a pas encore de futur) df = df.dropna() # Les colonnes que XGBoost va regarder features = [ 'return_1h', 'return_3h', 'return_12h', 'RSI_lag1', 'RSI_lag2', 'vol_lag1', 'VOL_RATIO' ] return df[features], df['target'] def train_time_model(df): """ Entraîne le modèle XGBoost. Ultra-rapide, optimisé pour les 4 threads de ton processeur ! """ print("⏳ [V9] Entraînement du Time Engine (XGBoost) en cours...") X, y = prepare_time_features(df) # Paramétrage Quant : # max_depth=4 (pour ne pas overfitter le bruit de la crypto) # n_jobs=-1 (utilise 100% du CPU dispo) model = xgb.XGBClassifier( n_estimators=100, max_depth=4, learning_rate=0.05, objective='binary:logistic', eval_metric='logloss', n_jobs=-1, random_state=42 ) model.fit(X, y) joblib.dump(model, TIME_MODEL_FILE) print("✅ [V9] Time Engine sauvegardé avec succès ! Ton CPU te remercie.") return model def load_time_model(): """Charge le modèle depuis le disque.""" if os.path.exists(TIME_MODEL_FILE): return joblib.load(TIME_MODEL_FILE) return None def predict_time(model, df): """ Prédit la probabilité de hausse pour la bougie actuelle. """ features = [ 'return_1h', 'return_3h', 'return_12h', 'RSI_lag1', 'RSI_lag2', 'vol_lag1', 'VOL_RATIO' ] # On isole la toute dernière ligne du marché last_row = df[features].iloc[[-1]] # predict_proba renvoie [prob_baisse, prob_hausse]. On veut la hausse (indice 1) prob_hausse = model.predict_proba(last_row)[0][1] return prob_hausse