Spaces:
Sleeping
Sleeping
| 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 |