Spaces:
Sleeping
Sleeping
File size: 2,241 Bytes
a0b1c59 447a4ac a0b1c59 447a4ac a0b1c59 447a4ac a0b1c59 447a4ac a0b1c59 447a4ac a0b1c59 447a4ac a0b1c59 447a4ac a0b1c59 c3cbd65 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | 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 |